第一周 程序设计基础

第一周单元测验

1、以下说法中正确的是( )。
    A、C语言程序总是从第一个定义的函数开始执行
    B、在C语言程序中,要调用的函数必须在main()函数中定义
    C、C语言程序总是从main()函数开始执行
    D、C语言程序中的main()函数必须放在程序的开始部分

2、以下叙述中正确的是( )。
    A、C程序中注释部分可以出现在程序中任意合适的地方
    B、花括号"{"和"}"只能作为函数体的定界符
    C、构成C程序的基本单位是函数,所有函数名都可以由用户命名
    D、分号是C语句之间的分隔符,不是语句的一部分

3、以下叙述中正确的是( )。
    A、C 程序的基本组成单位是语句
    B、C 程序中的每一行只能写一条语句
    C、简单 C 语句必须以分号结束
    D、C 语句必须在一行内写完

4、以下叙述中正确的是( )。
    A、C语言规定必须用main作为主函数名,程序将从此开始执行
    B、main的各种大小写拼写形式都可以作为主函数名,如:MAIN,Main等
    C、C语言程序将从源程序中第一个函数开始执行
    D、可以在程序中由用户指定任意一个函数作为主函数,程序将从此开始执行

5、计算机能直接执行的程序是( )。
    A、C语言源程序
    B、目标程序
    C、汇编程序
    D、可执行程序

6、下面叙述正确的是( )。
    A、算法的执行效率与数据的存储结构无关
    B、算法的空间复杂度是指算法程序中指令(或语句)的条数
    C、算法的有穷性是指算法必须能在执行有限个步骤之后终止
    D、以上三种描述都不对

7、以下关于算法叙述错误的是( )。
    A、算法可以用伪代码、流程图等多种形式来描述
    B、一个正确的算法必须有输入
    C、一个正确的算法必须有输出
    D、用流程图可以描述的算法可以用任何一种计算机高级语言编写成程序代码

8、流程图是描述算法的很好的工具,一般的流程图中由几种基本图形组成。其中输入输出框的图形是( )。
    A、长方形
    B、菱形
    C、椭圆形
    D、平行四边形

9、下列关于结构化设计原则的描述,错误的是( )。
    A、使用GOTO语句使程序执行效率提高,但是滥用GOTO语句确实有害,应该避免使用GOTO语句。
    B、程序设计时应该自顶向下,逐步求精。
    C、程序设计时,应该将复杂问题进行模块化,就是将程序设计的总目标分解为若干个分目标,再进一步分解为具体的小目标。
    D、在进行程序设计时,应该尽量在一行书写一条语句,尽量做到效率第一,清晰第二。

10、以下选项中关于程序模块化的叙述错误的是( )。
    A、把程序分成若干相对独立的模块,可便于编码和调试
    B、把程序分成若干相对独立、功能单一的模块,可便于重复使用这些模块
    C、可采用自底向上、逐步细化的设计方法把若干独立模块组装成所要求的程序
    D、可采用自顶向下、逐步细化的设计方法把若干独立模块组装成所要求的程序

11、以下叙述中错误的是( )。
    A、用户所定义的标识符允许使用关键字
    B、用户所定义的标识符应尽量做到“见名知意”
    C、用户所定义的标识符必须以字母或下划线开头
    D、用户所定义的标识符中,大、小写字母代表不同标识

12、以下选项中关于C语言常量的叙述错误的是( )。
    A、所谓常量,是指在程序运行过程中,其值不能被改变的量
    B、常量分为整型常量、实型常量、字符常量和字符串常量
    C、常量可分为数值型常量和非数值型常量
    D、经常被使用的变量可以定义成常量

13、C语言中最简单的数据类型包括( )。
    A、整型、实型、逻辑型
    B、整型、实型、字符型
    C、整型、字符型、逻辑型
    D、整型、实型、逻辑型、字符型

14、设变量x为float型且已赋值,则以下语句中能将X中的数值保留到小数点后两位,并将第三位四舍五入的是( )。
    A、x=x*100+0.5/100.0
    B、x=(x*100+0.5)/100.0
    C、x=(int)(x*100+0.5)/100.0
    D、x=(x/100+0.5)*100.0

