日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

C语言(初遍学的一些零乱笔记)

發(fā)布時(shí)間:2023/12/19 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言(初遍学的一些零乱笔记) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
#include <stdio.h>int main() {xxx; return 0; }

本課中所有的程序都需要這一段,直到學(xué)函數(shù)之前,我們的代碼都只是在這個(gè)框架中間,也就是xxx的位置。

? 做事情的句子之后必須有分號(hào),不過(guò)換行無(wú)所謂,在C里面,換行/空格不代表任何。

printf("%d",12+34); printf("12+34=%d",12+34) #%d 說(shuō)明后面有一個(gè)整數(shù)要輸出在這個(gè)位置上int price; int amount; int price,amount;scanf("%d",&price)const int AMOUT=100; #后期不能被賦值修改 int price=0; int change=AMOUNT-price;

條件判斷

//如果符合括號(hào)里的條件,就做,不符合就不會(huì)做了//常規(guī)形式 if(im<0){im+=60;ih--; }else{xxx }//如果沒(méi)有大括號(hào),那么只有緊跟在它后面的那一句是有效的 //(好的編程習(xí)慣)建議是要加大括號(hào)的,因?yàn)閑lse的歸屬情況是,嚴(yán)格遵循就近原則(即使有時(shí)候不再符合縮進(jìn)),所以加上大括號(hào)會(huì)更加明了一些 if(im<0)im+=60; elsexxx;//if嵌套 int a,b,c; scanf("%d %d %d",&a,&b,&c);int max=0; if(a>b){if(a>c){max=a}else{max=c} }else{if(b>c){max=b}else{max=c} } printf("The max is %d\n",max);

我有一個(gè)問(wèn)題:為什么print f那個(gè)引號(hào)里面最后的地方要加個(gè)\n呢??都有什么句子必須加呢??

//多路分支 switch(type) { case 1: case 2:printf("hhh\n");break; //加了break就跳出 case 3:printf("ggg\n"); //沒(méi)加break會(huì)繼續(xù)進(jìn)行4 case 4:printf("kkk\n");break; //以上幾個(gè)數(shù)字都沒(méi)出現(xiàn),則執(zhí)行default后面的語(yǔ)句 default:printf("a\n");break; }//有時(shí)候劃分范圍的問(wèn)題,可以取其中的十位數(shù)/百位數(shù)那種(方法就是那個(gè)除并取整),然后轉(zhuǎn)化為數(shù)字多分類問(wèn)題

循環(huán)

//普通while循環(huán) int x; int n=0; scanf("%d",&x);n++; x/=10; while(x>0){n++;x/=10; } printf("%d\n",n);//do-while循環(huán) /*在進(jìn)入循環(huán)的時(shí)候不做檢查,而是在執(zhí)行完一輪循環(huán)體的代碼之后,再來(lái)檢查循環(huán)的條件是否滿足,如果滿足則繼續(xù)下一輪的循環(huán),不滿足則結(jié)束循環(huán)*/int x; int n=0; scanf("%d",&x); do{x/=10;n++; }while(x>0); printf("%d\n",n);//for循環(huán) int count=1; /*常用套路:若是乘積,則初始化為1,若是加和,則初始化為0*/ int i; for(i=10;i>1;i--){count*=i; } /*完全等同于以下while循環(huán)*/ int i; while(i>1){count*=i;i--; } /*這種一般是用于n需要保住這個(gè)值,后面可能還會(huì)用到的情況*/ int n=10; int i; for(i=n;i>1;i--){count*=i; }/*用于n不需要保值,,以后用不到了的情況*/ int n=10; for(n=n;n>1;n--){count*=n; } /*for循環(huán)語(yǔ)句里n=n可以省略,但分號(hào)不能省略*/ int n=10; for(;n>1;n--){count*=n; }//可以看出 for(;條件;){} == while(條件){}

· 三種循環(huán)對(duì)比:

如果有固定次數(shù),用for循環(huán);

如果必須執(zhí)行一次,用do-while循環(huán);

其他情況用while循環(huán)。

//循環(huán)控制 break continue /*不過(guò)它們只能對(duì)自己所在的那層循環(huán)進(jìn)行跳出/重來(lái),如果要逐層跳出循環(huán)的話,一種方法是——需要使用接力break,如下所示*/exit=1;break;} } if(exit=1) break;//另一種方法是:int main() {xxx//此處代表省略了前面的一大堆,只展示結(jié)尾跳出部分goto out;}} } out:return 0; }

