一.填空题(共2题,10.0分)
1
5.14 下面的程序会将产生的n个随机3位数(100~999)构成一个动态存储的环,然后将其中第m个数从环中删除。其中n,m均是从键盘输入的整数,并大于等于1,m可以大于n。程序中有三个空缺请补齐。(不要有空格和不必要的圆括号)
源码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void main()
{
int *s,n,m,i;
scanf("%d",&n);
s=malloc(n*sizeof(int));
srand((unsigned)time(NULL));
for(i=0;i<n;i++)
{
s[i]=rand()%900+100;
printf("%d:%d ",i+1,s[i]);
}
printf("\n");
scan-1)%n;
for(i=m;i<nf("%d",&m);
m=(m-1;i++)
s[i]=s[i+1];
n=n-1;
for(i=0;i<n;i++)
printf("%d:%d ",i+1,s[i]);
free(s);
}
2
6.1 下面的程序用于求两个分数之和,例如,。程序中有四个空缺请补齐。(不要添加空格和圆括号)
#include<stdio.h>
typedef struct
{
int num; //分子
int den; //分母
} Fraction;
//递归求最大公约数,用于约分
int gcd(int m,int n)
{
if(m%n==0)
{
return n;
}
else
{
return gcd(n,m%n);
}
}
//分数相加函数
Fraction add(Fraction a,Fraction b)
{
int den,num,g;
Fraction r;
den=a.den*b.den; //求分母
num=a.num*b.den+a.den*b.num; //求分子
g=gcd(den,num); //求最大公约数
r.den=den/g; //结果的分母
r.num=num/g; //结果的分子
return r;
}
void main()
{
Fraction a = {1,10}, b = {3,4},c;
c=add(a,b);
printf("1/10+3/4=%d/%d",c.num,c.den);
}
二.简答题(共1题,5.0分)
1
14-1 建立一种新的类型称为Complex,包含real和imag两个域。使用Complex类型定义两个复数变量,从键盘输入两个变量的值,计算这两个复数的和与乘积并一行以一个空格分隔显示结果。(不要任何提示文字,结果后不用回车)
例如,分两行输入:3,3 与1,-2,在一行显示:4+1j 9-3j。
/*
时间:2021-6-10
作者:童话
环境:Win 10 、 DEV C++
*/
#include<stdio.h>
typedef struct
{
int real; //实部
int imag; //虚部
} Complex;
void main()
{
Complex x,y;
int a,b,c,d;
scanf("%d,%d",&x.real,&x.imag);
scanf("%d,%d",&y.real,&y.imag);
a=x.real+y.real; //和的实部
b=x.imag+y.imag; //和的虚部
c=x.real*y.real - x.imag*y.imag; //积的实部
d=x.real*y.imag + x.imag*y.real; //积的虚部
printf("%d",a);
if(b>0)
printf("+%dj ",b);
else if(b<0)
printf("%dj ",b);
else
printf(" ");
printf("%d",c);
if(d>0)
printf("+%dj",d);
else if(d<0)
printf("%dj",d);
}
三.程序题(共2题,10.0分)
1
6.2 要编程排序一个班的学生学习成绩,成绩记录类型Record和清单类型List设计如下:typedef struct {
char no[13];
int score;
} Record;
typedef Record List[10];
请编程,先1行输入班级号和学生人数,以空格分隔,班级号就是学号的前9位,例如201925804 4
然后1行1个输入每个学生的顺序号和成绩,以空格分隔,顺序号就是学号的后3位,例如001 80
再将输入的学生按成绩从大到小排序后,将学生的完整学号和成绩1行1个显示,以1个空格分隔,例如201925804001 80。
/*
时间:2021-6-10
作者:童话
环境:Win 10 、 DEV C++
*/
#include<stdio.h>
#include<string.h>
typedef struct
{
char no[13];
int score;
} Record;
typedef Record List[10];
void main()
{
List stugrade;
int i,j,t,n;
char sameno[13],lastno[4],temp[13];
scanf("%s %d",sameno,&n);
//输入
for(i=0;i<n;i++)
{
strcpy(stugrade[i].no,sameno);
scanf("%s %d",lastno,&stugrade[i].score);
strcat(stugrade[i].no,lastno);
}
//冒泡排序
for(i=0; i<n-1; i++) //比较n-1轮
{
for(j=0; j<n-1-i; j++) //每轮比较n-1-i次,
{
if(stugrade[j].score < stugrade[j+1].score)
{
t = stugrade[j].score;
strcpy(temp,stugrade[j].no);
stugrade[j].score = stugrade[j+1].score;
strcpy(stugrade[j].no,stugrade[j+1].no);
stugrade[j+1].score = t;
strcpy(stugrade[j+1].no,temp);
}
}
}
//输出
for(i=0;i<n;i++)
{
printf("%s %d",stugrade[i].no,stugrade[i].score);
if(i<n-1)
{
printf("\n");
}
}
}
2
6.4 请编写程序输入n个1~3位十六进制数(n由键盘输入,n<=10),保存到List类型的变量中(List类型定义下面已提供),然后将这些十六进制数转换为十进制数仍然保存到该变量中,求这些数的和并显示结果。(显示结果不用提示文字、不回车)typedef union {
char strcj[4];int intcj;
} List[10];
例如:输入4
a
b
c
d
显示结果
10+11+12+13=46
有大问题!
/*
时间:2021-6-10
作者:童话
环境:Win 10 、 DEV C++
*/
#include<stdio.h>
#include<string.h>
typedef union
{
char strcj[4];
int intcj;
} List[10];
int HextoDec(char hex[])
{
int i,dec=0;
int n = 0;
char ch;
while(hex[n]!=0)
{
n++;
}
for(i=0;i<n;i++)
{
printf("~~%c~~\n",hex[i]);
ch = hex[i];
if(ch>='0'&&ch<='9')
dec+=((int)((ch-'0')) * (n-i-1) * 16);
else if(ch>='a'&&ch<='f')
dec+=((int)((ch-'a')) * (n-i-1) * 16);
else if(ch>='A'&&ch<='F')
dec+=((int)((ch-'A')) * (n-i-1) * 16);
printf("~~%d~~\n",dec);
}
return dec;
}
void main()
{
List hextodec;
int n,i,sum=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",hextodec[i].strcj);//输入
}
for(i=0;i<n;i++)
{
hextodec[i].intcj = HextoDec(hextodec[i].strcj);//转换
}
for(i=0;i<n;i++)
{
printf("%d",hextodec[i].strcj);
if(i<n-1)
{
printf("+");
}
else
{
printf("=");
}
sum += hextodec[i].strcj;
}
printf("%d",hextodec[i].strcj);
}