15、设有定义:float a=2,b=4,h=3;,以下C语言表达式与代数式 1/2((a+b)h) 计算结果不相符的是( )。
    A、(a+b)*h/2
    B、(1/2)*(a+b)*h
    C、(a+b)*h*1/2
    D、h/2*(a+b)

16、下列条件语句中,功能与其他语句不同的是( )。
    A、if(a) printf("%d\n",x); else printf("%d\n",y);
    B、if(a==0) printf("%d\n",y); else printf("%d\n",x);
    C、if(a!=0) printf("%d\n",x); else printf("%d\n",y);
    D、if(a==0) printf("%d\n",x); else printf("%d\n",y);

17、若k是int型变量,且有下面的程序片段 k=-3 if(k<=0) printf("####") else printf("&&&&"); 上面程序片段的输出结果是( )。
    A、####
    B、&&&&
    C、####&&&&
    D、有语法错误,无输出结果

18、在嵌套使用if语句时,C语言规定else总是( )。
    A、和之前与其具有相同缩进位置的if配对
    B、和之前与其最近的if配对
    C、和之前与其最近的且不带else的if配对
    D、和之前的第一个if配对

19、下列叙述中正确的是( )。
    A、break语句只能用于switch语句
    B、在switch语句中必须使用default
    C、break语句必须与switch语句中的case配对使用
    D、在switch语句中,不一定使用break语句

20、if语句的基本形式是:if(表达式)语句,以下关于“表达式”值的叙述中正确的是( )。
    A、必须是逻辑值
    B、必须是整数值
    C、必须是正数
    D、可以是任意合法的数值

21、以下叙述正确的是( )。
    A、do-while语句构成的循环不能用其它语句构成的循环来代替
    B、do-while语句构成的循环只能用break语句退出
    C、用do-while语句构成的循环,在while后的表达式为非零时结束循环
    D、用do-while语句构成的循环,在while后的表达式为零时结束循环

22、执行以下程序段时( )。 x=-1; do {x=x*x;} while(! x);
    A、循环体将执行一次
    B、循环体将执行两次
    C、循环体将执行无限次
    D、系统将提示有语法错误

23、有以下程序 void main() { int i; for(i=0;i<3;i++) switch(i) { case 0:printf("%d",i); case 2:printf("%d",i); default:printf("%d",i); } } 程序运行后的输出结果是( )。
    A、022111
    B、021021
    C、000122
    D、012

24、t为int类型,进入下面的循环之前,t的值为0 while(t=1) { …… } 则以下叙述中正确的是( )。
    A、循环控制表达式的值为0
    B、循环控制表达式的值为1
    C、循环控制表达式不合法
    D、以上说法都不对

25、若有如下程序段,其中s,a,b,c均已定义为整型变量,且a,c 均已赋值(c大于0) s=a; for(b=1;b<=c;b++) s=s+1; 则上述程序段功能等价的赋值语句是( )。
    A、s=a+b;
    B、s=a+c;
    C、s=s+c;
    D、s=b+c;

26、合法的数组定义是( )。
    A、int a[]="string";
    B、int a[5]={0,1,2,3,4,5};
    C、char s="string";
    D、char a[]={0,1,2,3,4,5};

27、以下程序段中,不能正确赋字符串(编译时系统会提示错误)的是( )。
    A、char s[10]="abcdefg";
    B、char t[]="abcdefg",*s=t;
    C、char s[10];s="abcdefg";
    D、char s[10];strcpy(s,"abcdefg");

28、下面是有关C语言字符数组的描述,其中错误的是( )。
    A、不可以用赋值语句给字符数组名赋字符串
    B、可以用输入语句把字符串整体输入给字符数组
    C、字符数组中的内容不一定是字符串
    D、字符数组只能存放字符串

29、下列选项中,能够满足“若字符串s1等于字符串s2,则执行ST”要求的是( )。
    A、if(strcmp(s2,s1)==0) ST;
    B、if(s1==s2) ST;
    C、if(strcpy(s1,s2)==1) ST;
    D、if(s1-s2==0) ST;

