聪明文档网

聪明文档网

最新最全的文档下载
当前位置: 首页> C语言程序设计上mooc答案

C语言程序设计上mooc答案

时间:2020-06-29 15:09:17    下载该word文档

第一周作业

【练习1HelloWorld

让我们学习用C语言向世界问好。

Hello World示例程序最早出现于1972年,由贝尔实验室成员Brian Kernighan撰写的内部技术文件《Introduction to the Language B》之中。不久同作者于1974年所撰写的《Programming in C: A Tutorial》,也延用这个示例。

一般来说,这是每一种计算机编程语言中最基本、最简单的程序,亦通常是初学者所编写的第一个程序。它还可以用来确定该语言的编译器、程序开发环境,以及运行环境是否已经安装妥当。将Hello World作为第一个示范程序,已经成为编程语言学习的传统。

我们在这里继续传统,这也是一种向前辈们致敬的方式之一吧!

最早的程序基本是这个样子的:

#include <stdio.h>
int main()
{
    printf("Hello world.\n");
    return 0;
}

请模仿上面的程序,看看是否可以通过编译?如果你能通过这个简单的程序,那就让我们继续完成后面的习题吧。

第二周作业

【练习2】学学scanfprintf的用法吧

该如何处理 double 型的数据:如何定义变量类型?如何使用 scanf 函数?

如果已知圆柱的底面半径 r ,以及高 h ,则可计算出圆柱的侧面积 s=2 π r h ,体积 v=π r 2 h 。其中 π=3.1415926

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

输出:
s=< 圆柱的侧面积 >,v=< 圆柱的体积 >

要求
1. 所有变量都定义为双精度类型
2. 结果精确到小数点后两位。

作为练习题目:

我们已经给您编写好了大部分的代码,请您自己修改几个地方,完成程序的剩余部分。

**********************************************分隔线************

#include
#define PAI  3.1415926
int main()
{
    int r,h;
    double s,v;
    scanf("%d %d",                  );
    s=2*PAI*r*h;
    v=PAI*r*r*h;
    printf("s=%.2f,v=       \n",s,     );
    return 0;
}

**********************************************分隔线************

Code:

#include

#define PAI 3.1415926

int main()

{

int r,h;

double s,v;

scanf("%d %d",&r,&h);

s=2*PAI*r*h;

v=PAI*r*r*h;

printf("s=%.2f,v=%.2f\n",s,v);

return 0;

}

第三周作业

1、输出字符的 ASCII

背景:

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

输入:

    一个字符

输出:

    该字符对应的ASCII

Code

#include

int main()

{

char ch;

scanf("%c",&ch);

printf("The ASCII of character '%c' is %d.",ch,ch);

return 0;

}

2一年级的算术题

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

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

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

Code

#include

int main()

{

int a, b;

char ch = 37;

scanf("%d%d",&a,&b);

printf("%d+%d=%d\n",a,b,a + b);

printf("%d-%d=%d\n",a,b,a - b);

printf("%d*%d=%d\n",a,b,a * b);

printf("%d/%d=%d\n",a,b,a / b);

printf("%d%c%d=%d\n",a,ch,b,a % b);

return 0;

}

3、判断三角形的形状

要求

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

输入:

三角型的3条边的长度(int型)。

输出:

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

Code

#include

int main()

{

int a, b, c;

scanf("%d%d%d",&a,&b,&c);

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

{

if(a == b && a == c && b == c)

{

printf("equilateral triangle.\n");

return 0;

}

if(a == b || a == c || b == c)

{

printf("isoceles triangle.\n");

return 0;

}

printf("triangle.\n");

}

else

{

printf("non-triangle.\n");

}

return 0;

}

第四周作业

1.【中学】计算时钟的夹角

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

输入:

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

输出:

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

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

o Code

#include

int main()

{

int hour, minute, temp;

float angle, h_angle, m_angle;

scanf("%d%d",&hour,&minute);

temp = hour;

if(hour == 12) temp = 0;

h_angle = temp * 30.0 + minute * 0.5;

m_angle = minute * 6.0;

angle = h_angle > m_angle ? h_angle - m_angle : m_angle - h_angle;

if(angle > 180.0) angle = 360.0 - angle;

printf("At %d:%02d the angle is %.1f degrees.\n",hour,minute,angle);

return 0;

}

2.【日期】确定母亲节

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

输入:

    年份

输出:

    日期(5月的哪一天)

Code:

#include

int main()

{

int year, n, week, total, day;

scanf("%d",&year);

if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)

{

week = (year + year / 4 + year / 400 - year / 100 - 1) % 7;

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

{

if(n == 0) total = 0;

if(n == 1 || n == 3) total += 31;

if(n == 2) total += 29;

if(n == 4) total += 30;

}

}

else

{

week = (year + year / 4 + year / 400 - year / 100) % 7;

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

{

if(n == 0) total = 0;

if(n == 1 || n == 3) total += 31;

if(n == 2) total += 28;

if(n == 4) total += 30;

}

}

week = (week + total) % 7;

if (week == 0) week = 7;

day = 7 - week + 8;

printf("%d\n",day);

return 0;

}

3.【日期】计算星期

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

输入:

    

输出:

    06
    星期日用 0 表示,星期一用 1 表示,星期二用 2 表示......星期六用 6 表示。

假设年份大于1900。先想一想:我们现在只会使用 if 语句,该如何建立数学模型?

Code:

#include

int main()

{

int year, month, day, n, week, total;

scanf("%d%d%d",&year, &month, &day);

if(year <= 1900){

printf("year is error.\n");

return 0;

}

if(month >= 13 || month < 1){

printf("month is error.\n");

return 0;

}

if(day < 0){

printf("day is error.\n");

return 0;

}

switch (month){

case 1:

case 3:

case 5:

case 7:

case 8:

case 10:

case 12:

if(day > 31)

{printf("day is error.\n"); return 0;}

break;

case 4:

case 6:

case 9:

case 11:

if(day > 30)

{printf("day is error.\n"); return 0;}

break;

case 2:if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)

{

if(day > 29) {printf("day is error.\n"); return 0;}

}

else

{

if(day > 28) {printf("day is error.\n"); return 0;}

}

break;

}

if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)

{

week = (year + year / 4 + year / 400 - year / 100 - 1) % 7;

for(n = 0;n < month; n++)

{

if(n == 0) total = 0;

if(n == 1 || n == 3 || n == 5 || n == 7 || n == 8 || n == 10 ) total += 31;

if(n == 2) total += 29;

if(n == 4 || n == 6 || n == 9 || n == 11) total += 30;

}

}

else

{

week = (year + year / 4 + year / 400 - year / 100) % 7;

for(n = 0; n < month; n++)

{

if(n == 0) total = 0;

if(n == 1 || n == 3 || n == 5 || n == 7 || n == 8 || n == 10 ) total += 31;

if(n == 2) total += 28;

if(n == 4 || n == 6 || n == 9 || n == 11) total += 30;

}

}

week = (week + total + day - 1) % 7;

printf("%d\n",week);

return 0;

}

4.【中学】求最后3位数值(选做)

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

输入:

    a n 的值。假设 a<=150

输出:

    a n 次方的最后 3 位数。

提示:再想一想,你的方法对吗?你用的是什么数据类型?

o Code:

#include

int main()

{int a,b,d,c=1;

scanf("%d%d",&a,&b);

if(b==0)

c=1;

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

{

c*=a;

c=c%1000;}

if(c==0)

printf("The last 3 numbers is 000.\n");

else

{

printf("The last 3 numbers is %d.",c);

return 0;}

}第五周作业

1.锻炼身体吧

题目描述:

沫沫,灰灰和渣渣去锻炼身体,如果对他们跑步的距离分别只计整数 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, 共一种。

Code:

#include

int main()

{

int a = 1,b = 1,c = 1,maxnum,count = 0;

scanf("%d",&maxnum);

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

{

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

{

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

{

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

}

}

}

printf("%d\n",count);

return 0;

}