? 有的時(shí)候,上一步的結(jié)果可以通過(guò)給一個(gè)新變量賦值,再通過(guò)新變量值的判斷輸出結(jié)果的方式來(lái)進(jìn)行,并且有的時(shí)候,這種方式,比其他的一些比較大小要優(yōu)越一點(diǎn)。

//五個(gè)一行 if(cnt%5==0){printf("\n"); } //對(duì)的整整齊齊 printf("%d\t",x); 這個(gè)\t使它對(duì)齊 //題目練習(xí):正序輸出整數(shù) int main() {int x;scanf("%d",&x);int mask=1;int t=x;while(t>=10){t/=10;mask*=10;}while(mask>0){a=x/mask;x=x%mask;mask/=10;printf("%d",a);if(mask>0){printf(" ");}} /*我認(rèn)為我這樣做是沒(méi)錯(cuò)的,沒(méi)必要do-while,因?yàn)閙ask它必然大于0,它初始都是1了,而且你前面唯一的可能是讓它變大,所以你直接用while應(yīng)該是沒(méi)什么問(wèn)題的。當(dāng)然你do-while從邏輯上也是對(duì)的,更直白地表現(xiàn)出了它必須要進(jìn)行一次。*/ return 0; }

? 現(xiàn)在的問(wèn)題就是,奧,我了解這個(gè)語(yǔ)法了,但是我做的題少,用起來(lái)還是很不熟悉,還是有可能在一些條件設(shè)置上犯錯(cuò)誤,或者是選擇了不太合適的語(yǔ)法。就是還要多練,多做題,這一遍過(guò)去之后回來(lái)一定要多做題練習(xí)熟練一點(diǎn)。

? ·關(guān)于do-while和while,前者雖然是在后面判斷,但是它影響的是會(huì)不會(huì)進(jìn)行下一次循環(huán),所以它并不是使它可以后驗(yàn),超出了這個(gè)要求就取消本次循環(huán);恰恰相反,它還是必須要做一次的,還不如while。由于并沒(méi)有后判斷再取消操作的這種函數(shù),所以只能是修改條件,把前置條件等價(jià)轉(zhuǎn)化成若它在后置條件為此的時(shí)候所等價(jià)對(duì)應(yīng)的前置條件,便如上所示,把 t>0 修改為 t>=10。

//使用輾轉(zhuǎn)相除法計(jì)算最大公約數(shù) #include <studio.h> int main() {int a,b;int t;scanf("&d &d",&a,&b);do{if(b=0){printf("gcd=%d",a);}else{t=b;b=a%b;a=t;}}while(b!=0);return 0; } //例題一:求符合給定條件的整數(shù)集【這個(gè)的數(shù)字位數(shù)是確定的】int a,b,c,d; scanf("%d",&a); b=a+1; c=a+2; d=a+3; //這是我的嘗試,我想先列出來(lái),但這樣并不明智……做不出來(lái)了

? 計(jì)算機(jī)為什么不能利用我們的方法枚舉——因?yàn)樗荒苡洃浬弦粋€(gè),還要去比對(duì),看是不是重復(fù),這個(gè)條件判斷就很離譜,所以我們只能使用更適合計(jì)算機(jī)的也就是更普適的方法——遞歸。

//例題一:求符合給定條件的整數(shù)集【這個(gè)的數(shù)字位數(shù)是確定的】 int a; scanf("%d",&a); int i,j,k; int cnt=0; i=a; j=a; k=a; while(i<=a+3){while(j<=a+3){while(k<=a+3){if(i!=j){if(i!=k){if(j!=k){printf("%d%d%d",i,j,k);cnt++;if(cnt%6=0){print("\n");}else{print(" ");}}}k++;} j++;}i++;} }

我覺(jué)得不對(duì)勁啊…有點(diǎn)質(zhì)疑這個(gè)答案

??是我對(duì)while的特性掌握不清還是對(duì)if的特性掌握不清?剛才讀到了這句指令,但由于當(dāng)時(shí)不符合條件而跳過(guò)了這句指令,之后因?yàn)椴僮魇沟脳l件符合了,就會(huì)去執(zhí)行剛才那個(gè)指令嗎??

//例題二:水仙花數(shù)【這個(gè)相比上一題,多了位數(shù)的不確定性和一個(gè)輸出的條件判斷】 //我在平板打草紙上寫(xiě)了一遍,今天就先不打上來(lái)了

? 一開(kāi)始沒(méi)做出來(lái)主要是因?yàn)樗悸放芷?#xff0c;被上一個(gè)例題帶的,一直想一位數(shù)一位數(shù)的處理,至于每個(gè)用哪個(gè)方法我還沒(méi)完全想清楚,再往后學(xué)學(xué)再回來(lái)考慮吧。

