哈工大 C语言程序设计精髓 MOOC慕课 6-12周编程题答案

更新时间:2024-05-04 16:54:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

6.1 \下面代码的功能是将百分制成绩转换为5分制成绩,具体功能是:如果用户输入的是非法字符或者不在合理区间内的数据(例如输入的是a,或者102,或-45等),则程序输出 Input error!,并允许用户重新输入,直到输入合法数据为止,并将其转换为5分制输出。目前程序存在错误,请将其修改正确。并按照下面给出的运行示例检查程序。 */

#include #include int main() {

char score[100];

int flag = 0, i, s; char grade;

printf(\ while (1) {

flag=0; scanf(\

for (i = 0; i < strlen(score); i++) {

if (score[i] >= '0' && score[i] <= '9') {

continue; } else {

flag = 1; break; } }

s = atoi(score);

if (s < 0 || s > 100 || flag == 1) { printf(\printf(\ continue; } else{

break; } }

s = atoi(score);

if (s >= 90) {

grade = 'A'; }

else if (s >= 80) {

grade = 'B'; }

else if (s >= 70) {

grade = 'C'; }

else if (s >= 60) {

grade = 'D'; } else {

grade = 'E'; }

printf(\

return 0; }\

6.2 \#include int main() {

int n,a,i,j; double p=0,q=0; printf(\scanf( \ for(i=1;i<=n;i++) {

for(j=0,p=0;j

p=p+a*pow(10,j); } q=p+q; }

printf(\ return 0; }\6.3 \

n块砖( 27

程序的运行结果示例1: Input n(27

men=0,women=4,children=32

程序的运行结果示例2: Input n(27

men=3,women=3,children=30

程序的运行结果示例3: Input n(27

men=2,women=14,children=20 men=7,women=7,children=22 men=12,women=0,children=24

输入提示: \

输入格式: \

输出格式:\*/

#include \main() {

printf(\ long n, i, t, s = 0; scanf(\ int a, b, c;

for (a = 0; 4 * a <= n; a++)

for (b = 0; 4 * a + 3 * b <= n; b++)

for (c = 0; 4 * a + 3 * b + c / 2 <= n; c += 2)

if (4 * a + 3 * b + c / 2 == n && c%2 == 0 && a+b+c==36)

{

printf(\ } }\

6.4 \int main()

{int year,month,day;

printf(\scanf(\switch(month) {

case 1: day=31;break; case 2: day=28;break; case 3: day=31;break; case 4: day=30;break; case 5: day=31;break; case 6: day=30;break; case 7: day=31;break; case 8: day=31;break; case 9: day=30;break; case 10: day=31;break; case 11: day=30;break; case 12: day=31;break;

default:day=-1;printf(\}

if((year%4==0&&year0!=0||year@0==0)&&month==2) if (day!=-1)

printf(\

day=29; return 0; }\

7.1 \

unsigned int ComputeAge(unsigned int n){ } main() {

int i, j, k, s = 23, n, c, age; scanf(\

printf(\ }\

7.2 \int gys(int a,int b) {

int r; r=a%b;

if(r==0) return b;

else return gys(b,r); } main() {

printf(\ int a,b;

scanf(\ if (a<=0 || b<=0){ printf(\ } else

printf(\ }\

7.3 \int median(int a, int b, int c) {

if(a

if(b

else{return a } else {

if(c>a){return a;}//c>a>b else{return c>b? c: b;}//a>c>b: a>b>c } } main() {

int a,b,c;

scanf(\

printf(\ }\

7.4 \main() {

printf(\ int a,b,c,n,s,x,y,z,flag=0; scanf(\

for (x=1;x<=9;x++){ for (y=1;y<=9;y++){ for (z=0;z<=9;z++){

if (x*100+y*10+z+y*100+z*11 == n){ flag=1; a=x,b=y,c=z; break; } } } } if (flag)

printf(\ else printf(\ }\

8.1 \用二维数组作为函数参数,编程计算并输出n×n阶矩阵的转置矩阵。其中,n的值不超过10,n的值由用户从键盘输入。

程序运行结果示例1: Input n:3↙

Input 3*3 matrix: 1 2 3 4 5 6 7 8 9

The transposed matrix is: 1 4 7 2 5 8 3 6 9

程序运行结果示例2: Input n:2↙ Input 2*2 matrix: 1 2↙ 4 5↙

The transposed matrix is: 1 4 2 5

输入提示信息:

提示输入矩阵的阶数:\

提示输入矩阵数据:\输入格式: \

输出提示信息:\输出格式:\#include int main(){ printf(\ int n;

scanf(\

printf(\ int m[n][n],i,j; for (i=0;i

scanf(\ } }

printf(\ for (i=0;i

printf(\

}

printf(\ }

return 0; }\

8.2 \用二维数组作为函数参数,编程计算并输出n×n阶矩阵的转置矩阵。其中,n的值不超过10,n的值由用户从键盘输入。

程序运行结果示例1: Input n:3↙ Input 3*3 matrix: 1 2 3 4 5 6 7 8 9

The transposed matrix is: 1 4 7 2 5 8 3 6 9

程序运行结果示例2: Input n:2↙ Input 2*2 matrix: 1 2↙ 4 5↙

The transposed matrix is:

1 4 2 5

输入提示信息:

提示输入矩阵的阶数:\

提示输入矩阵数据:\输入格式: \

输出提示信息:\输出格式:\#include int main(){

printf(\ int n,total=0,i,s=0,b=1,t; scanf(\ printf(\ for (i=2;i<=n;i++){ t=s; s=b; b=b+t;

printf(\ }

printf(\

return 0; }\8.3 \

一辆卡车违犯交通规则,撞人后逃跑。现场有三人目击事件,但都没记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是位数学家,他说:四位的车号刚好是一个整数的平方。现在请根据以上线索帮助警方找出车号以便尽快破案。

[提示]:假设这个4位数的前两位数字都是i,后两位数字都是j,则这个可能的4位数 k = 1000*i + 100*i + 10*j + j

式中,i和j都在0~9变化。此外,还应使k=m*m,m是整数。由于k是一个4位数,所以m值不可能小于31。 输入格式: 无

输出格式:\*/

#include int main(){

int i,j,k,m,tk,tm; for (i=0;i<=9;i++){ for (j=0;j<=9;j++){

for (m=31;m<100;m++){ k = 1000*i + 100*i + 10*j + j; if (i!=j && m*m==k){

tm=m; tk=k; break; } } } }

printf(\ return 0; }\8.4 \

幻方矩阵是指该矩阵中每一行、每一列、每一对角线上的元素之和都是相等的。从键盘输入一个5×5的矩阵并将其存入一个二维整型数组中,检验其是否为幻方矩阵,并将其按指定格式显示到屏幕上。 输入格式: \输出格式:

如果是幻方矩阵,输出提示信息: \矩阵元素的输出: \(换行使用\)

如果不是幻方矩阵,输出提示信息: \输入样例1: 17_24_1_8_15 23_5_7_14_16

4_6_13_20_22 10_12_19_21_3 11_18_25_2_9

(输人样例中“_”代表空格) 输出样例1: It is a magic square! **17**24***1**8**15 **23***5***7**14**16 ***4***6**13**20**22 **10**12**19**21***3 **11**18**25***2***9 (输出样例中“*”代表空格) 输入样例2: 1_0_1_6_1 3_1_1_1_1 1_1_1_1_2 1_1_1_1_1 9_1_7_1_1

(输人样例中“_”代表空格) 输出样例2:

It is not a magic square!

注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字

符串!

(输人样例中“_”代表空格,输出样例中“*”代表空格) */

#include int main() {

int a[5][5],i,j,t,row[5]={0},col[5]={0},dl1=0,dl2=0,flag=1; for (i=0;i<5;i++){ for (j=0;j<5;j++){

scanf(\ } }

for (i=0;i<5;i++){ for (j=0;j<5;j++){ row[i]+=a[i][j]; } }

for (i=0;i<5;i++){ for (j=0;j<5;j++){ col[i]+=a[j][i]; }

}

for (i=0;i<5;i++){ dl1+=a[i][i]; dl2+=a[4-i][4-i]; }

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

if (col[i]!=col[i+1]){ flag=0; break; }

if (row[i]!=row[i+1]){ flag=0; break; } }

if (col[1]!=row[1]){ flag=0;

}

if (dl1!=dl2){ flag=0;

}

if (dl1!=col[1]){ flag=0; } if (flag){

printf(\ for (i=0;i<5;i++){ for (j=0;j<5;j++){

printf(\ }

printf(\ } } else{

printf(\ } return 0; }\ 9.1 \

从键盘输入一个数,检查这个数中是否有重复出现的数字。如果这个数中有重复出现的数字,

则显示“Repeated digit!”;否则显示“No repeated digit!”。 已知函数原型:

int CountRepeatNum(int count[], int n);

若有重复数字,则该函数返回重复出现的数字;否则返回-1. 程序运行结果示例1: Input n: 28212 Repeated digit!

程序运行结果示例2: Input n: 12345↙

No repeated digit!

输入提示:\输入格式: \输出格式:

有重复数字,输出信息: \没有重复数字,输出信息: \*/

#include int main()

{

int log[10]= {0},a[100]; int b,i=0,n,c,d; printf(\ scanf(\ while(n!=0) {

b=n; n/=10; a[i]=b; i++; } a[i]=n;

int flag=0; for(c=0; c

if(a[c]==a[d]) {

flag=1; break;

} }

//if (a[0] == a[i-1]||a[0] == a[1]) flag=1; if(flag) printf(\else printf(\ }\9.2 \

教授正在为一个有N个学生的班级讲授离散数学课。他对某些学生缺乏纪律性很不满意,于是决定:如果课程开始后上课的人数小于K,就取消这门课程。从键盘输入每个学生的到达时间,请编程确定该课程是否被取消。如果该门课程被取消,则输出“Yes”,否则输出“No”。假设教授在时刻0开始上课。如果一个学生的到达时间是非正整数,则表示该学生在上课前进入教室。如果一个学生的到达时间是正整数,则表示该学生在上课后进入教室。如果一个学生在时刻0进入教室,也被认为是在上课前进入教室。假设到达时间的绝对值不超过100,学生数N不超过1000。要求在输入学生的到达时间之前,先输入N和K。 已知函数原型:

//函数功能:根据数组a中记录的学生到达时间确定课程是否被取消,取消则返回1,否则返回0

int IsCancel(int a[], int n, int k); 程序运行结果示例1: Input n,k:

4,3↙ -1 -3 4 2↙ YES

程序运行结果示例2: Input n,k: 5,3↙ -1 -2 -3 0 4↙ NO

输入提示:\输入格式: \\

输入包括两行数据: 第1行是n,k的值。 第2行是学生的到达时间。 输出格式:

课程被取消,输出\课程不取消,输出\*/

#include

int IsCancel(int a[], int n, int k){ int i,s=0; for (i=0;i

else return 0; } int main() {

int a[100]; int i,n,k;

printf(\ scanf(\ for (i=0;i

if(IsCancel(a,n,k)) printf(\else printf(\ }\9.3 \

请编程找出一个M*N矩阵中的鞍点,即该位置上的元素是该行上的最大值,是该列上的最小值。如果矩阵中没有鞍点,则输出“No saddle point!” 已知函数原型:

void FindSaddlePoint(int a[][N], int m, int n); 在该函数中输出有无鞍点的信息。 程序运行结果示例1: Input m,n: 3,3↙ Input matrix: 1 2 3 4 5 6 7 8 9 a[0][2] is 3

程序运行结果示例2: Input m,n:

3,4↙ Input matrix: 3 4 7 5 0 1 8 2 9 3 2 6

No saddle point!

输入提示: \ “Input matrix:\\n\输入格式:

输入矩阵大小: \输入矩阵元素: \输出格式:

找到鞍点的输出格式:\没找到鞍点的输出格式:\*/

#include #include main() {

int a[100][100],m;

int n,i,j,k,max,flag=0,shit=0,l;

printf(\ scanf(\printf(\for(i=0; i

scanf(\for(i=0; i

flag=0; m=a[i][0]; for(j=0; jm) {

m=a[i][j]; max=j; } for(k=0; k

if(a[k][max]<=m &&k!=i) {

flag=1; break;

} }

if(flag==0){

printf(\ } }

if (shit==0)

printf(\}\9.4 \

输入一串字符(字符数小于80),以回车表示输入结束,编程计算并输出这串字符中连续重复次数最多的字符和重复次数。如果重复次数最多的字符有两个,则输出最后出现的那一个。 已知函数原型:

//函数功能:统计字符串中连续重复次数最多的字符及其重复的次数

//函数参数:str指向待统计的字符串,指针形参tag返回重复字符最后出现的下标位置 //函数返回值:返回字符重复的次数 int CountRepeatStr(char str[], int *tag);

求解思路:设置一个计数器,遍历字符串中的所有字符,若str[i] == str[i+1],则计数器加1,同时判断计数器的值是否大于记录的最大重复次数max,若大于,则用计数器的值更新max,并记录该字符最后出现的位置i+1.若str[i] != str[i+1],则计数器重新初始化为1。遍历结束时,函数返回max的值。

程序运行结果示例1: Input a string: 2344455555↙ 5:5

程序运行结果示例2: Input a string: sgf222257↙ 2:4

输入提示信息:\输入格式: 用gets()输入字符串 输出格式:\*/

#include #include

int main() {

char a[80];

int b, i,j,t=1,tl,num=0; printf(\

gets(a);

for (i=0;i

for (j=i+1;j

if (t>tl){ tl=t; num=i; } } }

printf(\}\ 10.1 \/*

从键盘输入一串字符(假设字符数少于8个),以回车表示输入结束,编程将其中的数字部分转换为整型数并以整型的形式输出。 函数原型为 int Myatoi(char str[]);

其中,形参数组str[]对应用户输入的字符串,函数返回值为转换后的整型数。

解题思路的关键是:1)判断字符串中的字符是否是数字字符;2)如何将数字字符转换为其对应的数字值;3)如何将每一个转换后的数字值加起来形成一个整型数。 程序运行结果示例1: Input a string:7hg09y↙ 709

程序运行结果示例2: Input a string:9w2k7m0↙ 9270

程序运行结果示例3: Input a string:happy↙ 0

输入提示信息:\输入格式: \输出格式:\*/

#include #include #include int Myatoi(char str[]){ int i,j;

for (i=0,j=0;str[i]!='\\0';i++){

if (str[i] >='0' && str[i]<='9'){ str[j]=str[i]; j++; } } str[j]='\\0'; return atoi(str); } int main() {

char s[7]; printf(\scanf(\printf(\ printf(\ return 0;

}\

10.2 \/*输入n个整数(n从键盘输入,假设n的值不超过100),按奇偶数分成两组并输出。输出两行,第一行为所有奇数,第二行为所有偶数,保持数据的相对顺序与输入顺序相同。 函数原型如下所示:

void Seperate(int a[], int n); //数组a[]存放用户输入的n个整数

解题思路:用两个循环分别输出奇数和偶数,在输出第一个数时用\格式字符,在输出其余数时用\格式字符,用标志变量记录和判断是否是第一个奇数或偶数。 程序运行结果示例1: Input n:7↙

Input numbers:5 9 47 82 0 6 7↙ 5,9,47,7 82,0,6

程序运行结果示例2:

Input n:8↙

Input numbers:-2 3 5 0 23 62 79 83↙ 3,5,23,79,83 -2,0,62

输入提示信息:\ \

输入格式: \

每行第一个数据的输出格式:\每行第二个及以后数据的输出格式:\#include #include int main() {

int n, i, j, k, o, e; printf(\scanf(\printf(\

char s[n], odd[n], even[n]; for (i = 0, j = 0, k = 0; i < n; i++) {

scanf(\

if (s[i] % 2 == 0) //even {

even[k++] = s[i]; e = k; } else {

odd[j++] = s[i]; o = j; } }

even[e] = '\\0'; odd[o] = '\\0'; for (i = 0; i < o; i++) {

if (i == 0) { printf(\ } else { printf(\ } }

printf(\ for (i = 0; i < e; i++) {

if (i == 0) {

printf(\ } else { printf(\ } } return 0; }\

10.3 \/*从键盘输入一个句子(假设字符数小于100个),句子中的单词之间用空格分隔,句子必须以一个标点符号作为结尾,句子开头和末尾标点符号前均没有空格,以回车表示输入结束,请编程颠倒句中的单词顺序并输出。 函数原型:int Inverse(char str1[], char str2[][N])

函数功能:将str1中的单词颠倒顺序后分别存入str2的每一行,返回str1中的单词数。 程序运行结果示例1:

Input a sentence:you can cage a swallow can't you?↙ you can't swallow a cage can you?

程序运行结果示例2:

Input a string:you are my sunshine!↙ sunshine my are you!

程序运行结果示例3: Input a sentence:I love you!↙ you love I!

输入提示信息:\输入格式: 用gets()函数 输出格式:

每个单词的输出格式:\ (注意: %s后面有一个空格) 最后一个单词和标点符号的输出格式:\#include #include //逆转字符串

char* Reverse(char *str, int len) {

if (str == NULL || len <= 0) {

return str; }

char *pLast = str + len - 1; char *pBegin = str; while (pBegin < pLast) {

char temp = *pBegin; *pBegin = *pLast; *pLast = temp; ++ pBegin; -- pLast; } return str; }

//逆转句子

char * ReverseSentence(char *str) {

if (str == NULL) {

return str; }

//逆转整个句子 Reverse(str, strlen(str)); //逆转各个单词 char *pBegin = str; char *pEnd = str; while (*pEnd != '\\0')

本文来源:https://www.bwwdw.com/article/jcdg.html

Top