2.寻找特殊偶数

背景

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

输入

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

输出

列出此范围内的所有特殊偶数,并且列出此范围内特殊偶数的个数。

Code:

#include

int main()

{

int maxnum, minnum, n, g, s, b, q, count = 0;

while(1){

scanf("%d%d",&minnum,&maxnum);

if(minnum == 0 && maxnum == 0) return 0;

if((minnum > 999 && minnum < 10000) && (maxnum > 999 && maxnum < 10000) && (maxnum >= minnum))

{

for(n = minnum; n <= maxnum; n++)

{

if(n % 2 == 0){

q = n / 1000;

b = n % 1000 / 100;

s = n % 100 / 10;

g = n % 10;

if(q != b && q != s && q != g && b != s && b != g && s != g)

{

count++;

printf("%d ",n);

}

}

}

printf("\n");

printf("counter=%d\n",count);

count = 0;

}

else

printf("Error\n");

}

return 0;

}

3.求最小 m

求满足下列不等式的最小 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

Code:

#include

int main()

{

int max, i = 0, sum = 0;

scanf("%d",&max);

while(sum < max)

{

i++;

sum += i;

}

printf("%d\n",i);

}

第六周作业

数字正方型

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

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

输入: 
    n

输出:
   数字组成的正方型

Code

#include

int main()

{

int n, x, y, count = 0;

scanf("%d",&n);

for(y = 0; y < n; y++)

{

for(x = 0; x < n; x++)

{

count++;

printf("%3d",count);

}

printf("\n");

}

return 0;

}

空心字符菱形

输入:

    菱型起始字母和菱形的高度。

输出:

    参看测试用例,打印空心的由字符组成的菱形。

Code:

#include

int main()

{

int n, i, q, p;

char ch;

scanf("%c%d",&ch,&n);

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

{

for(q = i; q < n - 1; q++)

printf(" ");

printf("%c",ch + i);

for(q = 0; q < (2 * i - 1); q++)

{

printf(" ");

if(q == 2 * i - 2)

printf("%c",ch + i);

}

printf("\n");

}

for(i = n - 2; i >= 0; i--)

{

for(q = i; q < n - 1; q++)

printf(" ");

printf("%c", ch + i);

for(q = 2 * i - 1; q > 0; q--)

{

printf(" ");

if(q == 1)

printf("%c", ch + i);

}

printf("\n");

}

return 0;

}

邮票组合

背景:
        我们寄信都要贴邮票,在邮局有一些小面值的邮票,通过这些小面值邮票中的一张或几张的组合,可以满足不同邮件的不同的邮资。
        现在,邮局有4种不同面值的邮票。在每个信封上最多能贴5张邮票,面值可相同,可不同。

输入:
        四种邮票的面值。

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

说明:
        如结果为10,则表明使用4张邮票可组合出12345678910这些邮资。

名词解释:
        邮资:就是你寄东西需要花多少钱。
        邮票面额:是由国家发行的具有固定价格的花纸片,被称为邮票。

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

Code:

#include

int main()

{

int i[5],t[3126],n,n1,n2,n3,n4,temp = 0;

i[0] = 0;

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

scanf("%d",&i[n]);

for(n = 0; n < 3126; n++)

t[n] = 0;

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

{

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

{

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

{

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

{

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

{

t[temp] = i[n] + i[n1] + i[n2] + i[n3] + i[n4];

temp++;

}

}

}

}

}

for(n = 0; n < 3124; n++)

{

for(n1 = n; n1 < 3125; n1++)

{

if(t[n] > t[n1])

{

temp = t[n];

t[n] = t[n1];

t[n1] = temp;

}

}

}

temp = 0;

for(n = 0; n < 3125; n++)

{

if(t[n] < t[n + 1] )

temp++;

if(temp != t[n + 1])

break;

}

printf("The max is %d.\n",temp - 1);

return 0;

}