30、执行下面的程序段后,变量k中的值为( )。 int k=3,s[2]; s[0]=k; k=s[1]*10;
    A、不定值
    B、33
    C、30
    D、10

31、计算机语言是人和计算机进行信息交流所使用的语言。

32、C语言的应用比较广泛,不仅可用来编写应用软件,而且可用来编写系统软件。

33、C语言程序中可以有多个函数,但只能有一个主函数。

34、C程序中的注释部分可有可无,通常可以省略。

35、在编写C语言程序时,一行只能写一条语句。

36、C语言程序的三种基本结构是顺序结构、选择结构和循环结构。

37、模块化设计的思想实际上是一种“分而治之”的思想,把一个大任务分为若干个子任务。

38、伪代码书写格式比较自由,可以随手写下去,容易表达出设计者的思想。

39、用流程图表示算法直观形象,能比较清楚地显示出各个框之间的逻辑关系。

40、用计算机语言表示的算法是计算机能够执行的算法。

41、'A'和"A"是相同的。

42、C语言标准格式输出函数printf()的参数表是由若干个表达式组成。

43、当输入数值数据时,对于整型变量只能输入整型值;对于实型变量只能输入实型值。

44、赋值号“=”也是一种运算符。

45、在C程序中,无论是整数还是实数,都能准确无误的表示。

46、case语句后如没有break,顺序向下执行。

47、if(a=5) 是允许的。

48、switch语句中各个case出现的顺序不影响执行的结果。

49、在if语句的三种形式中,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用{}括起来组成一个复合语句。

50、在C语言中,表达式的值为非0,按“真”处理。

51、凡用while循环能完成的,用for循环都能实现。

52、do-while语句先执行循环中的语句,然后再判断表达式是否为真。如果为真则继续循环;如果为假,则终止循环。

53、continue不是结束本次循环,而是终止整个循环的执行。

54、循环体如包括有一个以上的语句,则必须用{}括起来,组成复合语句。

55、若有说明int c;则while(c=getchar());是正确的C语句。

56、不可以用关系运算符对字符数组中的字符串进行比较。

57、数组必须先定义,才能使用。

58、可以通过赋初值的方式确定数组元素的个数。

59、数组名代表的是数组所占存储区的首地址,其值不可改变。

60、当程序执行中,数组元素的下标超出所定义的下标范围时,系统将给出“下标越界”的出错信息。

第一周作业

1、【题目】 输入三个整数,按每个整数占8个字符的宽度右对齐输出它们。 【输入】 只有一行,包含三个整数,整数之间以一个空格分开。 【输出】 只有一行,按每个整数占8个字符的宽度右对齐输出三个整数。 【输入样例】 123456789 0 -1 【输出样例】 123456789 0 -1

2、【题目】 一只大象口渴了,要喝20升水才能解渴,但现在只有一个深h厘米,底面半径为r厘米的小圆桶(h和r都是整数)。问大象至少要喝多少桶水才会解渴? 【输入】 输入有一行:包行两个整数,以一个空格分开,分别表示小圆桶的深h和底面半径r,单位都是厘米。 【输出】 输出一行,包含一个整数,表示大象至少要喝水的桶数。 【输入样例】 23 11 【输出样例】 3

3、【题目】 已知小明同学的数学、语文和英语成绩。若小明恰好有一门课不及格(成绩小于60分),输出1;否则输出0。 【输入】 一行,包含三个在0到100之间的整数,分别是小明的数学、语文和英语成绩。 【输出】 若恰好有一门课不及格,输出1;否则输出0。 【输入样例】 50 72 80 【输出样例】 1

4、【题目】 求n个整数中所有偶数的乘积 。 【输入】 输入数据包含多个测试实例,每个测试实例占一行,每行的第一个数为n,表示本组数据一共有n个,接着是n个整数。可以假设每组数据必定至少存在一个偶数。 【输出】 输出每组数中的所有偶数的乘积,对于每一测试实例,输出一行。 【输入样例】 3 1 2 8 4 2 3 4 5 【输出样例】 16 8