//例題三:下三角九九乘法表 //較為簡(jiǎn)單,暫時(shí)略 //例題四:統(tǒng)計(jì)素?cái)?shù)求和 int main() {int m,n;scanf("%d %d",&m,&n);int i;int cnt=0;int sum=0;if(m==1){m=2;}for(i=m;i<=n;i++){int isprime=1;int k;for(k=2;k<=n;k++){if(i%k==0){isprime=0;break;/*我一開(kāi)始這里忘記加break了,邏輯上沒(méi)錯(cuò)但是就要白費(fèi)很多功夫,都已經(jīng)知道它不是素?cái)?shù)了你還算什么算…*/}}if(isprime=1){cnt++;sum+=i;}}printf("%d %d",cnt,sum);return 0; } //例題五:猜數(shù)字游戲 //比較簡(jiǎn)單,暫時(shí)略過(guò) //例題六:求序列前n項(xiàng)和 //比較簡(jiǎn)單,暫時(shí)略過(guò) //但此處引出了int上界和double上界的問(wèn)題 //例題七:約分最簡(jiǎn)分式 int a,b; scanf("%d/%d",&a,&b); int m=0; int n=1; int t=1; while(t>0){ m=b;b=a%b;t=a/b;a=m;if(a%b=0){n=b;} } if(m=0){printf("分母不能為0!"); } printf("%d/%d\n",a/n,b/n);//例題八:念數(shù)字 int a; scanf("%d",&a); int m=a; int n=a; int count=0; int i; /*因?yàn)楹罄m(xù)用到余數(shù)相關(guān),需要按0判別,所以首先處理完本身就是0的情況*/ if(a=0){printf("ling"); }/*因?yàn)橐獜淖笸易x,所以先算出它是幾位數(shù)*/ while(m!=0){m=m/10;count++; } /*得到最大的除數(shù)*/ for(i=1;i<=count;i++){int j=1;j*=10; }/*改進(jìn)1:上面兩個(gè)步驟可以合二為一,算出是幾位數(shù)的同時(shí)得到應(yīng)該除的部分 while(m>=10){int j=1;m/=10;j*=10; } 只能說(shuō)還是經(jīng)驗(yàn)不足+基本模型沒(méi)有很好的掌握,每次都在重新寫(xiě)一遍模型*//*逐個(gè)取出并念出*/ int b=1; int k; while(j>=1){k=n/j;if(k<0){printf("fu");printf(" ");k=-k;if(k=1){printf("yi");}else if(k=2){printf("er");}else if(k=3){printf("san");}else if(k=4){printf("si");}else if(k=5){printf("wu");}else if(k=6){printf("liu");}else if(k=7){printf("qi");}else if(k=8){printf("ba");}else if(k=9){printf("jiu");}else if(k=0){printf("ling");}}else if(k>0){if(k=1){printf("yi");}else if(k=2){printf("er");}else if(k=3){printf("san");}else if(k=4){printf("si");}else if(k=5){printf("wu");}else if(k=6){printf("liu");}else if(k=7){printf("qi");}else if(k=8){printf("ba");}else if(k=9){printf("jiu");}else if(k=0){printf("ling");}}n=n%j;j/=10; } /*改進(jìn)2:其實(shí)這里k<0只要一上來(lái)就輸出fu然后變成正的就不用費(fèi)兩遍事了*/ /*改進(jìn)3:我這里是刪掉了每條后面贅余的空格的,首先你想每個(gè)后面加空格,你不用每句加一個(gè)呀好不,你直接在那后面寫(xiě)就行;另一方面,最后一個(gè)后面是不需要輸出空格的,所以在改進(jìn)二進(jìn)行了的條件下,只需要在恰當(dāng)?shù)奈恢锰幖由?#xff1a; if(j>=10){printf(" "); } *///例題九:求a的連續(xù)和 int a,n; scanf("%d %d",&a,&n); int i; int sum1=0; int sum2=0; int j=1; //錯(cuò)了 int k; int k=1; for(i=1;i<=n;i++){sum1+=2*j;sum2+=sum1;//這是一種辦法,還有一種辦法是可以b=b*10+a,比我這種更好想一點(diǎn)for(;k<=i;k++){ //錯(cuò)了 for(k=1;k<=i;k++){ //錯(cuò)了 t*=10;j*=10;} //錯(cuò)了 j*=t;} printf("%d\n",sum2);/*這里多套了一層是一個(gè)大錯(cuò);另一個(gè)大錯(cuò)也是很重要的教訓(xùn)點(diǎn): 在for循環(huán)里如果嵌套for循環(huán),一定要注意,內(nèi)部嵌套的那個(gè)很有可能不該寫(xiě)初始條件!!因?yàn)檫@樣內(nèi)部就會(huì)進(jìn)行兩次循環(huán),所以說(shuō)建議酌情,最好是把變量的初始值拿到最前面去,防止犯錯(cuò)!*/

