漓江学堂程序设计与问题求解期末考试参考程序.docx
- 文档编号:11720891
- 上传时间:2023-03-31
- 格式:DOCX
- 页数:19
- 大小:22.05KB
漓江学堂程序设计与问题求解期末考试参考程序.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(i
{
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;i if(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;p printf("\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分
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 漓江 学堂 程序设计 问题 求解 期末考试 参考 程序