5、【题目】 统计正整数m和n之间(包括m和n)质数的个数,其中,1<m<n<1000。 【输入】 一行,包含两个整数m和n,以一个空格间隔。 【输出】 输出一行,包行一个整数,表示正整数m和n之间质数的个数。 【输入样例】 10 20 【输出样例】 4

第二周 函数及指针

第二周单元测验

1、若程序中定义了以下函数 double myadd(double a,double b) { return (a+b);} 并将其放在调用语句之后,则在调用之前应该对该函数进行说明,以下选项中错误的说明是( )。
    A、double myadd(double a,b);
    B、double myadd(double,double);
    C、double myadd(double b,double a);
    D、double myadd(double x,double y);

2、有如下函数调用语句 func(rec1,rec2+rec3,(rec4,rec5)); 该函数调用语句中,含有的实参个数是( )。
    A、3
    B、4
    C、5
    D、有语法错

3、在调用函数时,如果实参是简单变量,它与对应形参之间的数据传递方式是( )。
    A、地址传递
    B、单向值传递
    C、由实参传给形参
    D、再由形参传回实参

4、若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是( )。
    A、函数调用可以作为独立的语句存在
    B、函数调用可以作为一个函数的实参
    C、函数调用可以出现在表达式中
    D、函数调用可以作为一个函数的形参

5、以下叙述中错误的是( )。
    A、用户定义的函数中可以没有 return 语句
    B、用户定义的函数中可以有多个 return 语句,以便可以调用一次返回多个函数值
    C、用户定义的函数中若没有 return 语句,则应当定义函数为 void 类型
    D、函数的 return 语句中可以没有表达式

6、以下叙述中正确的是( )。
    A、函数名代表该函数的入口地址
    B、如果函数带有参数,就不能调用自己
    C、函数体中的语句不能出现对自己的调用
    D、所有函数均不能接受函数名作为实参传入

7、以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是( )。 void main() { int *p,*q,a,b; p=&a; printf("input a "); scanf("%d ",*p); … }
    A、*p表示的是指针变量p的地址
    B、p表示的是变量a的值,而不是变量a的地址
    C、*p表示的是指针变量p的值
    D、*p只能用来说明p是一个指针变量

8、下面判断正确的是( )。
    A、char *a= "china ";等价于char *a;*a= "china ";
    B、char str[10]={ "china "};等价于char str[10];str[]={"china "};
    C、char *s= "china ";等价于char *s;s= "china ";
    D、char c[4]= "abc ",d[4]= "abc ";等价于char c[4]=d[4]= "abc ";

9、若有说明float *p,m=3.14;想要p指向m,则正确的赋值语句是( )。
    A、p=m;
    B、p=&m;
    C、*p=m;
    D、*p=&m;

10、若有以下定义和语句, int a=4,b=3,*p,*q,*w; p=&a;q=&b;w=q;q=NULL; 则选项中错误的语句是( )。
    A、*q=0;
    B、w=p;
    C、*p=a;
    D、*p=*w;

11、若有说明语句, char a[]="It is mine "; char *p= "It is mine "; 则以下不正确的叙述是( )。
    A、a+1表示的是字符t所在存储单元的地址
    B、p指向另外的字符串时,字符串的长度不受限制
    C、p变量中存放的地址值可以改变
    D、a中只能存放10个字符

12、若有以下定义int a[5],*p=a;则对a数组元素的正确引用是( )。
    A、*&a[5]
    B、a+2
    C、*(p+5)
    D、*(a+2)

13、若有以下定义int a[5],*p=a;则对a数组元素的正确引用是( )。
    A、*&a[5]
    B、a+2
    C、*(p+5)
    D、*(a+2)

14、若有以下定义int a[5];则a数组中首元素的地址可以表示为( )。
    A、&a
    B、a+1
    C、a
    D、&a[1]

15、以下选项中,对指针变量p正确的操作是( )。
    A、int a[5],*p=a;p=&a;
    B、int a[5],*p;p=a;
    C、int a[5];int *p=a=1000;
    D、int a[5],*p1,*p2=a;*p1=*p2;

