C語言第五次博客作業


一、PTA實驗作業

題目1:6-6 使用函數輸出水仙花數

1. 本題PTA提交列表

2. 設計思路

  • (1) 首先先定義narcissistic函數。
  • (2)定義四個整形變量n,a,d,cnt,sum,cnt用來計算有幾位數,sum用來存放每個數的cnt次方的和。
  • (3)進行一個循環,讓n=number(防止后面需要用number時它的值發生變化),循環中n=n/10,直到
    n<=0結束循環,其中每次循環cnt值都加一,用來計算number有幾位數。
  • (4)再進行一個for循環(讓a=number;直到a不>0;a/=10)
    在循環中d=a%10;sum=sum+pow(d,cnt);這部是讓每個位數的cnt次方進行相加。
  • (5)這里在進行一個判斷,如果nunber=sum則說明這個數是水仙花數,則return 1;
    否則就return 0;
  • (6)再進行void PrintN( int m, int n )函數的定義。
  • (7)定義一個變量i 用來進行循環
  • (8)for(i=m+1;i<n;i++)做循環讓它輸出這個范圍內的水仙花數。
    因為在這個區間里的水仙花數不能取m和n,所以給i定義的初值為m+1,
    限定條件為i<n。
  • (9)if( narcissistic(i) )調用上一個函數 ,判斷i是否為水仙花數
    printf("%d",i);printf("\n")如果是輸出這個數,並換行。

3.本題調試過程碰到問題及PTA提交列表情況說明

  • (1)當時在編譯這題時,一開始就打算用cnt 來計算number的值。
    可是在做題目時一直根據題目給的值153,就把在第4步時把那個cnt輸成了3
    結果一直導致部分正確。

其中大於三位數后水仙花數就輸不出來

  • (2)還有一個問題就是在判斷完它是水仙花數后不知道要怎樣返回這個值。
    后開嘗試用了下return 1就可以了,運氣有些好。

題目2:6-8 使用函數輸出指定范圍內的Fibonacci數

1. 本題PTA提交列表

2. 設計思路

  • (1)int fib( int n )首先定義fib函數
  • (2)int a=1,b=1,i.定義三個整形變量(因為題目所給的內容,a,b的初始值都為1,i是后面用來做循環
  • (3) if(n1 || n2)return 1;如果n=1,n=2時Fibonacci數都為1
  • (4)for(i=3;i<=n;)再進行一個循環,令i=3直到i>n時結束循環。
  • (5) a=a+b;i=i+1;b=b+a;i++;這樣就能夠讓前面兩個數的值相加成第三個數。
  • (6)如果n為奇數則就return a的值
  • (7)為偶數就輸出偶數的值
  • (8)void PrintFN( int m, int n )再進行void PrintFN函數的定義
  • (9)int cnt=0,i,j定義三個整形變量i,j,用來進行循環,cnt 是用來判斷這個區間內是否有Fibonacci數
  • (10)for(i=1;fib(i)<=n;i++) if(fib(i)>=m) printf("%d",fib(i))讓每一個Fibonacci數都與m進行比較
  • (11)如果fib(i)>=m,就說明這個Fibonacci數在區間內,則輸出fib(i)
  • (12)if(fib(i+1)<=n) printf(" ");在區間內最后一個Fibonacci數前輸入“——”滿足行末沒有空格。
    並且在這個if語句中讓cnt=1
  • (13)再循環外進行一個判斷語句如果cnt=0則輸出No Fibonacci number。

3.本題調試過程碰到問題及PTA提交列表情況說明

對於行末不能保留空格一開始沒有注意到,所以只在其為空集時正確了

於是我在輸出空格前進行了一次判斷,如果fib(i+1)<n則說明這個數是區間內倒數第二個數,那么在下一個數的后面就不要再輸出空格。
可是,還有錯誤就是兩端點都是F數,測試超過區間的fib不滿足條件

所以我就再看了下題目題目中如果m,n是Fibonacci數那么他也是需要輸出的。所以在)if(fib(i+1)<n)中加了一個=。就滿足條件。

題目1:6-7 使用函數輸出指定范圍內的完數

1. 本題PTA提交列表

2. 設計思路

本題要求實現一個計算整數因子和的簡單函數

  • (1)int factorsum( int number )定義這個函數來判斷一個數是否為函數
  • (2)int i,sum=0;定義sum用來存放因子相加后的值
  • (3)if(number==1) return 1;因為1是一定滿足有有點特殊,首先拿出來考慮
  • (4) for(i=1;i<number;i++) if(number%i==0) sum=sum+i;進行一個循環在<n的范圍內而不能=n,
    所以1是有點特殊,后面一個判斷語句是將i的因子全部相加。
  • (5)if(sum==number)則說明這個數是完數,那么就return sum.否則return 0;
  • (6)void PrintPN( int m, int n )在進行這個函數的定義
  • (7)int i,j,a=1。i,j是用來進行循環,a是用來判斷區間內是否有完數
    -(8)for(i=m;i<=n;i++) if(factorsum(i) == i)則說明這個數是完數,則printf("%d = 1",i) 因為任何完數都會等於1+多少。
    -(9)for(j=2;j<i;j++)在進行一個循環 if(i%j==0)這個是用來判斷i的因子,如果是則printf(" + %d",j)
  • (10)然后在j循環外printf("\n")換行。並使a=0
  • (11)進行一個判斷if(a==1)就printf("No perfect number")