? 務(wù)必要整理基本模型!!!比如素?cái)?shù)、最大公約數(shù)、從左到右逐個(gè)輸出、從右到左逐個(gè)輸出等。

sizeof() //注意它并不會(huì)對(duì)里面進(jìn)行運(yùn)算操作,只會(huì)按照規(guī)律去預(yù)判一下將獲得的類型 char short int long long long

數(shù)組

//例題:輸入一堆不定量的個(gè)位數(shù),并統(tǒng)計(jì)每個(gè)數(shù)字出現(xiàn)的次數(shù) const int num=10; int array[num]; int i; int x; for(i=0;i<=num;i++){array[i]=0; } /*可以直接 int array[num]{0}; */ scanf("%d",&x); while(x!=-1){if(x>=0&&x<=9){array[x]++;}scanf("%d",&x); } for(i=0;i<num;i++){printf("%d:%d\n",i,array[i]); } //一個(gè)是我還不太明白&是干嘛,為啥交替用i和x,另一個(gè)是我還是對(duì)循環(huán)的理解不太夠 //數(shù)據(jù)的集成初始化 int a[]={1,2,3,4,5,6,7}; int a[13]={2,4,6} //剩余的都補(bǔ)位為0 //以下是一個(gè)C99 only的做法,也可以不給出數(shù)組大小,讓編譯器算 int a[10]={[0]=2,[2]=3,6, }//這種方法特別適合初始數(shù)據(jù)稀疏的數(shù)組 sizeof(a)/sizeof(a[0])//是數(shù)組元素個(gè)數(shù) //這樣的代碼,一旦修改數(shù)組中初始的數(shù)據(jù),不需要修改遍歷的代碼 //還是素?cái)?shù)那個(gè)題,我接下來(lái)用多種方式去構(gòu)建//方法1,較為常規(guī),數(shù)學(xué)思維,sqrt方法int i; int isprime(i);//函數(shù)聲明 //主函數(shù) int main(){for(i=2;i<=20;i++){if(isprime(i)){printf("%d\n",i)}}return 0; } //定義的isprime()函數(shù) int isprime(i){int t;isprime=1;for(t=2;t<=sqrt(i);t++){if(i%t=0){isprime=0;break; }}return isprime; }//方法2,考慮到除了2以外的偶數(shù)都不可能,所以先構(gòu)建一個(gè)包含了2的數(shù)組,然后逐漸往里面加//其實(shí)還有一種是你可以就是只考慮到偶數(shù)那一塊兒,我放到方法4了int primes[20]={2}; int length=1; const int max=20; int i; int addprime(i,primes[],length);int main(){for(i=3;i<=20;i+=2){addprime(i,primes[],length)}return 0; }int addprime(i,primes[],length){int t;for(t=2;t<=sqrt(i);t++){if(i%t==0){break;}else{primes[length++]=i;//我想知道,這里好像沒(méi)有把真正的 length++ 哎…這不是個(gè)獨(dú)立的變量空間嗎…//!!對(duì)呀,所以完全搞錯(cuò)了。。}} }//方法二修改版: int i; int primes[length]={2}; int length=20; int cnt=1; int isprime(int i,int primes[],int length);int main(){for(i=2;i<length;i++){if(isprime(i,primes[],length)){primes[cnt++]=i;}}//下面增加一段,以進(jìn)行格式較為規(guī)整的輸出for(i=0;i<length;i++){printf("%d",primes[i]);if((i+1)%5==0){printf("\t");}else{printf("\n");}}return 0; }int isprime(int i,int primes[],int length){ret=1;int x;for(x=0;x<length;x++){if(i%primes[x]==0){ret=0;break; }}return ret; } //方法3:使用刪除的方法 /*先構(gòu)建一個(gè)數(shù)組,全是1 只挑選為1的,從0到滿,去判斷是不是isprime,是的就保持為1,并把它們的每個(gè)倍數(shù)全都設(shè)置為0,如果不是就把它自己弄成0 isprime依然是比較淳樸的樣子 */ //方法:使用數(shù)組來(lái)記錄0,1:考慮到你無(wú)法直接說(shuō),我除去這個(gè)數(shù)(至少說(shuō)目前我不知道如何完成這件事),所以還是那樣,設(shè)計(jì)一個(gè)變量,然后我是1/0;再考慮好多好多數(shù)呢,所以就設(shè)置一個(gè)數(shù)組,它的鍵是數(shù)字,內(nèi)部是0/1/*int array[20]={1}; 一上來(lái)就不對(duì)!!這樣的話其他補(bǔ)位可都是0呀!*/int i; int isprime(i); int sum=0; const int max=20; int array[max];int main(){for(i=0;i<max;i++){array[i]=1;}for(i=2;sum<=20;i++){isprime(i);sum++;}printf("%d\n",array); }int isprime(i){int t;for(t=2;t<sqrt(i);t++){if(i%t==0){array[i]=0;break;}else{int x;for(x=2;x*i<20;x++){array[i]=0;}}} } //又犯了這個(gè)錯(cuò)…改吧//方法三修改版1.2 : int main(){int i;//int isprime(i);int array[max];const int max=20;for(i=0;i<max;i++){array[i]=1;}/*第一次注掉的for(i=2;i<max;i++){if(!isprime(i){array[i]=0;}else{int t;for(t=2;t*i<max;;t++){array[t*i]=0;}}}for(i=0;i<max;i++){if(isprime(i)){printf("%d\n",array[i]);}}*//*第二次又被我注掉了,不錯(cuò)for(i=0;i<max;i++){for(x=2;x<sqrt(i);x++){if(i%x==0){array[i]=0;break;}else{for(t=2;t*i<max;t++){array[t*i]=0;}}}}for(i=2;i<max;i++){if(array[i]){printf("%d\n9",i);}}*///其實(shí)吧它這就是一個(gè)簡(jiǎn)單的數(shù)字邏輯問(wèn)題,所有的非素?cái)?shù)(除1外)一定是素?cái)?shù)的整數(shù)倍,所以說(shuō),你只要從前往后地去掉所有已知素?cái)?shù)的整數(shù)倍,那么在你往后走的過(guò)程中,遇到的沒(méi)有被剔除的每個(gè)數(shù)都一定是素?cái)?shù)了…來(lái)吧int i;int array[i];const int max=20;for(i=0;i<max;i++){array[i]=1;}for(i=2;i<max;i++){if(array[i]){int x;for(x=2;x*i<sum;x++){array[x*i]=0;}}}for(i=2;i<max;i++){if(array[i]){printf("%d\n",i);}}return 0; }//ok了! /*int isprime(int i){int ret=1;for(t=2;t<=sqrt(i);t++){if(i%t==0){ret=0;break;}} }*/ //好家伙,我想說(shuō),我覺(jué)得我這個(gè)修改后的確實(shí)沒(méi)錯(cuò),但我還是封裝了函數(shù),我突然發(fā)現(xiàn),老師講的意思是你不封裝函數(shù)……那個(gè)0/1是數(shù)組的值!!好家伙,怪不得我找了半天都找不到老師寫(xiě)的函數(shù)在哪/*//方法4→不想了,我直接注掉了 int i; int ret; int isprime(i); int cnt=20;int main(){for(i=1;cnt>0;i++){//我想知道在函數(shù)isprime里放上cnt--有用嗎…不是說(shuō)因?yàn)樽兞刻幱诓煌臻g,所以改不了其他變量的值來(lái)?if(isprime(i)){printf("%d\n",i);}}return 0; }int isprime(i){ret=1;if(i==1||i%2==0&&i!=2){ret=0;cnt--;}else if(i!=2){int t;for(t=3;t<=sqrt(i);t+=2){if(i%t==0){ret=0;break;}else{cnt--;}}else{cnt--;}return ret;}}*/

· 切記,一定不要只顧著趕進(jìn)度,每一個(gè)章節(jié)對(duì)應(yīng)的題都要認(rèn)認(rèn)真真再自己做一遍,看懂不等于理解,更不等于會(huì)做,一定要自己全部敲一遍,并且把老師所寫(xiě)代碼的思想吃透!!

· 我這個(gè)犯錯(cuò)的思想其實(shí)有點(diǎn)受之前學(xué)python的影響,我覺(jué)得,把更多的東西封裝進(jìn)函數(shù)里,主函數(shù)越簡(jiǎn)潔越好,但這對(duì)于我目前學(xué)到的C語(yǔ)言的部分來(lái)說(shuō)是不合理的,因?yàn)槟愕暮瘮?shù)目前只是可以return一個(gè)值而已,并不能去修改你原本有的值。

總結(jié)

以上是生活随笔為你收集整理的C语言(初遍学的一些零乱笔记)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。