C语言程序设计7
- 格式:ppt
- 大小:600.50 KB
- 文档页数:37
C语言程序设计实验实验报告7实验名称:链表实现学生信息管理系统实验目的:通过设计链表实现学生信息管理系统,掌握链表的操作方法及其应用。
实验内容:设计一个学生信息结构体,包括学号、姓名、性别、年龄和成绩五个成员变量,并选择链式结构存储这些数据。
实现以下功能:1. 添加学生信息:从键盘输入学号、姓名、性别、年龄和成绩等信息,添加到链表中。
2. 删除学生信息:从链表中删除指定学号的学生信息。
5. 按成绩排序:按学生的成绩从高到低排序,并输出所有学生的信息。
7. 退出程序:退出学生信息管理系统。
实验方法:1. 设计学生信息结构体,定义链表节点结构体,并编写初始化链表和销毁链表的函数。
2. 编写添加学生信息函数,新建链表节点并插入链表末尾。
3. 编写删除学生信息函数,根据学号查找需要删除的节点,先将该节点从链表中删除,再释放节点空间。
4. 编写修改学生信息函数,根据学号查找需要修改的节点,并修改其成员变量。
6. 编写按成绩排序函数,使用冒泡排序法对链表进行排序,并输出所有学生的信息。
7. 编写输出所有学生信息函数,遍历链表并输出每个节点的信息。
8. 完成学生信息管理系统的主函数,实现菜单及相应功能的选择。
实验结果:依次选择菜单中的各个功能,添加、修改、删除、查找、排序和输出学生信息都能实现。
经测试,程序稳定运行,功能正常,符合需求。
本次实验主要让我们掌握了链式结构的概念、链表节点的定义、链表的初始化、插入、查找、删除和销毁链表的操作方法,以及在实际应用中如何使用链表来实现数据管理。
虽然链表操作相对于数组稍微有些繁琐,但其可以灵活处理数据结构的长度变化,具有更高的可扩展性和更好的操作效率,可以更好的适应各种实际需求。
在实验中,还需要注意节点指针的正确使用、各个函数之间的调用关系和输入输出数据格式的合理选择等问题,以保证程序能够正常运行。
同时,还需要保持认真细致的态度,严格按照实验需求和要求来完成每个步骤,以达到更好的实验效果和运行效率。
实验七 参考答案(参考答案)(1) (sy7-1.c )请编写函数fun ,它的功能是:计算并输出n (包括n )以内能被5 或9 整除的所有自然数的倒数之和。
例如,若主函数从键盘给n 输入20后,则输出为s=0.583333。
注意:n 的值要求不大于100。
算法分析:使用for 循环i ,遍历n 包含n 以内的所有整数,逐一判断每个i ,是否满足条件(能被5 或9 整除),如果满足,则把它的倒数累加到累加器里。
注意:i 的倒数要表示成:1.0/i;参考子函数如下:double fun(int n){double sum=0;int i;for(i=5;i<=n;i++)if(i%5==0||i%9==0)sum=sum+1.0/i;return sum;}(2) (sy7-2.c ) 请编写函数fun ,其功能是:根据以下公式计算s ,并计算结果作为函数值返回,n 通过形参传入。
n s ⋯++++⋯++++++=321132112111例如:若n 的值为11时,函数的值为1.83333算法分析:等式右边从第二项(i=2)开始,其分母等于前一项的分母加上i ;一共有n 项;求出每项的分母,然后把每项进行累加。
参考子函数如下:float fun(int n){float sum=1; //sum 中已经累加了第一项的值int i,m=1; //m 表示每项的分母;for(i=2;i<=n;i++){ m=m+i;sum=sum+1.0/m;}return sum;}(3) (sy7-3.c)请编写函数fun,其功能是:将两个两位数的正整数a、b 合并形成一个整数放在c 中。
合并的方式是:将 a 数的十位和个位依次放在c 数的十位和千位上,b 数的十位和个位数依次放在c 数的个位和百位上。
例如,当a=45,b=12,调用该函数后,c=5241。
算法分析:对一个两位数n,它的各位可以通过n%10求的,它的十位数可以通过n/10求的;所以分别用上述方法求的a和b的个位和十位,同时按照要求累加到c里。
二级C语言程序设计-7(总分100,考试时间90分钟)一、选择题1. 构成C程序的三种基本结构是A.顺序结构、转移结构、递归结构 B.顺序结构、嵌套结构、递归结构 C.顺序结构、选择结构、循环结构 D.选择结构、循环结构、嵌套结构2. C语言编译程序的功能是A.执行一个C语言编写的源程序 B.把C源程序翻译成ASCII 码 C.把C源程序翻译成机器代码 D.把C源程序与系统提供的库函数组合成一个二进制执行文件3. 下列形式中不合法的常量是A.2.E8 B.-.28 C.-028 D.2e-84. 以下不是C语言字符型或字符串常量的是A."It's" B."0" C.'a=0' D.'\010'5. C语言程序中,若函数无返回值,则应该对函数说明的类型是A.intB.doubleC.charD.void6. 若变量已正确定义并赋值,则错误的赋值语句是A.a+=a+1;B.a=sizeof(double);C.a=d‖c;D.a+1=a;7. 若有定义:int a=1,b=2,c=3;,则执行表达式(a=b+c)‖(++b)后a,b,c的值依次为A.1,2,3 B.5,3,2 C.5,2,3 D.5,3,38. 有以下程序#include <stdio.h>main(){ int k=10;printf("%4d, %o, %x\n", k, k, k);}程序的运行结果是(□代表一个空格)A.10,12,a B.□□10,012,a C.010,12,a D.□□10,12,a9. 设有:char s[5], c;,则调用函数scanf能正确给s和c读入数据的是A.scanf("%s%c", s,c); B.scanf("%d%c", &s, &c); C.scanf("%d%c", s, &c); D.scanf("%s%c", s, &c);10. 设x,y,z均为实型变量,代数式在C语言中的正确写法是A.x/y*zB.x%y%zC.x/y/zD.x*z/y11. 有以下程序#include<stdio.h>main(){ int i, j, k, a=5, b=6;i=(a==b)?++a: --b;j=a++; k=b; printf("%d, %d, %d\n", i, j, k);}程序的运行结果是A.7,6,5 B.5,5,5 C.7,5,5 D.5,6,512. 设变量x为long int型并已正确赋值,以下表达式中能将x的百位上的数字提取出的是A.x/10%100B.x%10/100C.x%100/10D.x/100%1013. 有以下程序#include<stdio.h>main(){ int i, j, x=0;for(i=0; i<2; i++){ x++;for(j=0; j<=3; j++){if(j%2==0) continue; x++; }x++;}printf("x=%d\n", x);}程序的运行结果是A.x=4 B.x=6 C.x=8 D.x=1214. 有以下程序#include<stdio.h>main(){ int sum=0, x=5;do{sum+=x; }while(!--x);printf("%d\n", sum);程序的运行结果是A.0 B.5 C.14 D.1515. 有以下程序#include<stdio.h>main(){ char ch='Z';ch=(ch-'A'+1)%26+'A'; putchar(ch);程序的运行结果是A.Z B.Y C.B D.A16. 以下函数的功能是:计算a的n次方作为函数值返回double fun(double a, int n){ int i; double s=1.0;for(i=1; i<=n; i++) s=______;return 8;}为实现上述功能,函数中下划线处应填入的是A.s*i B.s*a C.s+i*i D.s+a*a17. 在C语言程序中,下列说法正确的是A.函数的定义可以嵌套,但函数的调用不可以嵌套 B.函数的定义不可以嵌套,但函数的调用可以嵌套 C.函数的定义和调用均不可以嵌套 D.函数的定义和调用均可以嵌套18. 若主函数中有定义语句:int a[10],b[10],c;,在主函数前定义的fun函数首部为:void fun(int x[]),则以下选项中错误的调用语句是A.fun(b); B.fun(&c); C.fun(&a[3]); D.fun(b[1]);19. 有以下程序#include<stdio.h>main(){int k, n=0; char c, str[]="teach";for(k=0; str[k]; k++){ c=str[k];switch(k){case 1: case 3: case 5: putchar(c); printf("%d", ++n); break;default: putchar('N');}}}程序的运行结果是A.Ne1NN B.e1a2e3 C.Ne1Nc2N D.Na1NNNN20. 以下叙述中错误的是A.同一个数组中所有元素的类型相同 B.不可以跳过前面的数组元素,给后面的元素赋初值 C.定义语句:int a[10]={0};,给a数组中所有元素赋初值0 D.若有定义语句:int a[4]={1, 2, 3, 4, 5};,编译时将忽略多余的初值21. 执行以下程序段后,s的值为int a[]={1, 2, 3, 4, 5, 6, 7, 8, 9}, s=0, k;for(k=0; k<8; k+=2) s+=*(a+k);A.13 B.16 C.17 D.4522. 有以下程序#include<stdio.h>#define N 4void fun(int a[][N], int b[]){ int i;for(i=0; i<N; i++) b[i]=a[i][N-1-i];}main(){ int x[N][N]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}, y[N], i;fan(x, y);for(i=0; i<N; i++) printf(:%d,", y[i]);printf("\n");}程序的运行结果是A.1,2,3,4, B.3,6,9,12, C.4,7,10,13, D.1,5,9,13,23. 有以下程序#include <stdio.h>#include<string.h>main(){char str[]={"Hello, Beijing"};printf("%d, %d\n", strlen(str), sizeof(str));}程序的运行结果是A.13,13 B.13,14 C.13,15D.14,1524. 有以下程序#include<stdio.h>void fun(char(*p)[6]){ int i;for(i=0; i<4; i++) prinff("%c", p[i][i]);printf("\n");}main(){ char s[6][6]={"ABCDE", "abcde", "12345", "FGHIJ", "fghij", "54321"};fun(s);}程序的运行结果是A.A a 1 F B.A b 3 I C.A B C D D.f g h i j25. 有以下程序#include<stdio.h>int fun(int n){ if(n) return fun(n-1)+n;else return 0;}main(){printf("%d\n", fun(3)); }程序的运行结果是A.4 B.5 C.6 D.726. 有以下程序#include<stdio.h>#define M 5#define f(x, y) x*y+Mmain(){ int k;k=f(2, 3)*f(2, 3);printf("%d\n", k);}程序的运行结果是A.22 B.41 C.100 D.12127. 有以下定义struet data{ int i; char c; double d; } x;以下叙述中错误的是A.x的内存地址与x.i的内存地址相同 B.struct data是一个类型名 C.初始化时,可以对x的所有成员同时赋初值 D.成员i、c和d占用的是同一个存储空间28. 有以下程序#include <stdio.h>#include<string.h>typedef struet{ char name[9]; char sex; float score[2]; }STU;void f(STU *a){ strcpy(a->name, "Zhao");a->sex='m'; a->score[1]=90.0;main(){ STU c={"Qian", 'f', 95.0, 92.0}, *d=&c;f(d); printf("%s, %c, %2.0f, %2.0f\n", d->name, c.sex, c.seore[0], c.score[1]);}程序的运行结果是A.Qian,f,95,92 B.Zhao,f,95,90 C.Zhao,m,95,90 D.Zhao,f,95,9229. 若有以下定义struet tt{char name[10]; char sex; } aa={"aaaa", 'F'}, *p=&aa;则错误的语句是 A.scanf("%c", aa.sex); B.aa.sex=getchar(); C.printf("%c\n", (*p).sex); D.printf("%c\n", p->sex);30. 若有说明:typedef struet {int a; char c; }W;则以下叙述正确的是A.编译后系统为W分配5个字节 B.编译后系统为W分配6个字节 C.编译后系统为W分配8个字节 D.编译后系统不为W分配存储空间二、程序填空题1. 程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。
#include<stdio.h>main(){int a[10],n,sum=0,i;float ave;printf("enter n:\n");scanf("%d",&n);printf("enter %d ge zheng shu:\n",n);for(i=0;i<n;i++){scanf("%d",&a[i]);sum=sum+a[i];}ave=1.0*sum/n;printf("ave=%.2f\n",ave);}/*练习7-2*/#include<stdio.h>main(){int a[10],n,i;printf("enter n:\n");scanf("%d",&n);printf("enter %d ge zheng shu:\n",n);for(i=0;i<n;i++){printf("第%d个:\n",i+1);scanf("%d",&a[i]);printf("倒序:\n");while(a[i]!=0){printf("%d",a[i]%10);a[i]=a[i]/10;}printf("\n");}}#include<stdio.h>main(){int a[5],x,i,k=0;printf("enter 5 ge zheng shu:\n");for(i=0;i<5;i++)scanf("%d",&a[i]);printf("enter x:\n");scanf("%d",&x);for(i=0;i<5;i++)if(a[i]==x){printf("xia biao wei : %d\n",i);k=1;}if(k==0)printf("Not Found\n");}/*练习7-4*/#include<stdio.h>main(){int a[10],n,i,k=0,x,max;printf("enter n:\n");scanf("%d",&n);printf("enter %d ge zheng shu:\n",n);for(i=0;i<n;i++)scanf("%d",&a[i]);max=a[0];for(i=1;i<=n-1;i++)if(max<a[i]){max=a[i];k=i;}printf("max=%d xia biao=%d",max,k);x=a[n-1];a[n-1]=a[k];a[k]=x;printf("\n");for(i=0;i<n;i++)printf(" %d ",a[i]);printf("\n");}/*练习7-11*/#include<stdio.h>main(){char str[80];int i,j,count=0;printf("输入一个以回车符结束的字符串:\n");i=0;while((str[i]=getchar())!='\n')i++;str[i]='\0';printf("再输入一个字符:\n");str[80]=getchar();for(j=0;j<=i-1;j++)if(str[80]==str[j])count++;printf("%c字符在字符串中出现的次数为:%d\n",str[80],count);for(j=0;j<=i-1;j++)putchar(str[j]);printf("\n");}/*习题七1*/#include<stdio.h>main(){int x,y,n,a[10],i,min,max;printf("输入n:\n");scanf("%d",&n);printf("输入%d个整数:\n",n);for(i=0;i<n;i++)scanf("%d",&a[i]);min=0;for(i=1;i<n;i++)if(a[min]>a[i])min=i;max=0;for(i=1;i<n;i++)if(a[max]<a[i])max=i;x=a[min];a[min]=a[0];a[0]=x;y=a[max];a[max]=a[n-1];a[n-1]=y;for(i=0;i<n;i++)printf("%4d",a[i]);printf("\n");}/*习题七2*/#include<stdio.h>main(){int x,n,a[10],i,j,max;printf("输入n:\n");scanf("%d",&n);printf("输入%d个整数:\n",n);for(i=0;i<n;i++)scanf("%d",&a[i]);for(i=1;i<n;i++){ max=i-1;for(j=i;j<n;j++)if(a[max]<a[j])max=j;x=a[max];a[max]=a[i-1];a[i-1]=x;}for(i=0;i<n;i++)printf("%4d",a[i]);printf("\n");}/*习题七4*/#include<stdio.h>main(){int m,n,a[6][6],i,j,b[6]={0};printf("输入m:\n");scanf("%d",&m);printf("输入n:\n");scanf("%d",&n);printf("输入%d和%d的矩阵:\n",m,n);for(i=0;i<m;i++){for(j=0;j<n;j++){scanf("%d",&a[i][j]);b[i]=b[i]+a[i][j];}}printf("shu chu:\n");for(i=0;i<m;i++){for(j=0;j<n;j++)printf(" %d",a[i][j]);printf("\n");}printf("shu chu hang he :\n");for(i=0;i<m;i++)printf("%4d",b[i]);printf("\n");}/*习题7.6*/#include<stdio.h>main(){char str[80];int i,j;printf("输入一个以回车符结束的字符串:\n");i=0;while((str[i]=getchar())!='\n')i++;printf("倒序输出:\n");for(j=i-1;j>=0;j--)putchar(str[j]);printf("\n");}/*新7.6*/#include<stdio.h>main(){int a[10],i,n;printf("输入整数n:\n");scanf("%d",&n);printf("输入%d个整数:\n",n);for(i=0;i<n;i++){scanf("%d",&a[i]);}printf("倒序输出:\n");for(i=0;i<n;i++){printf("%5d",a[n-1-i]);}printf("\n");}/*习题7.7*/#include<stdio.h>main(){char str[80];int i,j,count=0;printf("输入一个以回车符结束的字符串:\n");i=0;while((str[i]=getchar())!='\n')i++;printf("输出其中的大写辅音字母:\n");for(j=0;j<=i-1;j++)if(str[j]>='B'&&str[j]<='Z'&&str[j]!='E'&&str[j]!='I'&&str[j]!='O'&&str[j]!='U'){putchar(str[j]);count++;}printf("\n");printf("大写辅音字母数量为:%d\n",count);}/*习题7.8*/#include<stdio.h>main(){char str[80];int i,j,count=0;printf("输入一个以回车符结束的字符串:\n");i=0;while((str[i]=getchar())!='\n')i++;printf("输出相应交换后的字符串:\n");for(j=0;j<=i-1;j++)if(str[j]>='A'&&str[j]<='Z')str[j]=155-str[j];for(j=0;j<=i-1;j++)putchar(str[j]);printf("\n");}上文已完。
《C语言程序设计》第7次上机作业C语言程序设计是计算机科学和技术专业中一门重要的课程,该课程主要教授C语言的基础知识和编程技巧。
通过学习这门课程,学生能够掌握C语言的语法结构和编程思想,提高自己的编码能力和解决实际问题的能力。
本次上机作业要求学生完成以下几个任务:1.打印九九乘法表:要求按格式打印出九九乘法表,并能够根据用户输入的数字,打印出对应大小的乘法表。
这一任务主要考察学生对基本的循环和控制语句的运用能力。
2.求阶乘:要求使用递归函数的方法,编写一个程序来计算给定数字的阶乘。
这一任务主要考察学生对递归函数的理解和运用能力。
3.统计字母个数:要求编写一个程序,可以统计字符串中字母的个数,并生成一个字母频率统计表。
这一任务主要考察学生对于字符串处理和数组运用的能力。
4.生成随机数:要求编写一个程序,能够生成指定范围内的指定个数的随机数,并将其存入一个数组中。
这一任务主要考察学生对于随机数生成和数组运用的掌握能力。
5.循环移位:要求编写一个程序,实现对给定的字符串进行循环右移的功能。
这一任务主要考察学生对于字符串处理的能力。
通过完成上述任务,可以帮助学生巩固和提高C语言的编程能力,培养学生的分析问题和解决问题的能力。
在解题过程中,学生需要注意编码的规范性和程序的健壮性。
合理使用注释,编写清晰易懂的代码。
在测试过程中,注意边界条件和异常情况的处理,确保程序的正确性和稳定性。
总之,完成本次上机作业将有助于学生提高C语言的编程能力,培养学生的解决实际问题的能力,为将来的工作和学习打下良好的基础。
希望同学们能够认真完成本次作业,加深对C语言的理解和应用能力。