安徽大学 | 高级语言程序设计(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);
}
代码已上传到笔记

