欢迎光临散文网 会员登陆 & 注册

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

2023-02-28 01:27 作者:超人就是zdc233  | 我要投稿

课程例题和代码公开 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);
}


代码已上传到笔记

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

分享到微博请遵守国家法律