C語言第五次作業——循環結構


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; 
    }

錯誤信息 1:

錯誤原因 :
for括號中前倆個只能是分號而不是逗號

改正方法:
把括號里面的逗號改成分號,把括號外面的分號去掉。

編譯正確,繼續運行:

錯誤信息 2:

錯誤原因:
輸出結果不正確,回頭發現for后面缺少了倆個大括號“{}”。

錯誤信息 3:

錯誤原因:
加入了大括號{}還是和上一個錯誤一樣,輸出結果不正確。判斷是輸出的時候出現了問題。

改正方法:
把%3.0f, %6.1f改成%d和%:1f。

錯誤信息 4:

錯誤原因:

應該把 “/9”放在后面,下面的是給出的正確的計算公式。

改正方法:
把公式按照格式來寫。

錯誤信息 5:

錯誤原因:
輸出的組距多出來了,循環應該是+2而不是+1。

改正方法:把fahr++改成fahr+=2。

輸入樣例2: 40 30

符合結果,給出正確的源程序

#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 +=2) 
        {
        	celsius = 5* (fahr - 32.0)/9; 
            printf("%d %.1f\n", fahr, celsius); 
		}
            
       return 0; 
    }

(二)學習總結

  • 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; 
}

第一步:定義變量i,num,odd,even

第二步:賦值odd = 0

第三步:賦值even = 0

第四步:定義i = 1

第五步:運行i<=10

第六步:輸入num

第七步:判斷是否 num % 2 == 0

第八步:運行even加1,或者odd加1

第九步:運行i++

第十步:判斷是否i<=10

第十一步:輸入sum

第十二步:判斷是否 num % 2 == 0

第十三步:運行even加1,或者odd加1

.    
.
.

最后一步:i=11,判斷i>10,然后輸出even和odd的結果

功能:實現10個數的奇數偶數分類
  • 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; 
}


運行結果:


運行結果:

增量運算符在單獨使用時沒有影響。

(2)

#include <stdio.h>
int main()
{    
    int i,j;
    i = 2;
    j = 2;  
    printf("%d\n",i++);
    printf("%d\n",++j);     
    return 0; 
}

運行結果:

最后的結果是:i=2,j=3。i++為后綴的形式,先執行的是輸出i=2,然后再執行i ++,所以輸出的是i=2;++j為前綴,先執行j=2,j+1,然后再執行輸出,所以輸出的結果是j=3。這說明前綴和后綴在語句里面的時候所表達的含義是不同的,當它們單獨使用時沒有區別,所以在我們用的時候我們要注意是在語句里面還是在語句外面。
  • 3 循環語句后面有{}是否有影響?
#include <stdio.h>
int main()
{    
    int i;
    for(i = 1;i <= 5;i++)
        printf("*");
    printf("\n");   
    return 0; 
}

運行結果:

#include <stdio.h>
int main()
{    
    int i;
    for(i = 1;i <= 5;i++)
        printf("*");
        printf("\n");   
    return 0; 
}

運行結果:

#include <stdio.h>
int main()
{    
    int i;
    for(i = 1;i <= 5;i++)
    {
        printf("*");
        printf("\n");
    }
    return 0; 
}

運行結果:

#include <stdio.h>
int main()
{    
    int i;
    for(i = 1;i <= 5;i++)
    {
        printf("*");
    } 
    printf("\n");
    return 0; 
}

運行結果:

1,2,4輸出的一行5,而3輸出的是一列5,但是1,2屬於一類for后面沒有{},3,4屬於一類for后面有{}。
為什么會有不同的結果,這是因為跟{}有關,3輸出一列的5 *是因為在大括號里面有循環,並且輸出換行在括號里面,所以每輸入一次就換一次行;而4則與3不同的地方就是輸出換行在括號外面,所以每次輸入就存在了里面,最后直接輸出的是一行5 *。
1和2在縮格上面不同,但是輸出的結果一樣;1和4都輸出了5 *,則證明循環體的判定與縮格沒有關系,而與大括號{}有關系。3和4是正確的縮進格式。
所以在我們判斷的時候我們要看for后面有沒有大括號在進行運行。
  • 4 其他總結:
1.在進行逗號運算的時候要從左往右一次運算。
2.循環語句的控制條件是break和continue;break只能終止並跳出最近一層的結構。
break只能用於循環語句和switch語句中。
在循環語句中,break語句一般都是與if語句一起使用。
continue語句只結束本次循環,而不是終止整個循環的執行。
3.無限循環中,通過在循環體中加break語句對循環進行控制。

(三)實驗總結

(1)題目

7-1求奇數分之一序列前N項和:

(2)流程圖