3.本題調試過程碰到問題及PTA提交列表情況說明

這道題的難點在於 完數 = 因子1 + 因子2 + ... + 因子k 這個格式的輸出怎樣才能讓它正確輸出因子的同時,又正確的輸出+與空格。
經過觀察每個數必有因子1," + %d",j 在以這樣的格式一個個輸出,我一開始是在每個數的后面加空格,這樣導致行末出現空格,
后來經過一個同學的提點,把空格放在+的前面這樣就不會在行末出現空格。

行末出現空格

二、同學代碼結對互評

2.我的代碼、互評同學代碼截圖

我的代碼!

int fib( int n )
{
	int a=1,b=1,i;
	if(n==1 || n==2){//如果n=1,2時F數都為1
		return 1;
	}
	for(i=3;i<=n;){
		a=a+b;//讓前兩個數相加得到一個新的數
		i=i+1;
		b=b+a;
		i++;
	}
	if(n%2==0){//判斷奇偶數
		return b;
	}
	else{
		return a;
	}
}
void PrintFN( int m, int n )
{
	int cnt=0,i,j;
	for(i=1;fib(i)<=n;i++){
		if(fib(i)>=m){
			printf("%d",fib(i));
			if(fib(i+1)<=n){
			  printf(" ");
			}
			cnt=1;
		} 
	}
	if(cnt==0){
		printf("No Fibonacci number");
	}
}

黃炳煒的代碼

int fib( int n )
{
	int result=0,i,a=1,b=1;
	if(n==1)return 1;
	for(i=2;i<=n;i++)
	{
		result=b;
		b=b+a;
		a=result;
	}
	return result;
}

void PrintFN( int m, int n )
{
   int f,i,flag=0,c=0;//f放完數,i控制循環,利用flag判斷是否有完數,c,判斷是否為第一個數 
   for(i=1;i<=100;i++)
   {
   	f=fib(i);
    if(f>=m&&f<=n)//完數在所給范圍內 
	{
		c++;
		flag=1;
		if(f==1&&m==1&&i==1)//起始點為1比較特殊,直接輸出1 
       {
    	printf("1");
    	continue;
	   }
	   if(c==1)//第一個數前面沒有空格,所以單獨輸出 
	   {
	   	printf("%d",f);
	   	continue;
	   }
	   
    printf(" %d",f);
    flag=1;
	}
    
   }
   if(flag==0)//沒有完數,則flag還是為0,輸出。 
        printf("No Fibonacci number");
}

3.我和同學代碼不同在哪里?有哪些各自優勢?你更喜歡哪種代碼風格?如果同學代碼有錯的也請幫忙指出來哪里出問題

不同點:我和炳煒同學在定義fib函數的做法不一樣,我是讓n從三開始進行循環a=a+b,i++,b=b+a,i++當n為奇數時其F數再a上,
偶數時F數再b上。
而炳煒同學是在定義一個變量來存放fib數,result=b; b=b+a; a=result它的循環是從2開始先讓result=b,每次都讓b=b+a,又再將a=result
這樣同樣巧妙的將前兩個數的和放到了result上
優勢:1:我的代碼在一步的循環中就能計算多個F數,剪短了循環的時間,並且我不用多定義一個變量也節省了空間。
而,炳煒同學的代碼比較精煉,不需要在后面做判斷,直接返回result,而我的有兩個出口。
2:在第二個函數上,我覺得我的優勢會更大,在第一個循環我結束的條件是fib(i)<=n而炳煒同學i<=100,這樣 它循環的次數就會更多,時間更長。
然后為了避免在行末輸出空格if(fib(i+1)<=n) printf(" ");我是來找nm 區間內的倒數第二個數,而他是讓第一個數單獨輸出,還要多設計一個數來判斷區間內的第一個數
總之,它的代碼使用的空間和時間都用的比我多。
所以,我會更喜歡我自己的代碼。

三、截圖本周題目集的PTA最后排名。

四、本周學習總結

1.你學會了什么?

  • (1)short、int、long、char、float、double 這六個關鍵字代表C 語言里的六種基本數據類型。這周對這些數據類型更深入的進行了學習。
  • (2)字符型數據可以與整型通用,例如: 10+'a'+1.5-8765.1234 *'b' 是合法的.

2.本周的內容,你還不會什么?

答:本周還學習了運算符的優先級以及結合性,,還有前綴自增和后綴自增的區別,最重要的是對位運算有了一定的了解,
還有就是學會了怎樣將字符的大小寫進行替換。

2.本周的內容,你還不會什么?

本周的內容其實我對於,運算符的優先級還是不太清楚,太多了有些混亂,在加上結合性,就更亂了。
還有就是對自增和自減還沒有領會。

3.循環結構考試總結

1.哪題做錯了,怎么改?

我在二進制的前導的零,這道題目中有一些小錯誤就是當值為1的時候答案是錯的,1情況比較特殊,可以多設計一個判斷條件出來
單獨分析即可。
然后就是在最后一題的單詞長度那題,暫時沒有什么思路容我在想想。

2.考試結果滿意么,怎么改進?

不滿意,一些小細節的地方還是沒有注意,效率還是不夠高,導致最后一題都沒有多少時間去認真思考。
還是需要多加練習,勤能補拙,多與同學老師交流。


免責聲明!

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



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