漓江学堂程序设计与问题求解期末考试参考程序.docx
《漓江学堂程序设计与问题求解期末考试参考程序.docx》由会员分享,可在线阅读,更多相关《漓江学堂程序设计与问题求解期末考试参考程序.docx(19页珍藏版)》请在冰点文库上搜索。
漓江学堂程序设计与问题求解期末考试参考程序
A级难度试题:
(最高难度:
A档--只需完成一题即可,随机挑选,满分100分)
1、编程实现单链表的创建、查询、插入、删除等操作,每次操作之后都要输出单链表,要求在创建单链表的节点时,以输入-1表示结束,所有操作都要求函数实现。
#include
typedefstructnode
{
intdata;
structnode*next;
}NODE;//定义结点数据类型
constintLEN=sizeof(NODE);//一般建议用const常量,而不要用define定义符号常量
voidPrint(NODE*h)//输出链表的内容
{
NODE*q;
q=h->next;
while(q!
=NULL)//i:
=0;while(idata)
{
printf("本结点地址%x;数据:
%d,下一个结点地址%x\n",q,q->data,q->next);
q=q->next;
}
}
voidInsert(intx,NODE*h)//将数据x插入表头为h的链表中
{
NODE*p=(NODE*)malloc(LEN);
p->data=x;
p->next=h->next;
h->next=p;
Print(h);
}
NODE*Create(intn)//创建有n个结点的链表,注意最后生成的结点的数据是与输入顺序相反的
{
intx;
NODE*q;
NODE*p=(NODE*)malloc(LEN);
p->next=0;
p->data=n;//链表表头存放链表中有多少个结点
printf("请输入整数,若输入-1则表示创建结束:
");
while
(1)
{
scanf("%d",&x);
if(x==-1)break;
Insert(x,p);//插入新的结点
}
Print(p);
returnp;
}
NODE*Find(intx,NODE*h)//在表头为h的链表中查找x是否存在
{
NODE*p;
p=h->next;
while(p!
=NULL)
{
if(p->data==x)return1;
p=p->next;
}
return0;
}
voidDel(intx,NODE*h)//删除值为x的结点
{
NODE*p,*pre;
pre=h;
p=h->next;
while(p!
=NULL&&p->data!
=x){pre=p;p=p->next;}
if(p==NULL)printf("删除不成功");
else
{
pre->next=p->next;
free(p);
}
}
2、编程创建一个有序单链表,要求从键盘随机输入若干整数,将它们按照从小到大的顺序链接起来,输入以-1表示结束,输入时的数不能是有序的,创建和输出链表的操作都要求函数实现。
voidSortedInsert(intx,NODE*h)//将数据有序插入,形成有序的链表
{
NODE*pre,*p;
NODE*q=(NODE*)malloc(LEN);
q->data=x;
pre=h;p=h->next;
while(p!
=NULL&&p->data{
pre=p;
p=p->next;
}
pre->next=q;q->next=p;
}
NODE*Create()
{
intx;
NODE*head=(NODE*)malloc(LEN);
head->next=0;head->data=0;
do{
scanf("%d",&x);
if(x!
=-1)
SortedInsert(x,head);
}whilex!
=-1);
returnhead;
}
voidmain()
{
NODEhead=Create();
Print();//print函数用上面一题的即可,数据结构定义也是
}
3、编程在当前目录下创建一个文件studinfo.txt,随机的从键盘输入10个学生记录(包括学号、姓名、性别、身高、地址等信息存入到该文件,然后将学生按照身高从高到低的顺序进行排序,并将排序之后的结果换行后保存到文件原始信息的后面。
typedefstructstudent{
charstno[20],name[20],sex,address[50];//用F表示女,M表示男
floatheight;
}STU;
STUs[10];//用于保存学生的数据
voidsort(STUs[],intn)//对有n个学生的数据进行排序,具有通用性
{
}
voidInput(STUs[],intn)//输入n个学生的信息,同时保存到数组和文件中
{
inti;
FILE*fp=fopen("student.txt","w");//以写的方式打开
if(fp==NULL)
{
printf("cantopenfile!
");
exit
(1);//includestdlib.h就能使用exit函数
}
for(i=0;i{
scanf("%s%s%s%f%c",stu[i].stno,stu[i].name,stu]i].address,&stu[i].height,&stu[i].sex);
fprintf(fp,"%s%s%s%f%c\n",stu[i].stno,stu[i].name,stu]i].address,stu[i].height,stu[i].sex);
}
fclose(fp);
}
voidOutput(STUs[],intn)
{
inti;
FILE*fp=fopen("student.txt","a");//以追加形式打开文件
if(fp==NULL)
{
printf("cantopenfile!
");
exit
(1);//includestdlib.h就能使用exit函数
}
for(i=0;i{
fprintf(fp,"%s%s%s%f%c\n",stu[i].stno,stu[i].name,stu]i].address,stu[i].height,stu[i].sex);
}
fclose(fp);
}
voidmain()
{
Input(s,10);
sort(s,10);
Output(s,10);
}
4、编程在当前目录下创建一个文件address.txt文件,随机地从键盘输入10个好友的记录(包括姓名、性别、电话号码、城市等)信息存入到文件中,分别提供3种查询方式:
通过姓名查电话,通过城市查在这个城市的所有好友,通过电话号码查人,这3种查询都要求用函数实现。
(注意输入数据的时候至少保证有2个以上好友在同一个城市的情况发生2次)
//本题的关键是要能查出在同一城市的多个好友,所以查询时,一定要挨个数据去比较,而不是查到就结束,数据输入和保存参考上题即可
5、假设一个班上有48个同学,让系统随机地产生48个同学的姓名、性别、年龄、身高等信息。
输出48个同学的原始信息,每行8个,分6行输出。
然后将数据重新根据性别和身高排序,女生从低到高排在前面,男生从低到高排在后面,然后再将排序之后的结果输出他们的信息,女生在前,男生在后。
【特别要求:
(1)必须是全部排序完了之后再进行输出,不能是女生排完后输出女生的,男生排完后输出男生的;
(2)排序通过函数调用实现;(3)输出通过函数调用实现;(4)要求随机产生的姓名在3个至8个字符之间长度的随机的26个英文字符构成,年龄在18-20之间,身高在160-190公分之间。
(5)随机函数的备忘使用示例:
#include
#include
#include
voidmain(){ inti;
srand((unsigned)time(NULL));/*将当前时间设置成随机函数的种子,每次产生的数都不一样*/
/*输出10个随机数*/
for(i=0;i<10;i++) printf(“%d\n”,rand());
}
可能的运行结果:
21987......................】
B级难度试题:
(B档--需完成系统随机挑选出来的2道题,满分90分)
1、将一个正整数分解质因数。
(例如:
输入90,打印出90=2*3*3*5。
)用自定义函数实现。
每个合数都可以写成几个质数相乘的形式。
其中每个质数都是这个合数的因数,叫做这个合数的分解质因数
#include
inta[20];
intfjzys(intk)
{
inti=2,j=0;
for(;i<=k;i++)//当因数i<=k时,实现继续寻找质因数
for(;k%i==0;j++)//当k整除当前因数,实现该循环,每次循环下标j自加1
{
k/=i;//使k=k/i
a[j]=i;//存入因数
}
returnj;
}
voidmain()
{
intm,b,j;
printf("请输入一个整数\nk=");
scanf("%d",&m);
j=fjzys(m);
for(b=0;b<(j-1);b++)
{
printf("%d",a[b]);
printf("*");
}
printf("%d\n",a[j-1]);//输出最后一个质因数
}
2、一个数如果恰好等于它的因子之和,这个数就称为“完数”。
例如6=1+2+3.编程输出10000以内的所有完数。
用自定义函数实现。
#include
voidmain()
{
intm,i,s;
printf("10000以内的完数有:
\n");
for(m=1;m<=10000;m++)
{
s=0;//初始化因子之和s为0
for(i=1;iif(m%i==0)//如果m能整除i,则i为m的因子
s=s+i;//将因子累加
if(s==m)
printf("%d\t",s);
}
}
3、编程实现:
任意给定一个十进制的整数,将其转换成二进制,按位将其存放到数组中,然后输出,要求数制转换通过自定义函数来实现。
#include
intchange(intx,inta[])
{
intn=-1;
while(x!
=0)
{
n++;
a[n]=x%2;
x=x/2;
}
returnn;
}
voidmain()
{
intx,a[20],i,n;
printf("请输入一个十进制数:
\n");
scanf("%d",&x);
n=change(x,a);
printf("转化为二进制数之后结果为:
\n");
for(i=n;i>=0;i--)printf("%1d",a[i]);
printf("\n");
}
4、从键盘输入某班10个学生的成绩和学号,然后从键盘任意输入一个学生的学号,查找出他的成绩并输出,若未找到,给出相应提示。
要求通过自定义函数实现查找功能。
(要求用结构体类型来表示学生的信息--学号和成绩)
#include
#include
structStudent
{
charnumber[20];
intscore;
};
intlength(char*a)
{
inti=0;
while(a[i]!
='\0')
{
i++;
}
returni;
}
intequal2(char*a,char*b)
{
intlength(char*a);
intlena,lenb,i;
lena=length(a);
lenb=length(b);
if(lena!
=lenb)return0;
for(i=0;a[i]!
='\0';i++)
{
if(a[i]!
=b[i])
return0;
}
return1;
}
voidmain()
{
structStudentstu[20];
intequal2(char*a,char*b);
inti;
for(i=0;i<10;++i)
{
printf("请输入学号和成绩\n");
scanf("%s%d",&stu[i].number,&stu[i].score);
}
charsnumber[20];
printf("请输入要查找的学号:
");
scanf("%s",snumber);
for(i=0;i<10;++i){
if(equal2(snumber,stu[i].number)==1)
{
printf("学生%s的成绩是:
%d\n",snumber,stu[i].score);
break;
}
}
if(i>=10)
{
printf("没有学号为%s的学生!
\n",snumber);
}
}
5、编程实现:
输入10名职工的姓名及计算机水平考试的成绩,输出及格人数和及格的职工信息。
要求:
职工信息的输入和输出分别通过自定义函数来实现,职工信息要求定义成结构体类型。
#include
#include
typedefstruct
{
charname[20];
floatscore;
}datatype;
voidinput(datatypework[]);
voidprint(datatypework[]);
voidmain()
{
datatypework[10];
input(work);
print(work);
}
voidinput(datatypework[])
{
inti;
printf("请输入10名职工的姓名和成绩:
\n");
for(i=0;i<10;i++)
scanf("%s%f",work[i].name,&work[i].score);
}
voidprint(datatypework[])
{
inti,num=0;
printf("及格的同学有:
\n");
for(i=0;i<10;i++)
{
if(work[i].score>60)
{
printf("%s",work[i].name);
num++;
}
}
printf("\n");
printf("及格人数为%d人",num);
}
6、编程实现:
任意输入一组不多于10个的升序排列的若干个整数,任意输入不多于5个的整数(-1作为输入结束标志),将其插入到该序列中,使其依然有序。
要求:
通过自定义函数实现将一个整数插入到一个有序序列中,使其依然有序。
#include
voidins(inta[],int*n,intx);
voidmain()
{
inta[30],x,m,i;
m=-1;printf("请输入一组不多于10个的升序排列的若干个整数(-1作为输入结束标志)\n");
scanf("%d",&x);
while(x!
=-1)
{
m++;
a[m]=x;
scanf("%d",&x);
}
printf("请输入一组不多于5个的升序排列的若干个整数(-1作为输入结束标志)\n");
scanf("%d",&x);
while(x!
=-1)
{
ins(a,&m,x);
scanf("%d",&x);
}
printf("插入后结果为:
\n");
for(i=0;i<=m;i++)
printf("%5d",a[i]);
}
voidins(inta[],int*n,intx)
{
inti=*n;
while(a[i]>x&&i>=0)
{
a[i+1]=a[i];
i--;
}
a[i+1]=x;
(*n)++;
}
7、将一个十六进制整数转换为十进制整数。
要求通过自定义函数实现。
#include
#defineMAX1000
voidmain()
{
inthtoi(chars[]);
intc,i,flag,flag1;
chart[MAX];
i=0;
flag=0;
flag1=1;
printf("请输入一个十六进制数:
");
while((c=getchar())!
='\0'&&i{
if(c>='0'&&c<='9'||c>='a'&&c<='f'||c>='A'&&c<='F')
{
flag=1;
t[i++]=c;
}
elseif(flag)
{
t[i]='\0';
printf("转化为十进制数为%d",htoi(t));
printf("\n还要继续吗?
(输入N或n终止)");
c=getchar();
if(c=='N'||c=='n')flag1=0;
else
{
flag=0;
i=0;
printf("\n请输入一个十六进制数:
");
}
}
}
}
inthtoi(chars[])
{
inti,n;
n=0;
for(i=0;s[i]!
='\0';i++)
{
if(s[i]>='0'&&s[i]<='9')n=n*16+s[i]-'0';
if(s[i]>='a'&&s[i]<='f')n=n*16+s[i]-'a'+10;
if(s[i]>='A'&&s[i]<='F')n=n*16+s[i]-'A'+10;
}
returnn;
}
8、将一个字符串的辅音字符复制到另一个字符串中。
要求源字符串从键盘输入。
复制功能要通过自定义函数实习。
#include
voidmain()
{
voidcpy(char[],char[]);
charstr[80],c[80];
printf("请输入一段字符串:
");
gets(str);
cpy(str,c);
printf("其中的辅音字符为:
%s\n",c);
}
voidcpy(chars[],charc[])
{
inti,j;
for(i=0,j=0;s[i]!
='\0';i++)
{
if(s[i]!
='a'&&s[i]!
='A'&&s[i]!
='e'&&s[i]!
='E'&&s[i]!
='i'&&s[i]!
='I'&&s[i]!
='o'&&s[i]!
='O'&&s[i]!
='u'&&s[i]!
='U')
{
c[j]=s[i];
j++;
}
}
c[j]='\0';
}
9、键盘随机输入10个整数到数组中,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
要求这3个动作都要用自定义函数实现。
#include
voidmain()
{
voidinput(int*num);
voidexchange(int*num);
voidoutput(int*num);
intnum[10];
input(num);
exchange(num);
output(num);
}
voidinput(int*num)
{
inti;
printf("请输入十个整数:
\n");
for(i=0;i<10;i++)scanf("%d",&num[i]);
}
voidoutput(int*num)
{
int*p;
printf("处理后结果为:
\n");
for(p=num;pprintf("\n");
}
voidexchange(int*num)
{
int*max,*min,temp,*p;
max=min=num;
for(p=num+1;p{
if(*p>*max)max=p;
elseif(*p<*min)min=p;
}
temp=num[0];
num[0]=*max;
*max=temp;
if(max=num)max=min;
{
temp=num[9];
num[9]=*min;
*min=temp;
}
}
10、有n个人围成一圈,顺序排号。
从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
#include
voidmain()
{
inti,k,m,n,num[500],*p;
printf("请输入总人数:
");
scanf("%d",&n);
p=num;
for(i=0;i{
*(p+i)=i+1;
}
i=0;k=0;m=0;
while(m{
if(*(p+i)!
=0)k++;
if(k==3)
{
*(p+i)=0;
k=0;
m++;
}
i++;
if(i==n)i=0;
}
while(*p==0)p++;
printf("最后留下来的是原来第%d个人.",*p);
}
C级难度试题:
(C档--需完成系统随机挑选出来的2道题,满分80分