(3)源代碼
#include <stdio.h>
int main()
{
    int denominator, i, N;
    double item, sum;
    while (scanf("%d", &N) != EOF)
    {
        denominator = 1;
        sum = 0;
        for (i = 1; i <= N; i++)
        {
            item = 1.0/denominator;
            sum = sum+item;
            denominator = denominator+2;
        }
        printf("sum = %f\n", sum);
    }
    return 0;
}
(4)實驗分析

問題1:輸出的結果不相等。

原因:item為浮點型,而這樣輸出的整型所以不相等。

解決辦法:把1改成1.0,或者在denominator前面加double()。

(5)本題PTA提交列表

(1)題目

7-3奇偶分家

(2)流程圖

(3)源代碼
#include <stdio.h>
int main(void)
{
   int N,i,n,a = 0,b = 0;
   scanf("%d",&n);
   for(i = 0;i < n;i++)
   {
     scanf("%d",&N); 
     if(N % 2 == 0)
     {
       a++;
     }
     else
     {
       b++;
     }
 
   }
   printf("%d %d",b,a);
   return 0; 
}
(4)實驗分析

問題1:在寫流程圖的時候碰到輸入0的時候就直接退出。

原因:賦值為"n"和"N",但是它倆代表的是同一個值,所以輸入0的時候不能判斷是賦給誰,最后就按照第一個來輸出。

解決辦法:第二個變量賦值成別的字母就可以了。

(5)本題PTA提交列表

(1)題目

7-5 統計字符

(2)流程圖

(3)源代碼
#include<stdio.h>
int main()
{
  char str[10];
    int i=0,letter=0,blank=0,digit=0,other=0;
    while(i<10)
    {
      str[i++]=getchar();
    }
    for(i=0;i<10;i++)
    {
        if(str[i]==' ')
        {
          blank++;
        }
        else if(str[i]=='\n')
        {
          blank++;
        }
        else if(str[i]>='0'&&str[i]<='9')
        {
          digit++;
        }
        else if(str[i]>='A'&&str[i]<='Z')
        {
          letter++;
        }
        else if(str[i]>='a'&&str[i]<='z')
        {
          letter++;
        }
        else 
        {
          other++;
        }
    }
  printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other);
  return 0;
}
(4)實驗分析

在統計字符的時候我們要用到循環里面的鑲嵌,我們既可以用字母來表示也可以用asllc碼來表示但是建議用字母來表示這樣好記。在實驗過程中遇到問題就是多注意注意細節,比如:' '英文半角單引號。

(5)本題PTA提交列表

(1)題目

7-7 求交錯序列前N項和

(2)流程圖

(3)源代碼
#include <stdio.h>
int main(void)
{
	int n;
	while(scanf("%d",&n)!=EOF)
   {
		int i;
		double j,k;  /*j分母,i分子*/ 
		double sum=1; /*sum表示總和*/ 
		j=1;
	for(i=2;i<=n;i++)
	{
	if(i%2==0)
	{
		j+=2;
		k=-i/j;
	}	
	else
	{
		j+=2;
		k=i/j;
	}
	sum+=k;
    }
	printf("%.3f\n",sum);
   }
   return 0;	
}
(4)實驗分析

在我們求交錯序列前N項和的時候,我們要注意一正一負,所以要在循環的時候用(-1)的n-1次冪來求比較好。例如:

k=(-1)^(n-1)/j
(5)本題PTA提交列表

(四)博客互評

(1) 針對陳魔的博客園:
(1).首先打開界面是比較醒眼的,因為文字比較大還有截圖,這樣可以看的很
清楚,但是我覺得如果截圖都弄那么大整體看就不整齊了。
(2).建議你源代碼用Markdowwn的形式來寫,這樣看起來就比較好看而且知道縮格的形式,也能夠練習一下寫程序注意的點。
(3).總體內容完整,值得我么學習,希望我們能夠一起交流。
(2)針對孤寂一粒沙的博客園:
(1).建議你在循環是否和{}有影響的那道題,寫完源程序然后配上結果圖這樣更明了。
在增量運算符那道題應該把輸出的結果截圖下來,你這樣輸入倆個數容易被別人看的時候漏掉。
(2).流程圖比較模糊。
實驗分析的時候應該把部分正確詳細的寫出來,別人不知道你哪兒不正確,應該寫出來大家一起交流。
(3).博客互評應該寫出你評論了誰,只給一個鏈接不知道是誰。總體挺好但是需要改善。
(3)針對曲兒說的博客園:
(1).整體看起來不錯,格式整齊,內容完整,值得我們學習。
但是,有些格式需要改正,就像運行結果1和后面附一張圖片需要空一行,這樣就會漢字在圖片上方,這樣看起來就整齊了。
(2).學習總結這一塊總結的很好,值得我學習,尤其是如何運算的步驟寫的很詳細希望我們能夠一起交流學習。

^ - ^歡迎大家來評論我的博客園!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM