青海大学mooc测验与作业 下载本文

第二周 1? ?

单选(2分)已知:char a;int b;float c;double d;执行语句 c=a+b+c+d;后,变量c的数据类型是____。得分/总分 A. double B.float

2.00 /2.00

? ?

C. int D. char

2? ? ? ? 单选(2分)已知 int i=5;执行语句 i+=++i;i的值是____。得分/总分 A.其他答案都不对 B.11 C.10 D.12 2.00 /2.00 3? ? ?

单选(2分)已知int x=5,y=5,z=5;执行语句x%=y+z;后,x的值是____。得分/总分 A.1 B.0 C.5

2.00 /2.00

?

D.6

4? ? ?

单选(2分)下列可以正确表示字符型常数的是____。得分/总分 A. \ B. \ C. 297

? D. '\\t’ 2.00 /2.00

5? ? ? ?

单选(2分)字符串\的长度是____。得分/总分 A. 7 B.5 C.8 D.6

2.00 /2.00

6单选(2分)把算术表达式 正确的写法是____。得分/总分

? ? ? ?

A.–31.6*a*8+1.0/7*12 B.–(31.6*a*8+1.0/7)*12 C.–(31.6a*8+1/7)*12 D.–(31.6a*8.0+1.0/7.0)*12

表示为一个C语言表达式, 2.00 /2.00

7? ? ? ?

单选(2分)温度华氏和摄氏的关系是: C=5(F-32)/9。已知:float C,F;由华氏求摄氏的正确的赋值表达式是____。 得分/总分

A.C=5/9(F-32) B.三个表达式都正确 C.C=5*(F-32)/9 D.C=5/9*(F-32)

2.00 /2.00

8? ? ? ?

单选(2分)已知int i=10;表达式“20-0<=i<=9”的值是____。得分/总分 A.1 B.20 C.19 D.0

2.00 /2.00

9? ? ? ?