火锅火锅和火锅(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

时间限制:500ms内存限制:32000kb

Code:

#include

#include

#include

int main()

{ int i,j,k,n,t,sum,len,maxl;

scanf("%d",&t);

while(t--)

{scanf("%d",&n);

sum=len=0;

maxl=-1001;//maxl小于愉快度可能的最小值

while(n--)

{

scanf("%d",&k);

if(maxl

len=len+k>0?len+k:0;

if(sum

}

if(maxl<0) printf("%d\n",maxl);

else printf("%d\n",sum);

}

return 0;}

程序讲解示例:整数排排序

有一组整数,要将它们从小到大排序,去掉其中重复的数值。

输入:

1行,输入整数N,表明接下来将有N<=100)个整数读入。

2~N行,输入N个这个数。

输出:排序后的整数(去掉重复的数值)

例如:

输入:

3(回车)

7 5 7(回车)

输出:5 7(回车)

Code:

#include

int main()

{

int n, m, l, i[100], temp;

scanf("%d",&n);

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

scanf("%d",&i[m]);

for(m = 0; m < n - 1; m++)

for(l = m + 1; l < n; l++)

{

if(i[m] > i[l])

{

temp = i[m];

i[m] = i[l];

i[l] = temp;

}

}

printf("%d",i[0]);

temp = i[0];

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

{

if(temp < i[m])

{

printf(" %d",i[m]);

temp = i[m];

}

}

printf("\n");

}

第八周作业

1.单词排序

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

输入:

    5个单词

输出:

    排序后的顺序

Code:

#include

#include

int main()

{

char s[5][100], t[100];

int i, n;

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

scanf("%s",s[i]);

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

{

for(n = i + 1; n < 5; n++)

{

if(strcmp(s[i],s[n]) < 0)

{

strcpy(t,s[i]);

strcpy(s[i],s[n]);

strcpy(s[n],t);

}

}

}

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

printf("%s\n",s[i]);

return 0;

}

2.寻找矩阵的鞍点

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

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

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

输入:第一行为矩阵的行数和列数,从第二行开始,为矩阵本身(假设输入的矩阵只有01个鞍点)
    3 4
    1 3 5 3
    2 3 4 1
    3 2 6 7

输出
     Point: a[1][2] == 4   (下标从0开始)

Code:

#include

#include

int main()

{

int i[100][100], m, n, x, y, temp, log = 0;

scanf("%d%d",&m,&n);

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

{

for(x = 0; x < n; x++)

{

scanf("%d",&i[y][x]);

}

}

//将每行的最大值放入每行的最后;

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

{

temp = 0;

for(x = 0; x < n; x++)

{

if(i[y][x] > temp)

temp = i[y][x];

}

i[y][n] = temp;

}

//将每列的最小值放入每列的最后

for(x = 0; x < n; x++)

{

temp = 0x7fffffff;

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

{

if(i[y][x] < temp)

temp = i[y][x];

}

i[m][x] = temp;

}

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

{

for(x = 0; x < n; x++)

{

if((i[y][x] == i[m][x]) && (i[y][x] == i[y][n]))

{printf("Point:a[%d][%d]==%d\n",y,x,i[y][x]);log = 1;}

}

}

if(log == 0)

printf("No Point\n");

return 0;

}

3.身份证的奥秘

背景

18位身份证标准在国家质量技术监督局于199971日实施的GB11643-1999《公民身份号码》中做了明确的规定。 GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称"社会保障号码"更名为"公民身份号码",另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989GB11643-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) Y = 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

四、举例如下:

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

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

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

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

o 其中dddddd为地址码(省地县三级)

o yyyymmdd yymmdd 为出生年月日

o xx顺号类编码

o p性别

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

输入

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

输出

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

Code:

#include

#include

int main()

{

int n, i, m, j, sumt, y;

char s[100][19], temp[19], t;

scanf("%d",&n);

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

scanf("%s",s[i]);

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

{

m = 0;

while(s[i][m] != '\0')

{

m++;

}

if( m != 15 && m != 18)

{

printf("Invalid\n");

}

if( m == 15)

{

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

temp[j] = s[i][j];

if(s[i][12] == '9' && s[i][13] == '9' && s[i][14] > '5')

{

temp[6] = '1'; temp[7] = '8';

}

else

{

temp[6] = '1'; temp[7] = '9';

}

for(j = 6; j < 16; j++)

temp[j + 2] = s[i][j];

strcpy(s[i],temp);

sumt = (s[i][0] - '0') * 7 + (s[i][1]- '0') * 9 + (s[i][2] - '0') * 10 + (s[i][3] - '0') * 5 + (s[i][4] - '0') * 8 + (s[i][5] - '0') * 4 + (s[i][6]-'0') * 2 + (s[i][7]-'0') * 1 + (s[i][8]-'0') * 6 + (s[i][9]-'0') * 3 + (s[i][10]-'0') * 7 + (s[i][11]-'0') * 9 + (s[i][12]-'0') * 10 + (s[i][13]-'0') * 5 + (s[i][14]-'0') * 8 + (s[i][15]-'0') * 4 + (s[i][16]-'0') * 2;

//sumt = atoi(s[i][0]) * 7 + atoi(s[i][1]) * 9 + atoi(s[i][2]) * 10 + atoi(s[i][3]) * 5 +atoi(s[i][4]) * 8 + atoi(s[i][5]) * 4 + atoi(s[i][6]) * 2 + atoi(s[i][7]) * 1 + atoi(s[i][8]) * 6 + atoi(s[i][9]) * 3 + atoi(s[i][10]) * 7 + atoi(s[i][11]) * 9 + atoi(s[i][12]) * 10 + atoi(s[i][13]) * 5 + atoi(s[i][14]) * 8 + atoi(s[i][15]) * 4 + atoi(s[i][16]) * 2;

y = sumt % 11;

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';

printf("%s\n",s[i]);

}

if(m == 18)

{

sumt = (s[i][0] - '0') * 7 + (s[i][1]- '0') * 9 + (s[i][2] - '0') * 10 + (s[i][3] - '0') * 5 + (s[i][4] - '0') * 8 + (s[i][5] - '0') * 4 + (s[i][6]-'0') * 2 + (s[i][7]-'0') * 1 + (s[i][8]-'0') * 6 + (s[i][9]-'0') * 3 + (s[i][10]-'0') * 7 + (s[i][11]-'0') * 9 + (s[i][12]-'0') * 10 + (s[i][13]-'0') * 5 + (s[i][14]-'0') * 8 + (s[i][15]-'0') * 4 + (s[i][16]-'0') * 2;

y = sumt % 11;

switch (y)

{

case 0: t = '1'; break;

case 1: t = '0'; break;

case 2: t = 'X'; break;

case 3: t = '9'; break;

case 4: t = '8'; break;

case 5: t = '7'; break;

case 6: t = '6'; break;

case 7: t = '5'; break;

case 8: t = '4'; break;

case 9: t = '3'; break;

case 10: t = '2'; break;

}

if(t == s[i][17])

printf("Valid\n");

else

printf("Invalid\n");

}

}

return 0;

}

4.安全的密码

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

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

任务

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

应当按照以下的规则来判断密码是否安全:

1. 如果密码长度小于 6 位,则不安全

2. 如果组成密码的字符只有一类,则不安全

3. 如果组成密码的字符有两类,则为中度安全

4. 如果组成密码的字符有三类或以上,则为安全

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

输入

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

输出

针对每一个密码判断并输出它是否安全。对于不安全的密码输出 "Not Safe",对于中度安全的密码输出 "Medium Safe",对于安全的密码输出 "Safe"

输入样例

4
1234
abcdef
ABC123
1#c3Gh

输出样例

Not Safe
Not Safe
Medium
Safe Safe

Code:

#include

#include

int main()

{

int n, i, j, m, log1, log2, log3, log4;

char s[100][21], t[10];

scanf("%d",&n);

gets(t);

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

gets(s[i]);

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

{

j = 0;

while(s[i][j] != '\0')

{

j++;

}

if(j < 6)

{

printf("Not Safe\n");

continue;

}

j = 0;

log1 = 0;

log2 = 0;

log3 = 0;

log4 = 0;

while(s[i][j] != '\0')

{

if(s[i][j] >= '0' && s[i][j] <= '9') log1 = 1;

if(s[i][j] >= 'a' && s[i][j] <= 'z') log2 = 1;

if(s[i][j] >= 'A' && s[i][j] <= 'Z') log3 = 1;

if(!(s[i][j] >= '0' && s[i][j] <= '9') && !(s[i][j] >= 'a' && s[i][j] <= 'z') && !(s[i][j] >= 'A' && s[i][j] <= 'Z')) log4 =1;

j++;

}

m = 0;

if(log1 == 1) m++;

if(log2 == 1) m++;

if(log3 == 1) m++;

if(log4 == 1) m++;

if(m == 1) printf("Not Safe\n");

if(m == 2) printf("Medium Safe\n");

if(m >= 3) printf("Safe\n");

}

return 0;

}

第七周作业

1.组成最大数

任意输入一个自然数,输出该自然数的各位数字组成的最大数。例如,输入 1593 ,则输出为 9531

输入:自然数 n

输出:各位数字组成的最大数

Code:

#include

int main()

{

char s[50],t;

int n = 0, i, m;

scanf("%s",s);

while(s[n] != '\0')

{

n++;

}

for(i = 0; i < n - 1; i++)

{

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

{

if(s[i] < s[m])

{

t = s[i];

s[i] = s[m];

s[m] = t;

}

}

}

printf("%s\n",s);

}

2.回文数

输出所有不超过n(n<256)的、其平方具有对称性质的正整数(也称为回文数)。

如:  1*1=1 2*2=43*3=911*11=121

Code:

#include

int main()

{

int n, m, square, i, temp, log;

char s[6];

scanf("%d",&n);

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

{

i = 0;

square = m * m;

log = 1;

while(square != 0)

{

temp = square % 10;

s[i] = '0' + temp;

i++;

square /= 10;

}

for(temp = 0; temp < i / 2; temp++)

{

if(s[temp] != s[i - 1 - temp]) log = 0;

}

if(log)

printf("%d\n",m);

}

return 0;

}

3.洗牌

    假设我们有 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张牌,nint型整数

输出:
    将牌洗回原来的次序所需要的洗牌次数

Code:

#include

int main()

{

int a[100000],tmp1[50000],tmp2[50000], i, m, n = 0, log = 0, total = 0;

scanf("%d",&i);

//

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

a[m] = m;

do{

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

{

tmp1[m] = a[m];

tmp2[m] = a[m + i];

}

n = 0;

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

{

a[n] = tmp2[m];

n++;

a[n] = tmp1[m];

n++;

}

log = 0;

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

{

if(a[m] != m)

{

log = 0;

break;

}

if(a[m] == m)

{

log = 1;

}

}

total++;

}while(log != 1);

printf("%d\n",total);

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[回车]

时间限制:500ms内存限制:32000kb

Code:

#include

main()

{

int k, a,num1,num2,num3;

scanf("%d",&k);

for (a=10000;a!=30001;a++)

{

num1=a/100;

num2=a/10-(a/10000)*1000;

num3=a-(a/1000)*1000;

if((num1 % k)==0&&(num2 % k)==0&&(num3 % k)==0)

printf("%d\n",a);

}

return 0;

}

免费下载 Word文档免费下载: C语言程序设计上mooc答案

  • 29.8

    ¥45 每天只需1.0元
    1个月 推荐
  • 9.9

    ¥15
    1天
  • 59.8

    ¥90
    3个月

选择支付方式

  • 微信付款
郑重提醒:支付后,系统自动为您完成注册

请使用微信扫码支付(元)

订单号:
支付后,系统自动为您完成注册
遇到问题请联系 在线客服

常用手机号:
用于找回密码
图片验证码:
看不清?点击更换
短信验证码:
新密码:
 
绑定后可用手机号登录
请不要关闭本页面,支付完成后请点击【支付完成】按钮
遇到问题请联系 在线客服