本次作業要求:https://edu.cnblogs.com/campus/hljkj/Cprogramming_2018Autumn_CST2018_3/homework/2503
函數 6-1統計各位數字
1 #include <stdio.h> 2 3 int Count_Digit ( const int N, const int D ); 4 5 int main() 6 { 7 int N, D; 8 9 scanf("%d %d", &N, &D); 10 printf("%d\n", Count_Digit(N, D)); 11 return 0; 12 } 13 14 int Count_Digit( const int N,const int D ){ 15 int i,count = 0; 16 int s = N; 17 if(N < 0){ 18 s = -N; 19 } 20 if(s==0){ 21 if(D==0){ 22 count = 1; 23 }else{ 24 count = 0; 25 } 26 }while(s%10>0||s/10 != 0){ 27 if(s%10==D){ 28 count++; 29 } 30 s = s/10; 31 } 32 return count; 33 }

第一步,首先調用函數count-Digit()引入i,並且將count附初始值為零,將n的值賦給s,目的使數據變為正數。’
第二步,如果使某數為零,那么查找該數中的零的個數就為一,反之個數為零。
第三部,每次對該數除以十再去和十取余確定該數中的其他數要查的個數。
第四部,返回count。

首先看這個錯誤代碼,我后來才發現將count打成了const,因為調用函數時,當時很着急,可能就馬虎了,不小心將count達成了const,最后導致的錯誤。
對於這種錯誤,下次一定會注意。也要多敲一些代碼去鞏固。
2.求一組數中的最大值和次最大值
1 #include<stdio.h> 2 int main() 3 { 4 int i,a[10]; 5 int max=0,cmax=0; 6 for(i=0;i<10;i++) 7 { 8 scanf("%d",&a[i]); 9 if(max<a[i]) 10 { 11 cmax=max; 12 max=a[i]; 13 }if(cmax<a[i]) 14 { 15 cmax=a[i]; 16 } 17 } 18 printf("max=%d,cmax=%d",max,cmax); 19 return 0; 20 }


第一步,首先聲明變量i做循環,引入一個數組含有十個元素,定義max,cmax,將他們初始化為第一個數,也就是假定第一個數為要取的數。
第二步,依次將數組里的每個數附值,取地址。
第三步,將所選的每個數依次和max作比較,如果大於max 將max值賦給cmax,將所選的數賦給max,之后將剩余的其他的數和次大值進行比較如果比次大值大,將該數賦給次大值。
第四步,依次輸出最大值和次大值。
首先,看我所打的代碼,顯示是一處錯誤,可實則為兩處,第一處是n沒有定義,就引入了循環中,應該是10,或者在前面定義一個n,這樣才可以用n做循環變量,第二個我的錯誤是沒有顯示出來的,就是編譯沒錯誤,但是如果運行出來錯誤就明顯了,不符合題意,也是源於自己對程序的不了解吧,正常情況下在下面cmax<a[i-1]那段,應該打成cmax<a【i】,我之前一直以為,為了使次大值和剩余的數進行比較,應該是i-1,可不知道的是這道題就不用強調剩余的數了,因為正確答案的意思,已經是比完最大值之后剩余的數和次大值進行比較了,所以不用強調。
3.簡化的插入排序
1 #include<stdio.h> 2 int main() 3 { 4 int N,x; 5 scanf("%d",&N); 6 int a[10]; 7 int i; 8 for(i=0;i<N;i++) 9 {scanf("%d",&a[i]); 10 } 11 scanf("%d",&x); 12 for(i=0;i<N;i++) 13 { 14 if(a[i]>x) 15 { 16 printf("%d ",x); 17 break; 18 }else{ 19 printf("%d ",a[i]); 20 } 21 }if(i==N) 22 { 23 printf("%d ",x); 24 } 25 else{ 26 for(;i<N;i++){ 27 printf("%d ",a[i]); 28 } 29 } 30 return 0; 31 }