16、设有定义语句 int x[6]={2,4,6,8,5,7},*p=x,i; 要求依次输出x数组6个元素的值,不能完成此操作的语句是( )。
    A、for(i=0;i<6;i++) print("%2d",*(p++));
    B、for(i=0;i<6;i++) print("%2d",*(p+i));
    C、for(i=0;i<6;i++) print("%2d",*p++);
    D、for(i=0;i<6;i++) print("%2d",*(p)++);

17、若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是( )。
    A、函数调用可以作为独立的语句存在
    B、函数调用可以作为一个函数的实参
    C、函数调用可以出现在表达式中
    D、函数调用可以作为一个函数的形参

18、当调用函数时,实参是一个数组名,则向函数传送的是( )。
    A、数组的长度
    B、数组的首地址
    C、数组每一个元素的地址
    D、数组每个元素中的值

19、若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是( )。
    A、形参只是形式上的存在,不占用具体存储单元
    B、函数的实参和其对应的形参共占同一存储单元
    C、同名的实参和形参占同一存储单元
    D、函数的形参和实参分别占用不同的存储单元

20、若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是( )。
    A、形参只是形式上的存在,不占用具体存储单元
    B、函数的实参和其对应的形参共占同一存储单元
    C、同名的实参和形参占同一存储单元
    D、函数的形参和实参分别占用不同的存储单元

21、函数返回值的类型是由在定义函数时所指定的函数类型决定。

22、函数必须有返回值。

23、函数的定义和声明是一回事。

24、函数的实参传递到形参有两种方式值传递和地址传递。

25、数组名作函数的参数时,参数的传递是双向的。

26、在调用一个函数的过程中又调用另一函数,叫做递归。

27、在一个函数内部调用另一个函数的调用方式称为嵌套调用。

28、全局变量会使函数的通用性降低。

29、在C语言程序中,凡是没有出现存储类说明符的变量都是自动类的。

30、使用static定义的变量属于静态变量。

31、*p++与*(p++)等价。

32、变量的两个值:本身值和地址值都是可以改变的。

33、内存中的每个存储单元都有一个惟一的地址。

34、内存单元的地址与内存单元中的数据是两个完全相同的概念。

35、指针变量不能做函数的参数。

36、两指针变量相减所得之差是两个指针所指向数组元素之间相差的元素个数。

37、一个变量的地址称为该变量的指针。

38、如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素。

39、函数的形参和实参可以分别用字符数组名或字符指针变量。

40、有指针变量p和数组a,指针变量和数组都可以实现本身的值的改变,如p++和a++。

第二周作业

1、【题目1】 一位姑娘对求婚者说:“这里有三个盒子,一个是金盒子,一个是银盒子,一个是铅盒子。每只盒子上写着一句话:金盒上写的是‘肖像在这里’;银盒上写‘肖像不在这里’;铅盒上写‘肖像不在金盒里’。三句话中只有一句是真的,谁能猜中我的肖像放在哪一个盒子里?” 【输入】 无。 【输出】 若在金盒里,则输出“金盒”;若在银盒里,则输出“银盒”;若在铅盒里,则输出“铅盒”。

2、【题目2】输入正整数n和n个1~10000之间的整数,对这n个数去重,即清除重复出现的数,每输入一个数,若它不与以前输入的整数重复,就将其输出。 【输入】 输入包含两行: 第一行包含一个正整数n,n≤10。 第二行包含n个整数,以一个空格分隔开。每个整数在1~10000之间。 【输出】 输出只有一行,按照输入的顺序,输出其中不重复的整数,以一个空格分隔开。 【输入样例】 5 15 18 69 18 27 【输出样例】 15 18 69 27

