安徽大学 | 高级语言程序设计(C语言) 期末考试复习 设计题 2023

课程例题和代码公开 2023.2.25
案例1:交换变量
从键盘上输入2个变量a和b,交换他们。
//数字型 #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:三个数排序
从键盘上输入三个数,按从小到大的顺序排列。
//正常 #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); } //函数 #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]); } //从大到小,函数 #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:分数统计
输入班级人数n和每个人的成绩,求落在下面5个分数段的人数,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:字符统计
输入一段字符,求其中大写字母,小写字母,数字,空格,其他字符的个数。
//单字符 #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:斐波那契数列
1,1,2,3,5,8,是斐波那契数列,求斐波那契数列第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); } //函数递归 #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+...
求给定常数a和项数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:水仙花数
水仙花数是一个3位正整数,各位立方和等于该数本身,例如407=$4^{3}+0^{3}+7^{3}$求所有的水仙花数
#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:完数
完数是指该数的因数之和等于本身,例如6=1+2+3,给定一个数,判断是不是和数。
//基础判断和数 #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的和数 #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); } } //函数判断 #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:质数/素数判断
素数是因子只有1和本身的数,最小的素数为2,给定一个数,判断是不是素数。
#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:最大公因数/最小公倍数
给两个数,求其最大公因数和最小公倍数
#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:回文字符串
字符串关于中心对称称为回文字符串,给一个字符串,判断是否为回文字符串。
//代码 #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"); } //函数 #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:矩阵转置
输入3x3的矩阵,编写一个函数,转置3x3矩阵回原数组,然后打印输出
//代码 #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"); } } //函数 #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:结构体统计
输入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:结构体闰年
输入一年中的某一天(年,月,日),求该日是这一年的第几天。
#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函数求绝对值
float my_fabs(float x){ if(x<0) return -x; else return x; }
特例2:不借助sqrt函数开方
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测字符串长度
//数组下标 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拼接字符串
//主函数写法 #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); } //函数写法 #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); }
代码已上传到笔记