单选(2分)已知:int x,y;double z;则以下语句中错误的函数调用是____。得分/总分 A.scanf (\ B.scanf (\ C.scanf (\ D.scanf (\

2.00 /2.00

10? ? ? ?

单选(2分)已知” int a=5,b=5,c;”,则执行表达式” c=a=a>b”后变量 a 的值为____。得分/总分

A.0 B.4 C.5 D.1

2.00 /2.00

第三周

1让我们学习用C语言向世界问好。 “Hello World”示例程序最早出现于1972年,由贝尔

实验室成员Brian Kernighan撰写的内部技术文件《Introduction to the Language B》之中。不久同作者于1974年所撰写的《Programming in C: A Tutorial》,也延用这个示例。 一般来说,这是每一种计算机编程语言中最基本、最简单的程序,亦通常是初学者所编写的第一个程序。它还可以用来确定该语言的编译器、程序开发环境,以及运行环境是否已经安装妥当。将“Hello World”作为第一个示范程序,已经成为编程语言学习的传统。 我们在这里继续传统,这也是一种向前辈们致敬的方式之一吧! 最早的程序基本是这个样子的: #include int main() { printf(\请模仿上面的程序,看看是否可以通过编译?如果你能通过这个简单的程序,那就让我们继续完成后面的习题吧。(2分) 源程序:

#include int main() {

printf(\ return 0; }

2学学scanf和printf的用法吧(5分)

题目内容:

该如何处理 double 型的数据:如何定义变量类型?如何使用 scanf 函数? 如果已知圆柱的底面半径 r ,以及高 h ,则可计算出圆柱的侧面积

,

体积 输入格式:

。其中 。

第一行输入圆柱的底面半径 r 第二行输入圆柱的高 h 输出格式:

s=< 圆柱的侧面积 >,v=< 圆柱的体积 > 要求

1. 所有变量都定义为双精度类型 2. 结果精确到小数点后两位。 作为练习题目:

我们已经给您编写好了大部分的代码,请您自己修改几个地方,完成程序的剩余部分。 **********************************************分隔线************ #include #define PAI 3.1415926 int main() { int r,h; double s,v;

scanf(\ ); s=2*PAI*r*h; v=PAI*r*r*h;

printf(\ \\n\ ); return 0; }

输入样例:

2 8

输出样例:

s=100.53,v=100.53

源程序:

#include #define PAI 3.1415926 int main() {

double r,h; double s,v;

scanf(\ s=2*PAI*r*h; v=PAI*r*r*h;

printf(\ return 0; }

3输出字符的 ASCII 码(10分)

题目内容:

我们在计算机基础中已经学过:字母在计算机中采用ASCII码进行存储。下面要从键盘上输入任意一个字符,然后输出该字符对应的ASCII码。 输入格式: 一个字符 输出格式:

该字符对应的ASCII码 输入样例: A

输出样例:

The ASCII of character 'A' is 65.

源程序:

#include int main() {

char ch; ch=getchar();

printf(\ return 0; }

4一年级的算术题(10分)

题目内容:

小明上小学一年级了,老师已经教会了他们进行整数的 +、-、*、/、% 计算,下面老师开始出题,给出一个简单的算术表达式,请小明给出计算结果。

输入格式:

接受两个整数,每个整数之间使用空格分隔。例如输入格式为:123 444 输出格式:

分别输出按照整型数据进行 +、-、*、/、* 之后的运行结果。

输入样例:

10 3

输出样例:

10+3=13 10-3=7 10*3=30 10/3=3 10%3=1 源程序:

#include int main() {

int a,b;

scanf(\ printf(\ printf(\ printf(\ printf(\ printf(\ return 0; }

5判断三角形的形状(10分)

题目内容:

输入三角型的三条边,判断三角形的形状。假设输入的三边边长均>0。 输入格式:

三角型的3条边的长度(int型)。 输出格式:

等边三角形:equilateral triangle 等腰三角形:isoceles triangle 不构成三角形:non-triangle 一般三角形:triangle 输入样例:

2 2 2

输出样例:

equilateral triangle.

源程序:

#include int main()

{

int a,b,c;

scanf(\ if(a+b>c && a+c>b && b+c>a)

if(a==b && b==c && a==c) printf(\ else if(a==b || b==c || a==c) printf(\ else printf(\ else printf(\ return 0;

}

第四周作业

本次得分为:6.00/8.00, 本次测试的提交时间为:2016-04-23, 如果你认为本次测试成绩不理想,你可以选择再做一次。 1单选(2分)

下面程序的输出是 #include main ( )

{ int x=1, y=0, a=0, b=0; switch ( x )

{ case 1: switch ( y )

{ case 0: a++; break; case 1: b++; break; }

case 2: a++; b++; break; }

printf (\ } 得分/总分 A. a=1,b=1 B. a=2,b=2 C. a=1,b=0 D. a=2,b=1

2.00 /2.00 2单选(2分)

以下程序的输出结果是 main( )

{ float x=2,y;

if (x<0) y=0;

else if (x<5&&!x) y=1/(x+2); else if (x<10) y=1/x; else y=10;

printf(”%f\\n”,y); }

得分/总分 A. 10.000000 B. 0.000000 C. 0.500000 2.00 /2.00 D. 0.250000

3填空(2分)

若下列程序执行后t的值为4,则执行时输入a,b的值范围是 #include ”stdio.h” main( )

{ int a, b, s=1, t=1;

scanf (”%d, %d”, &a, &b); if (a>0) s+=1; if (a>b) t+=s; else if(a==b) t=5;

else t = 2*s; printf (”s=%d, t=%d\\n”, s,t); }

得分/总分 0

2.00/2.00 4填空(2分)

下列程序段当a的值为014和0x14时的执行结果分别是 if ( a=0xA | a >12 )

if ( 011&10==a ) printf (”%d!\\n”,a); else printf (”Right!%d\\n”,a); else printf (”Wrong!%d\\n”,a); 得分/总分 10!

Right!11

第四周

1计算时钟的夹角(10分)

题目内容:

钟面上的时针和分针之间的夹角总是在 0 ~180之间 ( 包括 0 和180 ) 。举例来说,在十二点的时候两针之间的夹角为 0 ,而在六点的时候夹角为180 ,在三点的时候为90 。本题要解决的是计算 12:00 到 11:59 之间任意一个时间的夹角。 输入格式:

每组测试数据包含两个数字:第一个数字代表小时 ( 大于 0 小于等于 12) ,第二个数字代表分 ( 在区间 [0, 59] 上 ) 。

输出格式:

对应每组测试数据,用常用格式显示时间以及这个时候时针和分针间的最小夹角,精确到小数点后一位。输出格式如下所示。

再看一看,想一想:是否可以不用if 语句,只使用 printf 函数来简化你的程序? 输入样例:

12 0

输出样例:

At 12:00 the angle is 0.0 degrees. 源程序:

#include #include int main() { int m,n,h; double x,y,degree; scanf(\ y=6.0*m; h=n;

if(n==12) h=0; x=(h+m/60.0)*30; degree=fabs(y-x);

printf(\ return 0; }

2确定母亲节(10分)

题目内容:

母亲节是每年的五月第二个星期天,针对输入的年份,计算该年的哪一天是母亲节。 输入格式: 年份 输出格式:

日期(5月的哪一天) 输入样例: 2014 输出样例: 11

源程序:

#include int main()

{ int w,c,y,m=5,d=1; scanf(\ c=y/100; y=y0;

w=c/4-2*c+y+(y/4)+13*(m+1)/5+d-1; w=w%7;

if(w<0) w=(w+14)%7; if(w==0) d=w+8; else if(w>0) d=15-w; printf(\ return 0; }

3计算星期(10分)

题目内容:

给出任意一个年月日(年>1900),现在我们不能只是直接计算,要先判断给出的日期是否合法,对于非法的日期要给出错误提示信息,合法的日期要再计算是星期几。 输入格式: 年 月 日 输出格式: 0~6。

星期日用 0 表示,星期一用 1 表示,星期二用 2 表示......星期六用 6 表示。 假设年份大于1900。先想一想:我们现在只会使用 if 语句,该如何建立数学模型? 输入样例: 2013 3 11 输出样例: 1

输入样例: 2013 13 15 输出样例: month is error. 输入样例: 2013 3 32 输出样例: day is error.

源程序:

#include int main() {

int y,m,d,c,w;

scanf(\

if(y<1900) printf(\

else if(m<1 || m>12) printf(\ else if(d>31 || d<1) printf(\else { c=y/100; y=y0; if(m==1) m=13; if(m==2) m=14;

w=c/4-2*c+y+y/4+13*(m+1)/5+d-1; w=w%7;

if(w<0) w=(w+14)%7; printf(\} return 0; }

4求最后3位数值(10分)

题目内容:

小明在中学会求一个数的 n 次方了,但计算机还不会,请你来编写一个程序吧。由于计算机比较“笨”,所以我们编写程序的功能不用太强,只要能算出 a 的 n 次方的最后 3 位数就可以了。 输入格式:

a 和 n 的值。假设 a<=150 。 输出格式:

求 a 的 n 次方的最后 3 位数。

提示:再想一想,你的方法对吗?你用的是什么数据类型? 输入样例: 10 0

输出样例:

The last 3 numbers is 1.

源程序:

#include int main() { int a,n,i,x; int p=1;

scanf(\

if(n!=0 && a<=150) { for(i=1;i<=n;i++) p=p00*a; x=p00;

printf(\ }

else printf(\ return 0; }

第五周编程作业

1锻炼身体吧(10分)

题目内容:

沫沫,灰灰和渣渣去锻炼身体,如果对他们跑步的距离分别只计整数 a、 b、 c,由于他们身高的差距,造成了 a<=b<=c,并且渣渣跑了N米之后就再也跑不动了。但是,按照他们事先的约定: 只有当 c*c==a*a+b*b 时,他们的锻炼才有效果。

现在他们三个人想知道,如果渣渣的极限N已知,那么有多少种有锻炼效果的跑步方案(即a, b, c有多少种可能的取值)。 输入格式:

一个整数N,表示渣渣的体力极限, N <= 5000。 输出格式:

一个整数,代表他们跑步方案的个数。

Hint:对于输入N=5,有方案 a=3, b=4, c=5, 共一种。 输入样例: 5

输出样例: 1

源程序:

#include int main() {

int n,a,b,c,m; scanf(\m=0;

for(c=1;c<=n;c++)

for(a=1;a<=n;a++)

for(b=1;b<=n;b++)

if(c*c==a*a+b*b && a<=b) m++;

}

printf(\return 0;

2寻找特殊偶数(10分)

题目内容:

有一种特殊偶数,它每一位上的数字都两两不相同。我们现在需要找出四位数中某一区间内的这类偶数。 输入格式:

所要寻找的四位偶数的范围。每组输入有两个数字:第一个数字是最小范围;第二个数字是最大范围。如果输入遇到0,输入结束。 输出格式:

列出此范围内的所有特殊偶数,并且列出此范围内特殊偶数的个数。 输入样例: 3000 3020 6040 6090 0 0 输出样例:

3012 3014 3016 3018 counter=4

6042 6048 6052 6054 6058 6072 6074 6078 6082 6084 counter=10 输入样例: 9 101 87 -1 0 0 输出样例: Error Error

源程序:

#include int main() {

int m,n,i,counter; int a,b,c,d; do{

scanf(\

if(m!=0 && n!=0 && (m>=1000 && m<10000) && (n>=1000 && n<10000) && m

for(i=m;i<=n;i++)

if(i%2==0) }

else if(m==0 && n==0) return 0; else

printf(\}while(1);

{ a=i/1000;b=i00/100;c=i0/10;d=i; if(a!=b && a!=c && a!=d && b!=c && b!=d && c!=d) }

printf(\

{ counter++; printf(\

return 0; }

3求最小 m 值(10分)

题目内容:

求满足下列不等式的最小 m。 1 + 2 + 3 + 4 + ...... + m ≥ n

例如:n=100,当 m =14 时,满足:1+2+3+4+...+13=91<100,而 1+2+3+4+......+14=105>100。 输入格式: n

输出格式: m

输入样例: 100 输出样例: 14

源程序:

#include int main() { }

int n,m,s=0; scanf(\for(m=1;s

s=s+m;

printf(\return 0;

第六周作业

1? ? ? ?

单选(2分)求取满足式 的n,正确的语句是 A. for(i=1,s=0;(s=s+i*i++)<=1000;n=i) B. for(i=1,s=0;(s=s+i*++i)<=1000;n=i) C. for(i=1,s=0;(s=s+i*i)<=1000;n=++i) D. for(i=1,s=0;(s=s+i*i)<=1000;n=i++)

2? ? ? ?

单选(2分)下面的for语句 1. for(x=0,y=10;(y>0)&&(x<4);x++,y-- ) A. 循环执行3次 B. 循环执行4次 C. 是无限循环 D. 循环次数不定

3? ? ? ?

单选(2分) 已知int i=1; 执行语句while (i++<4) ;后,变量i的值为 A. 5 B. 3 C. 4 D. 6

4单选(2分)下面程序的输出结果是____ 1. main() 2. 3. 4. 5. 6. { int i,j,x=0; for(i=0;i<2;i++) { x++; for(j=0;j<-3;j++) { if(j%2) 7. continue; 8. x++; 9. } 10. x++; 11. }

12. printf(”x=%d\\n”,x); 13. }

? ? ? ?

A. x=12 B. x=6 C. x=8 D. x=4

5单选(2分)假定从键盘上输入“3.6,2.4<回车>”,下面程序的输出是____ 1. #include 2. main() 3. 4. 5. 6. 7. { float x,y,z; scanf(”%f,%f”,&x,&y); z=x/y; while(1) { if(fabs(z)>1.0) 8. { x=y; 9. y=z; 10. z=x/y; 11. } 12. else break; 13. } 14. printf(”%f\\n”,y); 15. } 注:fabs()是浮点数绝对值函数。

? ? ? ?

A. 1.500000 B. 1.600000 C. 2.400000 D. 2.000000

6填空(2分)下面程序的功能是输出1到100之间每位数的乘积大于每位数的和的数。例如数字26,数位上数字的乘积12大于数字之和8。(答案以① ② ③ 的形式提交,如① a ② b ③ c)

1. main()

2. 3. 4. 5. 6. 7. { int n,k=1,s=0,m;

for(n=1;n<=100;n++) { k=1; s=0; ① ;

while( ② )

8. { k*=m; 9. s+=m; 10. ③ ; 11. } 12. if(k>s) 13. printf(”%d”,n); 14. } 15. }

① m=n ① m>0 ① m=m/10

第六周编程

1数字正方型(10分)

题目内容:

这是双重循环的入门题目,大家来看看,你会做吗?

输入 n 的值,输出如下例( n=4 )所示的由数字组成的正方型。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 输入格式: n

输出格式: 数字组成的正方型 输入样例: 1

输出样例: 1

源程序:

#include int main() {

int n,i,j,s=0; scanf(\for(i=1;i<=n;i++) { for(j=1;j<=n;j++)

}

printf(\ printf(\} return 0;

2空心字符菱形(10分)

题目内容:

根据菱型起始字母和菱形的高度,打印空心的由字符组成的菱形。 输入格式:

菱型起始字母和菱形的高度。 输出格式:

参照样例,打印空心的由字符组成的菱形。 输入样例:

C 4

输出样例:

C D D E E F F E E D D C

源程序: #include int main() {

char ch; int n,i,j,k;

scanf(\

for(i=1;i<=n;i++) { for(k=1;k<=n-i;k++) printf(\ for(j=1;j<=2*i-1;j++)

if(j==1 || j==2*i-1) printf(\ else

printf(\

printf(\

ch++; } ch=ch-2;

for(i=n-1;i>=1;i--) { for(k=1;k<=n-i;k++) printf(\ for(j=1;j<=2*i-1;j++)

if(j==1 || j==2*i-1) printf(\ }

else printf(\

printf(\ ch--; } return 0;

3邮票组合(10分)

题目内容:

我们寄信都要贴邮票,在邮局有一些小面值的邮票,通过这些小面值邮票中的一张或几张的组合,可以满足不同邮件的不同的邮资。

现在,邮局有4种不同面值的邮票。在每个信封上最多能贴5张邮票,面值可相同,可不同。 输入格式: 四种邮票的面值。 输出格式:

用这四种面值组成的邮资最大的从1开始的一个连续的区间。 说明:

如结果为10,则表明使用4张邮票可组合出1、2、3、4、5、6、7、8、9、10这些邮资。 名词解释:

邮资:就是你寄东西需要花多少钱。

邮票面额:是由国家发行的具有固定价格的花纸片,被称为邮票。

如果你寄东西,邮局称了重量,告诉你要240分。这样你就要贴邮票了。如果现在邮局的邮票有面值为80分、50分、20分和10分的四种,你就可以 采用不同的组合得到240的邮资,例如:采用3张80分的可以凑出240分;或者24张10分的凑起来240分也可以。显然不同邮票的组合都可以得到同样一种邮资。 输入样例: 1 4 12 21 输出样例: The max is 71.

源程序: #include int main()

{

int a,b,c,d,i,j,k,m,t=0,s=0,n=1,x=0; scanf(\//for(s=1;s<=d*5;s++)

loop: }

for(i=0;i<=5;i++)

for(j=0;j<=5;j++)

for(k=0;k<=5;k++)

for(m=0;m<=5;m++)

if(s==a*i+b*j+c*k+d*m && i+j+k+m<=5)

x++;

if(x!=0) { x=0;n++;s++;goto loop;}

printf(\//printf(\return 0;

4火锅火锅和火锅(10分)

题目内容:

众所周知,沫沫以火锅为生。在E8的聚餐活动中,他经常卖萌卖无辜领着大家吃火锅。。

有一天,沫沫听说学校附近的哺呷哺呷在某现充的赞助下有一个优惠活动,只需30软妹币,对每个客人,它会上N道菜,但是客人只能挑选其中连续上的一些菜。 于是他非常兴奋的拉着灰灰和渣渣去吃火锅去啦。

沫沫是一个十分挑食的人,所以他对每一道菜都有一个愉快度(当然因为他的挑食,某些事物的愉快度会是负数)。

为了让沫沫能非常愉快的享受这次聚餐,善解人意的灰灰和渣渣决定帮他计算,他们应该怎么选择菜才能使沫沫最开心地吃完这次聚餐。 输入格式:

第一行是一个整数T,(T <= 10)表示测试案例的个数

对于每个测试案例,第一行是一个整数N,( 1<=N <= 10000)表示菜的个数

接下来的N个数字,第i个数字si表示沫沫对第i道菜的愉快度。( -1000 <=si <= 1000) PS:由于CF又被血虐掉rating,所以沫沫的起始愉快度是0 PPS:沫沫完全可能得到一个为负值的愉快值, poor 沫沫。。 输出格式:

对于每个样例,输出一个数字,表示沫沫吃完之后愉快度的最大值。 HINT: 对于 5 6 -1 5 4 -7

我们选择6, -1, 5, 4这四道菜(注意必须是连续的,所以不能跳过-1)

做完后请思考,如果N的范围是1<=N<=100000呢? 输入样例:

2 5

6 -1 5 4 -7 7

0 6 -1 1 -6 7 -5

输出样例:

14 7

源程序:

#include int main() {

int x,n,t,s,m,max=-1001; scanf(\ while(t--) {

scanf(\ s=m=0; while(n--) {

scanf(\ if(max0) m=m+x; else m=0; if(s

if(max<0) printf(\ else printf(\ } return 0; }

第七周 数组一

1组成最大数(10分)

题目内容:

任意输入一个自然数,输出该自然数的各位数字组成的最大数。

输入格式: 自然数 n 输出格式:

各位数字组成的最大数 输入样例: 1593 输出样例: 9531[回车]

源程序:

#include int main()

{ int a[10]={0},i=0,j,p,n,t; scanf(\ t=n; while(t) { a[i]=t; t=t/10; } p=i;

for(i=0;i

for(j=0;j

if(a[j]

{ t=a[j];a[j]=a[j+1];a[j+1]=t;} i++;

t=0;

for(i=0;i

t=t*10+a[i];

printf(\ return 0; }

2回文数(10分)

题目内容:

输出所有不超过n(取n<256)的、其平方具有对称性质的正整数(也称为回文数)。 如: 1*1=1; 2*2=4;3*3=9;11*11=121;1,2,3,11是回文数。 输入格式: 输入n(n<256) 输出格式:

输出所有不超过n的回文数 输入样例: 3

输出样例: 1[回车] 2[回车]

源程序:

#include int main() {

int n,m,i,f,s; scanf(\if(n<256 && n>0)

for(i=1;i

{ }

m=i*i; f=m; s=0; while(f>0) { s=s*10+f; f=f/10; }

if(m==s) printf(\

else printf(\ }

return 0;

3洗牌(10分)

题目内容:

假设我们有 2n 张牌,它们以 1, 2, ..., n, n+1, ..., 2n 编号并在开始时保持着这种顺序。一次洗牌就是将牌原来的次序变为 n+1, 1, n+2, 2, ..., 2n, n,也就是将原来的前 n 张牌放到位置 2, 4, ..., 2n,并且将余下的 n 张牌按照他们原来的次序放到奇数位置 1, 3, ..., 2n-1。已经证明对于任何一个自然数 n,这 2n 张牌经过一定次数的洗牌就回到原来的次序。但我们不知道对于一个特定的 n,需要几次洗牌才能将牌洗回原来的次序。 输入格式:

牌张数的一半n,即初始情况下一共有2n张牌,n为int型整数 输出格式:

将牌洗回原来的次序所需要的洗牌次数 输入样例: 10 输出样例: 6[回车]

源程序:

#include #define N 80000 int main() {

int a[N]={0},b[N]={0},c[N],i,n,s=0; scanf(\

for(i=0;i<2*n;i++)

{ a[i]=i+1; c[i]=a[i]; } do {

for(i=0;i=0;i--)

a[2*i+1]=a[i];

for(i=0;i

// for(i=0;i<2*n;i++) printf(\ // printf(\ s++;

}while(a[n]!=n+1);

printf(\

return 0; }

4子数整除(10分)

题目内容:

对于一个五位数a1a2a3a4a5,可将其拆分为三个子数:

? ? ? ? ?

sub1=a1a2a3 sub2=a2a3a4 sub3=a3a4a5

例如,五位数20207可以拆分成: sub1=202 sub2=020(=20)

? sub3=207

现在给定一个正整数K,要求你编程求出10000到30000之间所有满足下述条件的五位数,条件是这些五位数的三个子数sub1、sub2、sub3都可被K整除。 输出时请按照由小到大的顺序排列(每行输出一个数)。 输入格式: 一个正整数K 输出格式:

请按照由小到大的顺序排列(每行输出一个数) 输入样例: 15 输出样例: 22555[回车] 25555[回车] 28555[回车] 30000[回车]

源程序:

#include int main() {

int k,m,sub1,sub2,sub3; scanf(\

for(m=10000;m<=30000;m++) { sub1=m/100; sub2=m000/10; sub3=m00;

if(sub1%k==0 && sub2%k==0 && sub3%k==0)

} return 0;

printf(\

}

第八周 数组二

1单词排序(10分)

题目内容:

输入 5 个单词,将它们按从大到小的顺序排列后输出。 输入格式: 5个单词 输出格式: 排序后的顺序

输入样例: BASIC[回车] C++[回车] Pascal[回车] C[回车] Fortran[回车] 输出样例: Pascal[回车] Fortran[回车] C++[回车] C[回车] BASIC[回车]

源程序:

#include #include #define N 5 #define M 10000 int main() { }

char str[N][M],s[M]; int i,j; for(i=0;i

gets(str[i]);

for(i=0;i

for(j=0;j

if(strcmp(str[j],str[j+1])<=0) { strcpy(s,str[j]); strcpy(str[j],str[j+1]); strcpy(str[j+1],s); }

for(i=0;i

puts(str[i]);

return 0;

2寻找矩阵的鞍点(10分)

题目内容:

二维数组中的鞍点,即该位置上的元素是所在行上的最大值,是所在列上的最小值。

二维数组也可能没有鞍点。

输入一个二维数组的行数n,列数m,二维数组的诸元素值;输出数组的鞍点,以及鞍点所在的行列号。 输入格式:

第一行为矩阵的行数和列数,从第二行开始,为矩阵本身(假设输入的矩阵只有0和1个鞍点) 输出格式:

数组的鞍点,以及鞍点所在的行列号 (下标从0开始) 输入样例1:

3 4 1 3 5 3 2 3 4 1

3 2 6 7[回车]

输出样例1: Point:a[1][2]==4[回车] 输入样例2:

3 4 1 2 3 4 8 4 3 6

9 4 5 1[回车]

输出样例2: No Point[回车]

源程序:

#include #define N 30 int main() {

int a[N][N],n,m,i,j,k,c,r,f=0;

scanf(\

for(i=0;i

for(j=0;j

scanf(\

for(i=0;i

for(j=1;j

if(a[i][r]

for(k=1;k

if(a[c][r]>a[k][r]) c=k;

if(i==c)

{ f=1;printf(\

}

}

if(f==0) printf(\return 0;

3身份证的奥秘(10分)

题目内容:

18位身份证标准在国家质量技术监督局于1999年7月1日实施的 GB11643-1999《公民身份号码》中做了明确的规定。 GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称\社会保障号码\更名为\公民身份号码\,另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989。GB11643-1999《公民身份号码》主要内容如 下:

一、范围

该标准规定了公民身份号码的编码对象、号码的结构和表现形式,使每个编码对象获得一个唯一的、不变的法定号码。

二、编码对象

公民身份号码的编码对象是具有中华人民共和国国籍的公民。

三、号码的结构和表示形式

1、号码的结构

公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

2、地址码

表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。

3、出生日期码

表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。

4、顺序码

表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。

5、校验码

(1)十七位数字本体码加权求和公式

S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和 Ai: 表示第i位置上的身份证号码数字值 Wi: 表示第i位置上的加权因子 Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2

(2)计算模

Y = mod(S, 11)

(3)通过模得到对应的校验码

Y: 0 1 2 3 4 5 6 7 8 9 10 校验码: 1 0 X 9 8 7 6 5 4 3 2

四、举例如下:

北京市朝阳区: 11010519491231002X 广东省汕头市: 440524188001010014

15位的身份证号升级办法:

15位的身份证号:dddddd yymmdd xx p 18位的身份证号:dddddd yyyymmdd xx p y

? ? ? ?

其中dddddd为地址码(省地县三级) yyyymmdd yymmdd 为出生年月日 xx顺号类编码 p性别

15 位的 yy 年升为 18 位后,变成 19yy年,但对于百岁以上老人, 则为 18yy 年,此时,他们的最后三位顺序码为996, 997, 998 或 999 来标记。 输入格式:

输入n组身份证号码,第一行为个数,以后每行为身份证号码。 输出格式:

如果输入的身份证号码为15位,则将其升级为18位后显示输出;否则判断其是否为合法身份证号,并逐行输出。 输入样例:

4

350622197904130331 11010519491231002X 110105491231002

110105491231996[回车]

输出样例:

Invalid[回车] Valid[回车]

11010519491231002X[回车] 110105184912319965[回车] 源程序:

#include #include #include #define N 50 int main() {

char s[N][19],t[4],last,a[19];

int w[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; int n,i,j,sum,y,f=0; scanf(\

getchar();

for(i=0;i

gets(s[i]);

for(i=0;i

{ strcpy(a,s[i]);

for(j=16;j>7;j--)

s[i][j]=s[i][j-2]; t[0]=a[12];t[1]=a[13]; t[2]=a[14];t[3]='\\0';

if(strcmp(t,\

strcmp(t,\

s[i][7]='8'; else s[i][7]='9'; s[i][6]='1'; sum=0;

for(j=0;j<17;j++)

sum=sum+w[j]*(int)(s[i][j]-48); y=sum; switch(y)

{ case 0: s[i][17]='1';break; case 1: s[i][17]='0';break; case 2: s[i][17]='X';break; case 3: s[i][17]='9';break; case 4: s[i][17]='8';break; case 5: s[i][17]='7';break; case 6: s[i][17]='6';break; case 7: s[i][17]='5';break; case 8: s[i][17]='4';break; case 9: s[i][17]='3';break; case 10: s[i][17]='2';break; }

s[i][18]='\\0'; puts(s[i]); }

else if(strlen(s[i])==18)

{

sum=0;

for(j=0;j<17;j++)

sum=sum+w[j]*(int)(s[i][j]-48);

y=sum;

switch(y)

{ case 0: last='1';break; case 1: last='0';break; case 2: last='X';break; case 3: last='9';break; case 4: last='8';break; case 5: last='7';break; case 6: last='6';break; case 7: last='5';break; case 8: last='4';break; case 9: last='3';break; case 10: last='2';break; }

if(last==s[i][17]) printf(\ else printf(\ }

else printf(\

} return 0; }

4安全的密码(10分)

题目内容:

随着电子设备的广泛运用,密码也渐渐融入每个人的生活。保护好密码,不仅关系到个人隐私,更关系到个人的财产和安全。一个安全的密码,最好由大小写字母、数字或符号组成。包含越多种类的字符,其安全性就越高。同时密码还需要有一定的长度,通常至少要由六个以上的字符组成。

并不是每个人都喜欢这样复杂的密码,很多人在设置密码的时候,喜欢使用自己的名字或者生日,但这是很大的安全隐患。 任务

林晓炜正在设计一个网络交易系统,为了保证用户的密码安全,他需要一个程序,判断用户自己设置的密码是否安全,如果不安全,则给出提示。现在他向你求助,请你帮忙设计一个程序来解决这个问题。

应当按照以下的规则来判断密码是否安全: 1. 如果密码长度小于 6 位,则不安全 2. 如果组成密码的字符只有一类,则不安全 3. 如果组成密码的字符有两类,则为中度安全 4. 如果组成密码的字符有三类或以上,则为安全

通常,可以认为数字、大写字母、小写字母和其它符号为四类不同的字符。 输入格式:

输入的第一行是一个整数 N,表明后面有多少组密码。随后的 N 行输入包括 N 个密码,每个密码的长度均小于 20 个字符。 输出格式:

针对每一个密码判断并输出它是否安全。对于不安全的密码输出 \,对于中度安全的密码输出 \,对于安全的密码输出 \输入样例:

4 1234 abcdef ABC123

1#c3Gh[回车]

输出样例: Not Safe Not Safe Medium Safe[回车]

源程序:

#include #define N 100 int main() {

char mm[N][20]; int n,i,j,k,a[4]={0}; scanf(\getchar(); for(i=0;i

if(strlen(mm[i])>=20) mm[i][19]='\\0'; }

for(i=0;i

{

}

if(strlen(mm[i])<6) printf(\ else if(strlen(mm[i])>=6) { } } return 0;

for(j=0;j

if(mm[i][j]>='0' && mm[i][j]<='9') a[0]++; else if(mm[i][j]>='A' && mm[i][j]<='Z') a[1]++; else if(mm[i][j]>='a' && mm[i][j]<='z') a[2]++; else a[3]++;

k=0;

for(j=0;j<4;j++)

if(a[j]!=0) { k++;a[j]=0;}

if(k==1) printf(\ if(k==2) printf(\ if(k>=3) printf(\