3、【题目3】 输入一个字符串,统计其中元音字母的个数。要求使用函数vowel()用来判断是否为元音,其余功能在main()函数中实现。 int vowel(char ch) { //如果ch是元音,返回1,否则返回0 } 【输入】 输入一个字符串,长度不超过1000,以回车符结束。 【输出】 输出一个整数,表示元音字母个数。输出单独占一行。 【样例输入】 Hello world! 【样例输出】 3

4、【题目4】 输入某位同学各门课的成绩,输出平均成绩。输入的成绩均为五级制成绩,五级制成绩转换为百分之成绩的规则如下:'A'转换为百分之成绩为95分,'B'对应85分,C对应75分,'D'对应65分,'E'对应40分。 输出的平均成绩为一个实数,保留1位小数。 要求程序定义一个getScore()函数和一个main()函数,getScore()函数返回一个等级对应的分数,其余功能在main()函数中实现。 int getScore(char g) { //把等级g转换成对应的分数并返回这个分数。 } 【输入】 输入为一行只包含'A'---'E'的字母,每个字母表示一门课的成绩。 【输出】 输出平均成绩,为一个实数,保留一位小数。 【样例输入】 AABB 【样例输出】 90.0

5、【题目5】 编写一函数len,求一个字符串的长度,注意该长度不计空格。要求用字符指针实现。在主函数中输入字符串,调用该len函数后输出其长度。 int len(char *sp) { //实现sp所指串的长度,不计空格。 } 【输入】 输入一个字符串,以回车结束,长度不超过100。 【输出】 输出一个整数,单独占一行。 【样例输入】 What day is today? 【样例输出】 15

第三周 结构体与文件

第三周单元测验

1、当定义一个结构体变量时,系统为它分配的内存空间是( )。
    A、结构中一个成员所需的内存容量
    B、结构中第一个成员所需的内存容量
    C、结构体中占内存容量最大者所需的容量
    D、结构中各成员所需内存容量之和

2、定义以下结构体数组 struct c { int x; int y; }s[2]={1,3,2,7}; 语句printf("%d",s[0].x*s[1].x)的输出结果为( )。
    A、14
    B、6
    C、2
    D、21

3、下面程序的运行结果是( )。 struct KeyWord { char Key[20]; int ID; }kw[]={"void",1,"char",2,"int",3,"float",4,"double",5}; main() { printf("%c,%d\n",kw[3].Key[0], kw[3].ID); }
    A、i,3
    B、n,3
    C、f,4
    D、l,4

4、如果有下面的定义和赋值,则使用( )不可以输出n中data的值。 struct SNode { unsigned id; int data; }n,*p; p=&n;
    A、p.data
    B、n.data
    C、p->data
    D、(*p).data

5、根据下面的定义,能输出Mary的语句是( )。 struct person { char name[9]; int age; }; struct person class[5]={"John",17,"Paul",19,"Mary",18,"Adam",16};
    A、printf("%s\n",class[1].name);
    B、printf("%s\n",class[2].name);
    C、printf("%s\n",class[3].name);
    D、printf("%s\n",class[0].name);

6、若fp是指向某文件的指针,且已读到该文件末尾,则函数feof(fp)的返回值是( )。
    A、EOF
    B、-1
    C、非零值
    D、NULL

7、下列关于C语言数据文件的叙述中正确的是( )。
    A、文件由ASCII码字符序列组成,C语言只能读写文本文件
    B、文件由二进制数据序列组成,C语言只能读写二进制文件
    C、文件由记录序列组成,可按数据的存放形式分为二进制文件和文本文件
    D、文件由数据流形式组成,可按数据的存放形式分为二进制文件和文本文件

8、以下叙述中错误的是( )。
    A、二进制文件打开后可以先读文件的末尾,而顺序文件不可以
    B、在程序结束时,应当用fclose函数关闭已打开的文件
    C、在利用fread函数从二进制文件中读数据时,可以用数组名给数组中所有元素读入数据
    D、不可以用FILE定义指向二进制文件的文件指针

9、以下叙述中错误的是( )。
    A、C语言中对二进制文件的访问速度比文本文件快
    B、C语言中,随机文件以二进制代码形式存储数据
    C、语句 FILE fp; 定义了一个名为fp的文件指针
    D、C语言中的文本文件以ASCII码形式存储数据

10、以下叙述中不正确的是( )。
    A、C语言中的文本文件以ASCII码形式存储数据
    B、C语言中对二进制文件的访问速度比文本文件快
    C、C语言中,随机读写方式不适用于文本文件
    D、C语言中,顺序读写方式不适用于二进制文件

11、在C语言中允许用户建立由不同类型的数据组成的组合型的数据结构。

12、结构体类型中的成员名可以与程序中的变量名相同。

13、可以通过结构体变量名输出所有成员的值。

14、一个结构体变量的起始地址就是这个结构体变量的指针。

15、结构体变量的成员可以属于另一个结构体类型。

16、文件是存储在外部介质上数据的集合。

17、在C语言中,数据文件可分为ASCII文件和二进制文件。

18、C语言中的文件名包括文件名主干和文件后缀两部分。

19、通过文件指针变量能够找到与它关联的文件。

20、二进制文件只能读出数据,不能写入数据。

第三周作业

1、【题目1】 有一学生成绩表,包括学号、姓名、3门课程成绩。请按如下规则排序:按总成绩降序排序,若总成绩相同,则按姓名升序排序。 【输入】 首先输入一个整数n(1<=n<=100),表示学生人数; 然后输入n行,每行包含一个学生的信息:学号(12位)、姓名(不含空格且不超过20位),以及3个整数,表示3门课成绩,数据之间用空格隔开。 【输出】 输出排序后的成绩单,格式见输出样例。 【样例输入】 3 541207010188 Zhangling 89 78 95 541207010189 Wangli 85 87 99 541207010190 Fangfang 89 88 85 【样例输出】 541207010189 Wangli 85 87 99 271 541207010190 Fangfang 89 88 85 262 541207010188 Zhangling 89 78 95 262

2、【题目2】 设计一个结构体类型,包含姓名、出生日期。其中出生日期又包含年、月、日三部分信息。输入n个好友的信息,输出年龄最小的好友的姓名和出生日期。 【输入】 首先输入一个整数n(1<=n<=10),表示好友人数,然后输入n行,每行包含一个好友的信息:姓名(不超过20位)以及三个整数,分别表示出生日期的年月日。 【输出】 输出年龄最小的好友的姓名和出生日期,用空格隔开,出生日期的输出格式见输出样例。 【样例输入】 3 Zhangling 1983 2 4 Wangliang 1983 12 11 Fangfang 1985 6 1 【样例输出】 Fangfang 1985-06-01

3、【题目3】 有一学生成绩表,包括学号、姓名、3门课程成绩。已知该成绩表按学号升序排序。请编程实现,添加一个新的学生信息,且使成绩表仍按学号有序;若待添加的学号与已有学号重复,则输出错误信息,拒绝添加。 【输入】 首先输入一个整数n(1<=n<=100),表示学生人数; 然后输入n行,每行包含一个学生的信息:学号(12位)、姓名(不含空格且不超过20位),以及3个整数,表示3门课成绩,数据之间用空格隔开。 最后一行输入一个待添加的学生信息,包括学号、姓名和3门课成绩 【输出】 若待添加的学号与已有学号重复,则输出只有一行“error!”;否则,输出n+1行,即添加后的成绩单信息。 【样例输入】 3 541207010188 Zhangling 78 95 55 541207010189 Wangli 87 99 88 541207010191 Fangfang 68 76 75 541207010190 Lilei 68 79 82 【样例输出】 541207010188 Zhangling 78 95 55 541207010189 Wangli 87 99 88 541207010190 Lilei 68 79 82 541207010191 Fangfang 68 76 75

4、【题目4】 已有a、b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。 【输入】 第一行,a、b两个链表元素的数量N、M,用空格隔开。 接下来N行是a的数据 然后M行是b的数据 每行数据由学号和成绩两部分组成 【输出】 按照学号升序排列的数据。 【样例输入】 2 3 5 100 6 89 3 82 4 95 2 10 【样例输出】 2 10 3 82 4 95 5 100 6 89

5、【题目5】 有n个人围成一圈,顺序从1开始排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。要求用循环链表实现。 【输入】 只有一个正整数n,保证n不超过1000。 【输出】 输出最后留下的人的原始编号。 请注意行尾输出换行。 【样例输入】 10 【样例输出】 4