第一步,定義個數n,和要插入的數x,引入含有一個十個元素的數組,定義循環變量i,之后對數組里每個元素依次取地址賦值,之后對要插入的數取地址賦值。
第二步,進入for循環中,如果數組里每個值都大於要插入的值,那么將x這個數落下來,之后跳出這個循環,否則按以前的順序輸出數組里小於這個數的其他數。
第三步,如果最后一個位置是你要插入的數話,還得另做考慮,直接落下來。
首先自己的錯誤有三處,我認為,后兩處的錯誤簡直是太馬虎了,第二個圖的錯誤就是我正常情況下應該在最后一個if前面再加上一個括號,但是我忘打了,還有第三個圖那個錯誤其實之前也犯過很多次,而且每次我都沒記性,都找了很久才找出來,就是標點符號一定要注意,必須是英文的形式,而我打成了中文的形式。好,那現在轉過頭來再說說第一個錯誤,可能是對代碼的第一印象吧,我總是將那個for()循環定義成(i=0;i<n;i++)但這道題並不是那個意思,他最后應該讓你把那個剩下的數落下來,而如果將i=0,最后 寫入式子的話,就說明從第一個數進行,而不是將剩下的數落下來。還有就是我最初忘了想要插入的這個數是最后一位的情況,但這也是我的室友教我的,剛開始沒反應過來,因為 如果要插入的數如果按升序排列的話,如果這個數比任何數都大,就得放在最后一位,但是我之前打的那些情況,沒包含這種情況。所以得在下面說明這種情況if(i==n)時。
為了解決這類情況就得多敲,因為現在也是剛剛理解,入門,底子實在是太薄,而且也要善於向別人虛心學習,有的時候別人的方法會給你很多思路,所以我覺得這點很重要。
總結:通過這幾天的學習,逐漸理解了什么是數組,如何引用數組,使用數組的時候也應該定義數組,理解了什么是二維數組,以及二維數組使用
數組是一些具有相同類型數據的集合,數組中的數據按照一定的順序排列存放。同一數組中的每個元素都具有相同的數據類型,有統一的標識符即數組名,用不同的序號即下標來區分數組中的元素。
引用數組前首先要定義數組,數組元素的使用方法與同類型的變量完全相同。例如:int k,a【10】;定義了整形變量k和整形數組。在可以使用整形變量的任何地方,都可以使用整形數組a的元素、例如:
k=3;
a[0]=23;
a[k-2]=a[0]+1;scanf("%d",&a[9]);
scanf("%d",&a[9]);
一維數組的初始化,就是對數組中的每個數依次附初始值,如果靜態數組沒有初始化,系統自動給所有的元素賦值為零。即static int b【5】;等價於static int b[5]={0,0,0,0,0};數組的初始化也可以針對部分元素,例如:static int b【5】={1,2,3};即對數組中的前三個數附了初始值其余都為零。
而二維數組和一維數組也是類似的。例如:int a【3】【2】;定義一個二維數組a,3行兩列,共六個元素,引用二維數組要指定兩個下標,即行下標和列下標,形式為數組名【行下標】【列下標】
二維數組的初始化也可以只針對部分元素,例如static int b 【4】【3】={{1,2,3,},{},{4,5}};只對b數組的第零行的全部元素和第二行的前兩個元素賦初值,其余元素的初值都為零。
問題:對於一些定義新變量,對這個變量取地址我還是有一點懵,首先是我不明白為什么一定要用到這個變量的時候才可以對他取地址,而如果目前用不到的話,目前只能夠定義它,不能夠對他進行取地址,這是我想了很久也沒有明白的。
收貨:我覺得我的能力應該提高了不少,因為在這之前還是根本看不明白代碼,現在能夠讀懂了一些,以后還是需要去多敲,多練,多向厲害的人學習,這樣才能夠進步。還有我覺得章宇楠同學的流程圖做的很厲害,我到現在還是不怎么會做流程圖,只是能夠理解代碼是什么意思,而不能夠運用流程圖去給他說清楚,所以還需要多理解,多與大家溝通,去學習,還有就是對於我上面那個問題其實我請教了室友,只有用的時候,才可以去賦值,用不到先不能對他進行取地址賦值。


孫凱同學https://www.cnblogs.com/sunkai6815618/p/10134556.html
章宇楠同學 https://www.cnblogs.com/zyn-66/p/10145222.html
梁德輝同學https://www.cnblogs.com/wsaldh/p/10127051.html
