安徽大學 | 高級語言程序設計(C語言) 期末考試復習 設計題 2023

課程例題和代碼公開 2023.2.25
案例1:交換變量
從鍵盤上輸入2個變量a和b,交換他們。
//數(shù)字型 #include<stdio.h> int main(){ ??int a,b; ??scanf("%d%d",&a,&b); ??int t; ??t=a; ??a=b; ??b=t; ??printf("%d %d",a,b); ??return 0; } //字符串 #include<stdio.h> #include<string.h> int main(){ ??char a[10],b[10]; ??scanf("%s%s",a,b); ??char t[10]; ??strcpy(t,a); ??strcpy(a,b); ??strcpy(b,t); ??printf("%s %s",a,b); ??return 0; }
案例2:求最值
從鍵盤上輸入n和n個元素,找出最大值和最小值。
#include<stdio.h> int main(){ ??int a[100],n; ??scanf("%d",&n); ??int i; ??for(i=0;i<n;i++) ????scanf("%d",&a[i]); ??int max=a[0],min=a[0]; ??for(i=0;i<n;i++){ ????if(a[i]>max)??max=a[i]; ????if(a[i]<min)??min=a[i]; ?} ??printf("最大值是%d 最小值是%d",max,min); ??return 0; }
案例3:三個數(shù)排序
從鍵盤上輸入三個數(shù),按從小到大的順序排列。
//正常 #include<stdio.h> int main(){ ??int a,b,c,t; ??scanf("%d%d%d",&a,&b,&c); ??if(a>b){ ????t=a; ????a=b; ????b=t; ?} ??if(a>c){ ????t=a; ????a=c; ????c=t; ?} ??if(b>c){ ????t=b; ????b=c; ????c=t; ?} ??printf("%d %d %d",a,b,c); } //函數(shù) #include<stdio.h> void swap(int *m,int *n){ ??int t; ??t=*m; ??*m=*n; ??*n=t; } int main(){ ??int a,b,c; ??scanf("%d%d%d",&a,&b,&c); ??if(a>b) swap(&a,&b); ??if(a>c) swap(&a,&c); ??if(b>c) swap(&b,&c); ??printf("%d %d %d",a,b,c); }
案例4:選擇法排序
從鍵盤上輸入n和n個元素,按從小到大順序排列。
//從小到大 #include<stdio.h> int main(){ ??int a[100],n; ??scanf("%d",&n); ??int i,j,minpos,t; ??for(i=0;i<n;i++)??scanf("%d",&a[i]); ??for(i=0;i<n-1;i++){ ????minpos=i+1; ????for(j=i+1;j<n;j++){ ??????if(a[j]<a[minpos]) minpos=j; ???} ????if(a[i]>a[minpos]){ ??????t=a[i]; ??????a[i]=a[minpos]; ??????a[minpos]=t; ???} ?} ??for(i=0;i<n;i++)??printf("%d ",a[i]); } //從大到小,函數(shù) #include<stdio.h> void sort(int n,int a[]) { ??int i, j, maxpos, t; ??for (i = 0; i < n - 1; i++) { ????maxpos = i + 1; ????for (j = i + 1; j < n; j++) { ??????if (a[j] > a[maxpos]) maxpos = j; ???} ????if (a[i] < a[maxpos]) { ??????t = a[i]; ??????a[i] = a[maxpos]; ??????a[maxpos] = t; ???} ?} } int main() { ??int a[100], n; ??scanf("%d", &n); ??int i; ??for (i = 0; i < n; i++) scanf("%d", &a[i]); ??sort(n, a); ??for (i = 0; i < n; i++) printf("%d ", a[i]); } //從小到大(補充) #include<stdio.h> int main(){ ??int a[100],n; ??scanf("%d",&n); ??int i,j,minpos,t; ??for(i=0;i<n;i++)??scanf("%d",&a[i]); ??for(i=0;i<n-1;i++){ ????minpos=i;//改了這一處 ????for(j=i+1;j<n;j++){ ??????if(a[j]<a[minpos]) minpos=j; ???} ????if(minpos!=i){//和這一處 ??????t=a[i]; ??????a[i]=a[minpos]; ??????a[minpos]=t; ???} ?} ??for(i=0;i<n;i++)??printf("%d ",a[i]); }
案例5:冒泡法排序
從鍵盤上輸入n和n個元素,按從小到大順序排列。
#include<stdio.h> int main(){ ??int a[100],n; ??scanf("%d",&n); ??int i,j,t; ??for(i=0;i<n;i++)??scanf("%d",&a[i]); ??for(i=0;i<n-1;i++){ ????for(j=0;j<n-1-i;j++){ ??????if(a[j]>a[j+1]){ ????????t=a[j]; ????????a[j]=a[j+1]; ????????a[j+1]=t; ?????} ???} ?} ??for(i=0;i<n;i++) printf("%d",a[i]); }
案例6:二分法求根
用二分法求方程$2x^{3} -4x^{2}+3x-6=0$在-10到10之間的一個根
#include<stdio.h> #include<math.h> float f(float x){ ??return 2*x*x*x-4*x*x+3*x-6; } int main(){ ??float l,r,mid; ??l=-10; ??r=10; ??do{ ????mid=(l+r)/2; ????if(f(l)*f(mid)<0)?r=mid; ????else??l=mid; ?}while(fabs(f(mid))>1e-4); ??printf("%.2f",mid); }
案例7:百雞問題
用100元買100只雞,已知一只公雞5元,一只母雞3元,3只小雞1元。求買公雞,母雞,小雞各多少只。
#include<stdio.h> #include<math.h> int main(){ ??int z; ??float x,y; ??for(z=76;z<=85;z++){ ????x=-100+4.0/3*z; ????y=200-7.0/3*z; ????if(fabs(x-(int)x)<1e-2 && fabs(y-(int)y)<1e-2) ??????printf("%d %d %d\n",(int)x,(int)y,z); ?} }
案例8:分數(shù)統(tǒng)計
輸入班級人數(shù)n和每個人的成績,求落在下面5個分數(shù)段的人數(shù),90分及以上,80-89,70-79,60-69,60分以下。
//if寫法 #include<stdio.h> int main(){ ??int n,score,c1=0,c2=0,c3=0,c4=0,c5=0; ??scanf("%d",&n); ??int i; ??for(i=0;i<n;i++){ ????scanf("%d",&score); ????if(score>=90) c1++; ????else if(80<=score && score<=89) c2++; ????else if(70<=score && score<=79) c3++; ????else if(60<=score && score<=69) c4++; ????else c5++; ?} ??printf("%d %d %d %d %d",c1,c2,c3,c4,c5); } //switch寫法 #include<stdio.h> int main(){ ??int n,score,c1=0,c2=0,c3=0,c4=0,c5=0; ??scanf("%d",&n); ??int i; ??for(i=0;i<n;i++){ ????scanf("%d",&score); ????switch(score/10){ ??????case 10: ??????case 9:c1++;break; ??????case 8:c2++;break; ??????case 7:c3++;break; ??????case 6:c4++;break; ??????default:c5++; ???} ?} ??printf("%d %d %d %d %d",c1,c2,c3,c4,c5); }
案例9:字符統(tǒng)計
輸入一段字符,求其中大寫字母,小寫字母,數(shù)字,空格,其他字符的個數(shù)。
//單字符 #include<stdio.h> int main(){ ??int c1=0,c2=0,c3=0,c4=0,c5=0; ??char c; ??c=getchar(); ??while(c!='\n'){ ????if('A'<=c && c<='Z')??c1++; ????else if('a'<=c && c<='z')?c2++; ????else if('0'<=c && c<='9')?c3++; ????else if(c==' ') c4++; ????else??c5++; ????c=getchar(); ?} ??printf("%d %d %d %d %d",c1,c2,c3,c4,c5); } //字符串 #include<stdio.h> int main(){ ??int c1=0,c2=0,c3=0,c4=0,c5=0; ??char c[100]; ??gets(c); ??int i=0; ??while(c[i]!='\0'){ ????if('A'<=c[i] && c[i]<='Z')??c1++; ????else if('a'<=c[i] && c[i]<='z')?c2++; ????else if('0'<=c[i] && c[i]<='9')?c3++; ????else if(c[i]==' ') c4++; ????else??c5++; ????i++; ?} ??printf("%d %d %d %d %d",c1,c2,c3,c4,c5); }
案例10:斐波那契數(shù)列
1,1,2,3,5,8,是斐波那契數(shù)列,求斐波那契數(shù)列第n項
//循環(huán)法 #include<stdio.h> int main(){ ??int n; ??scanf("%d",&n); ??if(n<=2){ ????printf("1"); ????return 0; ?} ??int sum,sum1,sum2,i,sum0=0; ??sum1=sum2=1; ??for(i=3;i<=n;i++){ ????sum=sum1+sum2; ????sum2=sum1; ????sum1=sum; ?} ??printf("%d",sum); } //函數(shù)遞歸 #include<stdio.h> int func(int n){ ??if(n<=2)??return 1; ??else??return func(n-1)+ func(n-2); } int main(){ ??int n; ??scanf("%d",&n); ??printf("%d",func(n)); }
案例11:a+aa+aaa+...
求給定常數(shù)a和項數(shù)n,求S=a+aa+aaa+...的和
#include<stdio.h> int main(){ ??int a,n,sum=0,sum1=0; ??scanf("%d%d",&a,&n); ??int i; ??for(i=0;i<n;i++){ ????sum1=sum1*10+a; ????sum+=sum1; ?} ??printf("%d",sum); }
案例12:打印菱形
#include<stdio.h> int main(){ ??int n,i,j; ??scanf("%d",&n); ??for(i=1;i<=n;i++){ ????for(j=0;j<n-i;j++)?printf(" "); ????for(j=0;j<2*i-1;j++)??printf("*"); ????printf("\n"); ?} ??for(i=1;i<=n-1;i++){ ????for(j=0;j<i;j++)??printf(" "); ????for(j=0;j<2*n-1-2*i;j++)??printf("*"); ????printf("\n"); ?} }
案例13:水仙花數(shù)
水仙花數(shù)是一個3位正整數(shù),各位立方和等于該數(shù)本身,例如407=$4^{3}+0^{3}+7^{3}$求所有的水仙花數(shù)
#include<stdio.h> int main(){ ??int i,a,b,c; ??for(i=100;i<=999;i++){ ????a=i/100; ????b=i/10%10; ????c=i%10; ????if(a*a*a+b*b*b+c*c*c==i)??printf("%d\n",i); ?} }
案例14:完數(shù)
完數(shù)是指該數(shù)的因數(shù)之和等于本身,例如6=1+2+3,給定一個數(shù),判斷是不是和數(shù)。
//基礎(chǔ)判斷和數(shù) #include<stdio.h> int main(){ ??int n,i,sum=0; ??scanf("%d",&n); ??for(i=1;i<n;i++){ ????if(n%i==0)?sum+=i; ?} ??if(n==sum)?printf("yes"); ??else??printf("no"); } //找1-100000的和數(shù) #include<stdio.h> #include<math.h> int main(){ ??int j,i,sum; ??for(i=1;i<=100000;i++) { ????sum=1; ????int sqt=sqrt(i); ????for(j=2;j<=sqt;j++){ ??????if(i%j==0)?sum=sum+j+i/j; ???} ????if(sqt*sqt==i)?sum-=sqt; ????if(i==sum)?printf("%d\n",i); ?} } //函數(shù)判斷 #include<stdio.h> bool heshu(int n){ ??int i,sum=0; ??for(i=1;i<n;i++){ ????if(n%i==0)?sum+=i; ?} ??if(n==sum)?return true; ??else??return false; } int main(){ ??int n; ??scanf("%d",&n); ??printf("%d",heshu(n)); }
案例15:質(zhì)數(shù)/素數(shù)判斷
素數(shù)是因子只有1和本身的數(shù),最小的素數(shù)為2,給定一個數(shù),判斷是不是素數(shù)。
#include<stdio.h> #include<math.h> bool is_prime(int n){ ??int i,sqt=sqrt(n); ??if(n==1)??return false; ??for(i=2;i<=sqt;i++) ????if(n%i==0)?return false; ??return true; } int main(){ ??int n; ??scanf("%d",&n); ??printf("%d", is_prime(n)); }
案例16:最大公因數(shù)/最小公倍數(shù)
給兩個數(shù),求其最大公因數(shù)和最小公倍數(shù)
#include<stdio.h> int main(){ ??int m,n,r; ??scanf("%d%d",&m,&n); ??int mult=m*n; ??r=m%n; ??while(r){ ????m=n; ????n=r; ????r=m%n; ?} ??int gcd=n; ??int lcm=mult/gcd; ??printf("%d %d",gcd,lcm); }
案例17:回文字符串
字符串關(guān)于中心對稱稱為回文字符串,給一個字符串,判斷是否為回文字符串。
//代碼 #include<stdio.h> #include<string.h> int main(){ ??char c[20]; ??gets(c); ??int i; ??for(i=0;i<strlen(c)/2;i++){ ????if(c[i]!=c[strlen(c)-1-i]){ ??????printf("no"); ??????return 0; ???} ?} ??printf("yes"); } //函數(shù) #include<stdio.h> #include<string.h> bool is_huiwen(char c[]){ ??int i; ??for(i=0;i<strlen(c)/2;i++) ????if(c[i]!=c[strlen(c)-1-i])?return false; ??return true; } int main(){ ??char c[20]; ??gets(c); ??printf("%d", is_huiwen(c)); }
案例18:矩陣轉(zhuǎn)置
輸入3x3的矩陣,編寫一個函數(shù),轉(zhuǎn)置3x3矩陣回原數(shù)組,然后打印輸出
//代碼 #include<stdio.h> int main(){ ??int a[3][3]; ??int i,j,t; ??for(i=0;i<3;i++) ????for(j=0;j<3;j++) ??????scanf("%d",&a[i][j]); ??for(i=0;i<3;i++){ ????for(j=0;j<i;j++){ ??????t=a[i][j]; ??????a[i][j]=a[j][i]; ??????a[j][i]=t; ???} ?} ??for(i=0;i<3;i++){ ????for(j=0;j<3;j++) ??????printf("%d ",a[i][j]); ????printf("\n"); ?} } //函數(shù) #include<stdio.h> void func(int a[3][3]){ ??int i,j,t; ??for(i=0;i<3;i++){ ????for(j=0;j<i;j++){ ??????t=a[i][j]; ??????a[i][j]=a[j][i]; ??????a[j][i]=t; ???} ?} } int main(){ ??int a[3][3]; ??int i,j; ??for(i=0;i<3;i++) ????for(j=0;j<3;j++) ??????scanf("%d",&a[i][j]); ??func(a); ??for(i=0;i<3;i++){ ????for(j=0;j<3;j++) ??????printf("%d ",a[i][j]); ????printf("\n"); ?} }
案例19:結(jié)構(gòu)體統(tǒng)計
輸入6名學生的學號,姓名,3門課成績,將平均分最低的同學的學號,姓名,3門課成績打印出來。
#include<stdio.h> int main(){ ??struct STUDENT{ ????char id[10];//學號 ????char name[10];//姓名 ????float score[3];//三門課的成績 ????float ave;//平均分 ?}stu[6]; ??int i; ??for(i=0;i<6;i++){ ????scanf("%s%s%f%f%f",stu[i].id,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]); ????stu[i].ave=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3; ?} ??float minave=stu[0].ave; ??int minpos=0; ??for(i=0;i<6;i++){ ????if(stu[i].ave<minave) { ??????minave=stu[i].ave; ??????minpos=i; ???} ?} ??printf("%s %s %.2f %.2f %.2f",stu[minpos].id,stu[minpos].name,stu[minpos].score[0],stu[minpos].score[1],stu[minpos].score[2]); }
案例20:結(jié)構(gòu)體閏年
輸入一年中的某一天(年,月,日),求該日是這一年的第幾天。
#include<stdio.h> int main(){ ??struct DATE{ ????int year; ????int month; ????int day; ?}date; ??scanf("%d%d%d",&date.year,&date.month,&date.day); ??int n=date.day; ??int i,flag=0; ??if(date.year%4==0&&date.year%100!=0 || date.year%400==0) ????flag=1; ??if(flag && date.month>2) ????n++; ??for(i=1;i<date.month;i++){ ????if(i==1||i==3||i==5||i==7||i==8||i==10||i==12) ??????n+=31; ????else if(i==2) ??????n+=28; ????else ??????n+=30; ?} ??printf("%d",n); }
案例21:文件合并
flie1.dat和file2.dat里各有一行字符串,合并他們到新文件file3.dat
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(){ ??FILE *fp1; ??if((fp1= fopen("file1.dat","r"))==NULL){ ????printf("File can not open!\n"); ????exit(0); ?} ??FILE *fp2; ??if((fp2= fopen("file2.dat","r"))==NULL){ ????printf("File can not open!\n"); ????exit(0); ?} ??char c1[20],c2[10]; ??fscanf(fp1,"%s",c1); ??fscanf(fp2,"%s",c2); ??fclose(fp1); ??fclose(fp2); ??strcat(c1,c2); ??FILE *fp3; ??if((fp3 = fopen("file3.dat","w"))==NULL){ ????printf("File can not open!\n"); ????exit(0); ?} ??fprintf(fp3,"%s",c1); ??fclose(fp3); }
特例1:不借助fabs函數(shù)求絕對值
float my_fabs(float x){ ??if(x<0) return -x; ??else return x; }
特例2:不借助sqrt函數(shù)開方
float my_sqrt(float a){ ??float x0=1,x1; ??do{ ????x1=(x0+a/x0)/2; ????x0=x1; ?}while(my_fabs(x1*x1-a)>1e-6); ??return x1; }
特例3:不借助strlen測字符串長度
//數(shù)組下標 int my_strlen(char c[]){ ??int length=0,i=0; ??while(c[i++]!='\0') ????length++; ??return length; } //指針 int my_strlen(char c[]){ ??char *p=c; ??int length=0; ??while(*p++!='\0') ????length++; ??return length; }
特例4:不借助strcat拼接字符串
//主函數(shù)寫法 #include<stdio.h> int main(){ ??char c1[20],c2[20],*p1=c1,*p2=c2; ??gets(c1); ??gets(c2); ??while(*++p1); ??while(*p1++=*p2++); ??printf("%s",c1); } //函數(shù)寫法 #include<stdio.h> void my_strcat(char c1[],char c2[]){ ??char *p1=c1,*p2=c2; ??while(*++p1); ??while(*p1++=*p2++); } int main(){ ??char c1[20],c2[20]; ??gets(c1); ??gets(c2); ??my_strcat(c1,c2); ??printf("%s",c1); }
特例5:不借助strcmp比較字符串
#include<stdio.h> int my_strcmp(char c1[],char c2[]){ ??char *p1=c1,*p2=c2; ??while(*p1==*p2 && *p1!='\0'){ ????p1++;p2++; ?} ??return *p1-*p2; } int main(){ ??char c1[20],c2[20]; ??gets(c1); ??gets(c2); ??if(my_strcmp(c1,c2)>0)?printf("c1大"); ??else if(my_strcmp(c1,c2)<0) printf("c2大"); ??else printf("一樣大"); }
特例6:不借助strcpy復制字符串
#include<stdio.h> int main(){ ??char c1[20]="blue bird",c2[20],*p1=c1,*p2=c2; ??gets(c2); ??while(*p1++=*p2++); ??printf("%s",c1); }
代碼已上傳到筆記