C語言100道程式設計題(二),經典哦
摘要:/*
【程式51~60】
題目:學習使用按位與 & ,按位或運算|,按位異或運算^按位取反運算~。
沒給出具體的題目,所以我只小結一下
按位與運算是對兩個運算元逐位“求與”,當他們都為1時結果為1,否則結果為0
1&1=1,1&1=1,0&1=0,0&0...
/* 【程式51~60】 題目:學習使用按位與 & ,按位或運算|,按位異或運算^按位取反運算~。 沒給出具體的題目,所以我只小結一下 按位與運算是對兩個運算元逐位“求與”,當他們都為1時結果為1,否則結果為0 1&1=1,1&1=1,0&1=0,0&0=0 即1&x=1所以可用1與來取數中的特定位。 0&x=0,所以可用0與來給數中的某些位清0 按位或運算"|" 按位或運算是對兩個運算元逐位“相或”。當他們都是0時結果為0,否則結果為1 即1|x=1,所以可用1或來將數的某些位置1 0|x=x,所以可用0或來將數的某些位保持不變。 利用按位或運算還可以把一串二進位制數連線到另一串二進位制數後面: 先在物件字串的末尾加上N個0,N為要連線的字串位數,然後進行按位或操作,得到的結果即為所求。 按位異或運算“^” 按位異或運算是將兩個數逐位相異或,當他們一個為1,一個為0時(即相異時)結果為1,否則為0. 1^0=1,1^1=0,0^1=1,0^0=0 即1^x=~x,0^x=x 所以可用來將數的某些位取反。 按位取反“~” 按位取反運算是將運算元進行逐位“取反”。 二進位制左移運算子“<<” 二進位制左移運算是把資料向左移動若干位,移出左邊界的所有位都將消失,右側新增加的位為0. 向左移動一位等同於乘以2 二進位制右移運算子">>" 二進位制右移運算把資料向右移動若干位時,移出右邊界的所以位將丟失,左側的新位補充規則如下: 1.對於無符號數,右移時左側新位一律補0,稱為”邏輯右移“ 2.對於有符號數,若符號位是0,則左移新位一律補0,;若符號位是1,則左側新位一律補1,稱為”算術右移“ 所以左移一位增大到原來2倍,右移一位減小到原來的1/2倍。 左移增加,右移減小。 */ /* 【程式61】 題目:打印出楊輝三角形(要求打印出10行如下圖) 1.程式分析: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 */ #include<stdio.h> #include<stdlib.h> int main() { int i,j; int a[10][10]={0}; for(i=0;i<10;i++) a[i][0]=1; for(i=1;i<10;i++) for(j=1;j<i+1;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; for(i=0;i<10;i++) { for(j=0;j<i+1;j++) printf("%3d ",a[i][j]); printf("\n"); } system("pause"); return 0; } /* 【程式66】 題目:輸入3個數a,b,c,按大小順序輸出。 */ #include<stdio.h> #include<stdlib.h> int main() { int a,b,c,tem; scanf("%d%d%d",&a,&b,&c); if(a<b){tem=a;a=b;b=tem;} if(b<c){tem=b;b=c;c=tem;} if(a<b){tem=a;a=b;b=tem;} printf("%d %d %d\n",a,b,c); system("pause"); return 0; } /* 【程式67】 題目:輸入陣列,最大的與第一個元素交換,最小的與最後一個元素交換,輸出陣列。 用兩個指標指向最大的和最小的 */ #include<stdio.h> #include<stdlib.h> #define N 10 int main() { int a[N],*pl,*ps,tem,i; for(i=0;i<N;i++) scanf("%d",&a[i]); ps=pl=&a[0]; for(i=1;i<N;i++) { if(*pl<a[i]) pl=&a[i]; if(*ps>a[i])ps=&a[i]; } tem=a[0];a[0]=*pl;*pl=tem; tem=a[N-1];a[N-1]=*ps;*ps=tem; for(i=0;i<N;i++) printf("%d ",a[i]); system("pause"); return 0; } /* 【程式68】 題目:有n個整數,使其前面各數順序向後移m個位置,最後m個數變成最前面的m個數 */ #include<stdio.h> #include<stdlib.h> void move(int array[],int n,int m); int main() { int n,m,a[20],i,j,tem; printf("input n and m:\n"); scanf("%d%d",&n,&m); printf("input array:\n"); for(i=0;i<n;i++) scanf("%d",&a[i]); move(a,n,m); system("pause"); return 0; } void move(int array[],int n,int m) { int temarray[20]; int i,j; for(i=n-m,j=0;i<n;i++,j++) temarray[j]=array[i]; for(i=0;i<n-m+1;i++,j++) temarray[j]=array[i]; for(i=0;i<n;i++) array[i]=temarray[i]; } /* 【程式69】 題目:有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出 圈子,問最後留下的是原來第幾號的那位。 */ #include<stdio.h> #include<stdlib.h> #define NMax 40 int main() { int a[NMax],i,j,count,n; printf("input n:\n"); scanf("%d",&n); getchar(); for(i=0;i<n;i++) a[i]=i+1; i=0;j=0;count=0; while(count<n-1){ if(a[j]!=0) i++; if(i==3) {count++;i=0;a[j]=0;} j++; if(j==n)j=0; } for(i=0;i<n;i++) if(a[i]!=0){printf("最後剩下的是原來的第%d位\n\n",i+1);break;} system("pause"); return 0; } /* 【程式70】 題目:寫一個函式,求一個字串的長度,在main函式中輸入字串,並輸出其長度。 */ #include<stdio.h> #include<stdlib.h> int getstrlen(char*str); int main() { char str[50]; gets(str); printf("%d\n",getstrlen(str)); system("pause"); return 0; } int getstrlen(char*str) { char *p=str; while(*(p++)!='\0') ; return p-str-1; } /* 【程式71】 題目:編寫input()和output()函式輸入,輸出5個學生的資料記錄。 */ #include<stdio.h> #include<stdlib.h> typedef struct{ char name[20]; char sex[5]; intage; }Stu; void input(Stu*stu); void output(Stu*stu); int main() { Stu stu[5]; printf("請輸入5個學生的資訊:姓名 性別 年齡:\n"); input(stu); printf("5個學生的資訊如下:\n姓名性別年齡\n"); output(stu); system("pause"); return 0; } void input(Stu*stu) { int i; for(i=0;i<5;i++) scanf("%s%s%d",stu[i].name,stu[i].sex,&(stu[i].age)); } void output(Stu*stu) { int i; for(i=0;i<5;i++) printf("%s %s %d\n",stu[i].name,stu[i].sex,stu[i].age); } /* 【程式72】 題目:建立一個連結串列。 */ #include<stdio.h> #include<stdlib.h> #include<malloc.h> typedef struct LNode{ intdata; struct LNode *next; }LNode,*LinkList; LinkList CreateList(int n); void print(LinkList h); int main() { LinkList Head=NULL; int n; scanf("%d",&n); Head=CreateList(n); printf("剛剛建立的各個連結串列元素的值為:\n"); print(Head); printf("\n\n"); system("pause"); return 0; } LinkList CreateList(int n) { LinkList L,p,q; int i; L=(LNode*)malloc(sizeof(LNode)); if(!L)return 0; L->next=NULL; q=L; for(i=1;i<=n;i++) { p=(LinkList)malloc(sizeof(LNode)); printf("請輸入第%d個元素的值:",i); scanf("%d",&(p->data)); p->next=NULL; q->next=p; q=p; } return L; } void print(LinkList h) { LinkList p=h->next; while(p!=NULL){ printf("%d ",p->data); p=p->next; } } /* 【程式76】 題目:編寫一個函式,輸入n為偶數時,呼叫函式求1/2+1/4+...+1/n,當輸入n為奇數時,呼叫函式 1/1+1/3+...+1/n(利用指標函式) */ #include<stdio.h> #include<stdlib.h> doubleevenumber(int n); doubleoddnumber(int n); int main() { int n; double r; double (*pfunc)(int); scanf("%d",&n); if(n%2==0) pfunc=evenumber; else pfunc=oddnumber; r=(*pfunc)(n); printf("%lf\n",r); system("pause"); return 0; } doubleevenumber(int n) { double s=0,a=0; int i; for(i=2;i<=n;i+=2) { a=(double)1/i; s+=a; } return s; } doubleoddnumber(int n) { double s=0,a=0; int i; for(i=1;i<=n;i+=2) { a=(double)1/i; s+=a; } return s; } /* 【程式77】 題目:填空練習(指向指標的指標) */ #include<stdio.h> #include<stdlib.h> int main() { char *s[]={"man","woman","girl","boy","sister"}; char **q; int k; for(k=0;k<5;k++) { q=&s[k];/*在這裡填入內容*/ printf("%s\n",*q); } system("pause"); return 0; } /* 【程式78】 題目:找到年齡最大的人,並輸出。請找出程式中有什麼問題。 */ #include<stdio.h> #include<stdlib.h> struct man{ char name[20]; intage; }person[3]={"li",18,"wang",19,"sun",22}; int main() { struct man *q,*p; int i,m=0; p=person; for(i=0;i<3;i++) { if(m<p->age)m=p->age; q=p++; } printf("%s %d\n",q->name,q->age); system("pause"); return 0; } /* 【程式79】 題目:字串排序。 */ #include<stdio.h> #include<stdlib.h> void swap(char*str1,char*str2); int main() { char str1[20],str2[20],str3[20]; printf("請輸入3個字串,每個字串以回車結束!:\n"); gets(str1); gets(str2); gets(str3); if(strcmp(str1,str2)>0)swap(str1,str2); if(strcmp(str2,str3)>0)swap(str2,str3); if(strcmp(str1,str2)>0)swap(str1,str2); printf("排序後的結果為:\n"); printf("%s\n%s\n%s\n",str1,str2,str3); system("pause"); return 0; } void swap(char*str1,char*str2) { char tem[20]; strcpy(tem,str1); strcpy(str1,str2); strcpy(str2,tem); } /* 【程式80】 題目:海灘上有一堆桃子,五隻猴子來分。第一隻猴子把這堆桃子平均分為五份,多了一個,這隻 猴子把多的一個扔入海中,拿走了一份。第二隻猴子把剩下的桃子又平均分成五份,又多了 一個,它同樣把多的一個扔入海中,拿走了一份,第三、第四、第五隻猴子都是這樣做的, 問海灘上原來最少有多少個桃子? */ #include<stdio.h> #include<stdlib.h> int main() { int x ,i=0,j=1; while(i<5){ x=4*j; for(i=0;i<5;i++) { if(x%4!=0){break;} x=(x/4)*5+1; } j++; } printf("%d\n",x); system("pause"); return 0; } /* 【程式80】 題目:海灘上有一堆桃子,五隻猴子來分。第一隻猴子把這堆桃子平均分為五份,多了一個,這隻 猴子把多的一個扔入海中,拿走了一份。第二隻猴子把剩下的桃子又平均分成五份,又多了 一個,它同樣把多的一個扔入海中,拿走了一份,第三、第四、第五隻猴子都是這樣做的, 問海灘上原來最少有多少個桃子? 這個題目單從數學上來說有很簡單的做法見這位大神的部落格 http://blog.csdn.net/yupenghua/article/details/6803494 */ #include<stdio.h> #include<stdlib.h> int main() { int x ,i=0,j=1; while(i<5){ x=4*j; for(i=0;i<5;i++) { if(x%4!=0){break;} x=(x/4)*5+1; } j++; } printf("%d\n",x); system("pause"); return 0; } /* 【程式81】 題目:809*??=800*??+9*??+1 其中??代表的兩位數,8*??的結果為兩位數,9*??的結果為3位數。求??代表的兩位數,及809*??後的結果。 */ #include<stdio.h> #include<stdlib.h> int main() { int a,i; for(i=10;i<100;i++) if(8*i<100&&9*i>99&&9*i<1000) { printf("??代表的兩位數為:%d\n",i); break; } printf("809*%d==800*%d+9*%d+1\n",i,i,i); system("pause"); return 0; } /* 【程式82】 題目:八進位制轉換為十進位制 */ #include<stdio.h> #include<stdlib.h> int main() { int n=0,i=0; char s[20]; printf("請輸入一個8進位制數:\n"); gets(s); while(s[i]!='\0'){ n=n*8+s[i]-'0'; i++; } printf("剛輸入的8進位制數轉化為十進位制為%d",n); system("pause"); return 0; } /* 【程式83】 題目:求0—7所能組成的奇數個數。 用1,3,5,7作個位,0不能作最高位。一位數,兩位數。。。7位數 */ #include<stdio.h> #include<stdlib.h> int factorial(int a,int b);/*求階乘*/ int main() { int sum=0,i; sum+=4; /*一位數不能按下面處理,一位數時的奇數有4個*/ for(i=2;i<8;i++) sum+=4*(factorial(7,i-1)-factorial(6,i-2)); printf("可以組成%d個奇數\n",sum); system("pause"); return 0; } int factorial(int a,int b) { int i,sum=1; if(b<=0)return 1; for(i=0;i<b;i++) sum*=(a-i); return sum; } /* 【程式84】 題目:一個偶數總能表示為兩個素數之和。 我去,這是什麼題目,要我證明這個問題嗎?真不知道怎麼證明。那就把一個偶數分解成兩個素數吧。 */ #include<stdio.h> #include<stdlib.h> int Isprimer(unsigned int n); int main() { unsigned int n,i; do{ printf("請輸入一個偶數:\n"); scanf("%d",&n); }while(n%2!=0); for(i=1;i<n;i++) if(Isprimer(i)&&Isprimer(n-i)) break; printf("偶數%d可以分解成%d和%d兩個素數的和\n",n,i,n-i); system("pause"); return 0; } int Isprimer(unsigned int n) { int i; if(n<4)return 1; else if(n%2==0)return 0; else for(i=3;i<sqrt(n)+1;i++) if(n%i==0)return 0; return 1; } /* 【程式85】 題目:判斷一個素數能被幾個9整除 丫的!這題目的意思是判斷一個素數能整除幾個9組成的數吧?我就這麼理解吧。素數是不 能被除1和自身之外的數整除的 */ #include<stdio.h> #include<stdlib.h> int main() { int p,i; long int sum=9; printf("請輸入一個素數:\n"); scanf("%d",&p); for(i=1;;i++) if(sum%p==0)break; else sum=sum*10+9; printf("素數%d能整除%d個9組成的數%ld\n",p,i,sum); system("pause"); return 0; } /* 【程式86】 題目:兩個字串連線程式 真的這麼簡單嗎?用strcat就行了 */ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> char* strconnect(char *str1,char *str2); int main() { char str1[20],str2[20]; char *str; puts("請輸入兩個字串,用回車分開:"); gets(str1); gets(str2); str=strconnect(str1,str2); puts("連線後的字串為:"); puts(str); system("pause"); return 0; } char* strconnect(char *str1,char *str2) { char*str; str=(char*)malloc(strlen(str1)+strlen(str2)+1); str[0]='\0'; strcat(str,str1); strcat(str,str2); return str; } /* 【程式88】 題目:讀取7個數(1—50)的整數值,每讀取一個值,程式打印出該值個數的*。 */ #include<stdio.h> #include<stdlib.h> int main() { int n,i,j; for(i=0;i<7;i++) { scanf("%d",&n); if(n>50){printf("請重新輸入:\n");i--;} else { for(j=0;j<n;j++) printf("*"); } printf("\n"); } system("pause"); return 0; } /* 【程式89】 題目:某個公司採用公用電話傳遞資料,資料是四位的整數,在傳遞過程中是加密的,加密規則如下: 每位數字都加上5,然後用和除以10的餘數代替該數字,再將第一位和第四位交換,第二位和第三位交換。 這是什麼題啊?是要我加密呢?還是解密呢? 那我就加密吧! */ #include<stdio.h> #include<stdlib.h> int main() { int a,b,c,d,tem; char str[5]; printf("輸入一個要加密的四位整數:\n"); gets(str); a=(str[0]-'0'+5)%10; b=(str[1]-'0'+5)%10; c=(str[2]-'0'+5)%10; d=(str[3]-'0'+5)%10; tem=a;a=d;d=tem; tem=b;b=c;c=tem; tem=a*1000+b*100+c*10+d; printf("加密後的數為%d\n",tem); system("pause"); return 0; } /* 【程式96】 題目:計算字串中子串出現的次數 暫時不想用KMP演算法了 */ #include<stdio.h> #include<stdlib.h> #include<string.h> int main() { int i,j,k,TLen,PLen,count=0; char T[50],P[10]; printf("請輸入兩個字串,以回車隔開,母串在前,子串在後:\n"); gets(T); gets(P); TLen=strlen(T); PLen=strlen(P); for(i=0;i<=TLen-PLen;i++) { for(j=0,k=i;j<PLen&&P[j]==T[k];j++,k++) ; if(j==PLen)count++; } printf("%d\n",count); system("pause"); return 0; } /* 【程式97】 題目:從鍵盤輸入一些字元,逐個把它們送到磁碟上去,直到輸入一個#為止。 */ #include<stdio.h> #include<stdlib.h> int main() { FILE*fp=NULL; char filename[25]; char ch; printf("輸入你要儲存到的檔案的名稱:\n"); gets(filename); if((fp=fopen(filename,"w"))==NULL) { printf("error: cannot open file!\n"); exit(0); } printf("現在你可以輸入你要儲存的一些字元,以#結束:\n"); getchar(); while((ch=getchar())!='#'){ fputc(ch,fp); } fclose(fp); system("pause"); return 0; } /* 【程式98】 題目:從鍵盤輸入一個字串,將小寫字母全部轉換成大寫字母,然後輸出到一個磁碟檔案“test”中儲存。 輸入的字串以!結束。 */ #include<stdio.h> #include<stdlib.h> int main() { FILE*fp=NULL; char str[50]; int i,len; printf("輸入一個字串:\n"); gets(str); len=strlen(str); for(i=0;i<len;i++) { if(str[i]<='z'&&str[i]>='a') str[i]-=32; } if((fp=fopen("test","w"))==NULL) { printf("error: cannot open file!\n"); exit(0); } fprintf(fp,"%s",str); fclose(fp); system("pause"); return 0; } /* 【程式99】 題目:有兩個磁碟檔案A和B,各存放一行字母,要求把這兩個檔案中的資訊合併(按字母順序排列), 輸出到一個新檔案C中。 題目沒交代清楚A檔案和B檔案中的字母是不是有序的。我就當做沒序吧!合併後氣泡排序就好! */ #include<stdio.h> #include<stdlib.h> #include<string.h> int main() { FILE*fa,*fb,*fc; int i,j,k; char str[100],str1[100]; char tem; if((fa=fopen("A.txt","r"))==NULL) { printf("error: cannot open A file!\n"); exit(0); } fgets(str,99,fa); fclose(fa); if((fb=fopen("B.txt","r"))==NULL) { printf("error: cannot open B file!\n"); exit(0); } fgets(str1,100,fb); fclose(fb); strcat(str,str1); for(i=strlen(str)-1;i>1;i--) for(j=0;j<i;j++) if(str[j]>str[j+1]) { tem=str[j]; str[j]=str[j+1]; str[j+1]=tem; } if((fc=fopen("C.txt","w"))==NULL) { printf("error: cannot open C file!\n"); exit(0); } fputs(str,fc); fclose(fc); system("pause"); return 0; } /* 【程式100】 題目:有五個學生,每個學生有3門課的成績,從鍵盤輸入以上資料(包括學生號,姓名,三門課成績),計算出 平均成績,況原有的資料和計算出的平均分數存放在磁碟檔案"stud"中。 */ #include<stdio.h> #include<stdlib.h> typedef struct{ int ID; int math; int English; int C; int avargrade; char name[20]; }Stu; int main() { FILE*fp; Stu stu[5]; int i,avargrade=0; printf("請輸入5個同學的資訊:學生號,姓名,3門成績:\n"); for(i=0;i<5;i++) { scanf("%d%s%d%d%d",&(stu[i].ID),stu[i].name,&(stu[i].math),&(stu[i].English),&(stu[i].C)); stu[i].avargrade=(stu[i].math+stu[i].English+stu[i].C)/3; } if((fp=fopen("stud","w"))==NULL) { printf("error :cannot open file!\n"); exit(0); } for(i=0;i<5;i++) fprintf(fp,"%d %s %d %d %d %d\n",stu[i].ID,stu[i].name,stu[i].math,stu[i].English, stu[i].C,stu[i].avargrade); fclose(fp); system("pause"); return 0; }