C語言程序設計第五次作業——循環結構(1)
(一)改錯題
輸出華氏攝氏溫度轉換表:輸入兩個整數lower和upper,輸出一張華氏攝氏溫度轉換表,華氏溫度的取值範圍是{lower,upper},每次增加2℉。計算公式如下:
c = 5×(f-32)/9
其中,c表示攝氏溫度,f表示華氏溫度。
輸入輸出樣例1:
Enter lower:32
Enter upper:35
fahr celsius
32 0.0
34 1.1
輸入輸出樣例2:
Enter lower:40
Enter upper:30
fahr celsius
源程序(有錯誤的程序)
#include <stdio.h>
int main(void)
{
int fahr , lower, upper; /* fahr表示華氏度 */
double celsius; /* celsius表示攝氏度 */
printf("Enter lower:");
scanf("%d",&lower);
printf("Enter upper:");
scanf("%d",&upper);
printf("fahr celsius\n"); /* 顯示表頭 */
/* 溫度轉換 */
for (fahr = lower , fahr <= upper, fahr ++) ;
celsius = 5 /9 * (fahr - 32.0);
printf("%3.0f %6.1f\n", fahr, celsius);
return 0;
}
對源程序進行編譯,采用每次修改第一個錯誤並重新編譯的方法,記錄每個錯誤的錯誤信息、分析錯誤原因並給出正確的語句。
錯誤一
for後邊不加逗號
改正方法:將逗號刪去
錯誤二
for後小括號的語句應用分號隔開
改正方法 將括號裏的逗號改成分號
錯誤三
for後邊的語句體沒有加括號
改正方法:將for後的語句體用花括號括起來
錯誤四
fahr為整形變量 應用%d celsius應為一位小數
改正方法:printf("%d %.1f\n", fahr, celsius);
錯誤五
每次循環只加1
改正方法:
錯誤六
計算公式錯誤
改正方法:
(二)學習總結
1.有如下程序:
#include <stdio.h>
int main()
{
int i,num,odd,even;
odd = 0;
even = 0;
for(i = 1; i <= 10;i++)
{
scanf("%d",&num);
if(num % 2 == 0)
{
even++;
}
else
{
odd++;
}
}
printf("%d %d",even,odd);
return 0;
}
詳細描述程序的執行過程,即說明程序的每一步是執行的哪條代碼,執行順序如何。循環需描述前兩次循環和最後一次循環的詳細執行過程。最後說明程序實現的功能是什麽。
執行步驟:
1.定義整型變量
2.給odd和even賦初始值0
3.執行for語句
(1)執行i=1;
(2)輸入num
(3)執行if語句,若為真,則執行even++;若為假,則執行odd++
(4)進行for循環,當i=2時,執行(2)(3)
(5)再進行for循環,直到i=11時,不符合for循環的條件,輸出even和odd的值
程序實驗的功能:
輸入十個整數,判斷十個整數中有幾個偶數,幾個奇數
2.增量運算符
(1)運行下面程序,結果是什麽?增量運算符在單獨使用時,前綴和後綴形式有區別嗎?
#include <stdio.h>
int main()
{
int i,j;
i = 2;
j = 2;
i++;
++j;
printf("i = %d\n",i);
printf("j = %d\n",j);
return 0;
}
增量運算符在單獨使用時,i++是先執行其他語句再加1;++j是先加1再執行其他語句
(2)運行下面的程序,結果是什麽?兩條輸出語句的執行過程是怎樣的?說明什麽問題?這兩條輸出語句執行完後,i和j的值分別是多少?
#include <stdio.h>
int main()
{
int i,j;
i = 2;
j = 2;
printf("%d\n",i++);
printf("%d\n",++j);
return 0;
}
運行結果:
執行過程:
1.執行整型定義
2.執行i=2,j=2;
3.輸出i的值
4.執行i++;
5.執行++j,將j的值加1
6.輸出j
說明的問題:
i++是賦值,再加1;++j是先加1,再去賦值
兩條輸出語句執行完後,i和j的值都是3
3.有些循環語句後面有{},有些沒有,有些語句有縮進,運行下面的四個小程序,運行結果有什麽不同?循環體的認定與縮格形式是否有關?與{}是否有關?那麽,應該如何正確判斷一個循環語句中的循環體?下面的程序中,哪幾種格式是正確的縮進格式。
(1)
#include <stdio.h>
int main()
{
int i;
for(i = 1;i <= 5;i++)
printf("*");
printf("\n");
return 0;
}
運行結果:
(2)
#include <stdio.h>
int main()
{
int i;
for(i = 1;i <= 5;i++)
printf("*");
printf("\n");
return 0;
}
運行結果:
(3)
#include <stdio.h>
int main()
{
int i;
for(i = 1;i <= 5;i++)
{
printf("*");
printf("\n");
}
return 0;
}
運行結果:
(4)
#include <stdio.h>
int main()
{
int i;
for(i = 1;i <= 5;i++)
{
printf("*");
}
printf("\n");
return 0;
}
運行結果:
(1)(2)的運行結果相同,所以循環體的認定與縮格形式無關;(3)(4)的運行結果不同,(3)(4)程序中{}裏的內容也不一樣,而循環結構執行的是{}中的內容,所以循環體的認定與{}有關。
如果一個循環語句後面加了{},那麽這個語句循環體為{}裏面的內容,如果循環語句後面沒有加{},那麽循環體語句為循環語句後的第一條語句。
(1)(3)(4)是正確的
(2)是錯誤的
7-2 統計學生平均成績與及格人數(10 分)
#include<stdio.h>
int main()
{
int n,x=0,i;
double a[10001],sum=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%lf",&a[i]);
if(a[i]>=60) x++;
sum+=a[i];
}
if(n==0) printf("average = 0.0\n");
else printf("average = %.1f\n",sum/n);
printf("count = %d\n",x);
return 0;
}
7-4 到底是不是太胖了(15 分)
#include<stdio.h>
#include<math.h>
struct student{
int sg,tz;
double bz;
}stu[20];
int main(){
int num,i;
double c;
scanf("%d",&num);
for(i=0;i<num;i++){
scanf("%d %d",&stu[i].sg,&stu[i].tz);
stu[i].bz=0;
}
for(i=0;i<num;i++){
stu[i].bz=(stu[i].sg-100)*0.9;
c=stu[i].bz-(double)stu[i].tz/2.0;
if(stu[i].bz*0.1>fabs(c)){
printf("You are wan mei!\n");
}
if(c>0&&stu[i].bz*0.1<=fabs(c)){
printf("You are tai shou le!\n");
}
if(c<0&&stu[i].bz*0.1<=fabs(c)){
printf("You are tai pang le!\n");
}
}
return 0;
}
7-6 統計學生成績(10 分)
#include<stdio.h>
int main(void)
{
int N;
int i,x;
int a=0,b=0,c=0,d=0,e=0;
while(scanf("%d",&N)!=EOF){
for(i=0;i<N;i++){
scanf("%d",&x);
if(x>=90){
a++;
}else if(x>=80){
b++;
}else if(x>=70){
c++;
}else if(x>=60){
d++;
}else{
e++;
}
}
printf("%d %d %d %d %d\n",a,b,c,d,e);
}
return 0;
}
7-8 找出最小值(10 分)
#include<stdio.h>
int main(void)
{
int n,i,l,min;
scanf("%d",&n);
scanf("%d",&l);
min=l;
for(i=1;i<n;i++){
scanf("%d",&l);
if(min>l)
min=l;
}
printf("min = %d",min);
return 0;
}
C語言程序設計第五次作業——循環結構(1)