浙江大学C程序设计 练习答案(1).doc_第1页
浙江大学C程序设计 练习答案(1).doc_第2页
浙江大学C程序设计 练习答案(1).doc_第3页
浙江大学C程序设计 练习答案(1).doc_第4页
浙江大学C程序设计 练习答案(1).doc_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

夏学期C程序设计上机练习参考答案 夏1周270011 简化的插入排序270012 求平均值570013 将数组中的数逆序存放670014 求最大值及其下标770015 交换最小值和最大值870016 选择法排序970017 在数组中查找指定的元素1070021 求矩阵各行元素之和1170022 矩阵运算1270023 九九乘法表13夏2周1470024 判断上三角矩阵1470025 算算看,这是第几天?1570026 找鞍点(选作)1670031 将字符串逆序存放1770032 查找字符1870033 统计大写辅音字母1970034 字符串替换2070035 将十六进制字符串转换为十进制整数2170036 将十进制字符串转换为十进制整数2270052 统计字符出现次数23夏3周2410008 求1100中能被6整除的所有整数的和2420014 计算三门课程的平均成绩2520016 计算x的平方2520021 计算分段函数的值2520022 计算摄氏温度2670051 找最大值并交换2780011 循环移动2880012 在数组中查找指定元素2980013 使用函数的选择法排序3080014 报数32夏4周3510012 函数程序设计3510024 计算最长的字符串长度3610025 字符串的连接3740017 求2/13/25/38/5.3880021 找最大的字符串3980022 找最长字符串4080023 使用函数删除字符串中的字符4180024 使用函数实现字符串复制4280025 判断回文字符串4380026 分类统计字符个数44夏5周4510014 计算函数P(n,x)4510016 十进制转换二进制4610017 递归函数程序设计求Fabonacci数列4810019 改错题error10_1.cpp4910022 编程题5010026 指定位置输出字符串5010027 藏尾诗5110028 改错题error11_2.cpp5240065 分解质因数5340067 打印图案54夏6周5630062 输出21世纪所有闰年5690001 调试示例error09_1.cpp5690002 时间换算5790003 计算平均成绩5890004 计算两个复数之积5990005 查找书籍6090006 通讯录排序6190007 算算看,这是第几天?6290008 使用函数实现时间换算6390009 找出总分最高的学生64其它练习6520027计算旅途时间。6520028数字加密66教材习题34 (上机练习30009,统计学生成绩)6630061 出租车计费67教材习题4-12(p77)68教材习题4-14(p77)6950051 数字金字塔(此题与40067打印图案的思路相似)69夏1周70011 简化的插入排序输入一个正整数 repeat (0repeat10),做 repeat 次下列运算:输入一个正整数 n(0n=9)和一组(n个)有序的整数,再输入一个整数 x,把 x 插入到这组数据中,使该组数据仍然有序。输入输出示例:括号内为说明输入:4 (repeat=4) 5 (数据的个数n=5)1 2 4 5 7 (5个有序整数)3 (待插入整数x=3)4 (数据的个数n=4)1 2 5 7 (4个有序整数)-10 (待插入整数x=-10)3 (数据的个数n=3)1 2 4 (3个有序整数)100 (待插入整数x=100)5 (数据的个数n=5)1 2 4 5 7 (5个有序整数)4 (待插入整数x=4)输出:1 2 3 4 5 7 -10 1 2 5 7 1 2 4 100 1 2 4 4 5 7参考解1:#include int main(void) int i, n, x; int repeat, ri; int a10; scanf(%d, &repeat); for(ri = 1; ri = repeat; ri+) scanf(%d, &n); for(i = 0; i = 0; i-) if (x ai) ai+1=ai; ai = x; /* 保证最前面的元素插入正确 */ else ai+1 = x; /* 保证最后面的元素插入正确 */ break; for(i = 0; i n + 1; i+) printf(%d , ai); putchar(n); 参考解2:#include int main(void) int i, j, n, x; int repeat, ri; int a10; scanf(%d, &repeat); for(ri = 1; ri = repeat; ri+) scanf(%d, &n); for(i = 0; i n; i+) scanf(%d, &ai); scanf(%d, &x); an=x; /* 将被比较的数放到最后,然后往前对比插入 */ for(i=0;ian) j=ai; ai=an; an=j; for(i = 0; i n + 1; i+) printf(%d , ai); putchar(n); 参考解3:#include int main(void) int i, j, n, x; int repeat, ri; int a10; scanf(%d, &repeat); for(ri = 1; ri = repeat; ri+) scanf(%d, &n); for(i = 0; i = an-1) an = x; /* 特殊情况:若x比所有的元素都要大 */ else for(i = 0; i ai) continue; /* 将x 插入到合适的位置*/ j = n - 1; /* 从当前要插入的位置往后移位 */ while(j = i) aj+1 = aj; j-; ai = x; /* 将x查到当前的位置 */ break; for(i = 0; i n + 1; i+) printf(%d , ai); putchar(n); 70012 求平均值输入一个正整数 repeat (0repeat10),做 repeat 次下列运算:输入一个正整数 n (1n=10),再输入 n 个整数,输出平均值(保留2位小数)。输入输出示例:括号内为说明输入2 (repeat=2) 3 (n=3) 1 2 -6 5 (n=5) 12 2 5 4 0 输出average = -1.00average = 4.60#include int main(void) int i, n, sum; int repeat, ri; int a10; double average; scanf(%d, &repeat); for(ri = 1; ri = repeat; ri+) scanf(%d, &n); for(i = 0; i n; i+) scanf(%d, &ai);sum=0;for(i=0; i n; i+)sum+=ai;average=1.0*sum/n*1.0; printf(average = %.2fn, average); 70013 将数组中的数逆序存放 输入一个正整数 repeat (0repeat10),做 repeat 次下列运算:输入一个正整数 n (1n=10),再输入 n 个整数,存入数组a中,先将数组a中的这n个数逆序存放,再按顺序输出数组中的n个元素。输入输出示例:括号内为说明输入2 (repeat=2) 4 (n=4) 10 8 1 25 (n=5) 1 2 5 4 0 输出2 1 8 100 4 5 2 1#include int main(void) int i, n, temp; int repeat, ri; int a10; scanf(%d, &repeat); for(ri = 1; ri = repeat; ri+) scanf(%d, &n); for(i = 0; i n; i+) scanf(%d, &ai);i=0;for(i=0;in/2;i+)temp=ai;ai=an-1-i;an-1-i=temp; for(i = 0; i n; i+) printf(%d , ai); printf(n); /* 另可参p161 */70014 求最大值及其下标 输入一个正整数 repeat (0repeat10),做 repeat 次下列运算:输入一个正整数 n (1n=10),再输入n个整数,输出最大值及其对应的最小下标,下标从0开始。输入输出示例:括号内为说明输入3 (repeat=3) 3 (n=3)1 6 44 (n=4)10 8 1 95 (n=5)1 2 0 4 5输出max = 6, index = 1 (最大值6的下标是1)max = 10, index = 0 (最大值10的下标是0)max = 5, index = 4 (最大值5的下标是4)#include int main(void) int i, index, n; int ri, repeat; int a10; scanf(%d, &repeat); for(ri = 1; ri = repeat; ri+) scanf(%d, &n); for(i = 0; i n; i+) scanf(%d, &ai);index=0;aindex=a0;for(i = 1; i n; i+)if(aindexai)aindex=ai;index=i; printf(max = %d, index = %dn, aindex, index); 70015 交换最小值和最大值输入一个正整数 repeat (0repeat10),做 repeat 次下列运算:输入一个正整数 n (1n=10),再输入 n 个整数,将最小值与第一个数交换,最大值与最后一个数交换,然后输出交换后的 n 个数。输入输出示例:括号内为说明输入3 (repeat=3) 5 (n=5) 8 2 5 1 44 (n=4) 1 5 6 75 (n=5) 5 4 3 2 1 输出After swap: 1 2 5 4 8After swap: 1 5 6 7After swap: 1 4 3 2 5#include int main(void) int i, index, n, t; int repeat, ri; int a10; scanf(%d, &repeat); for(ri = 1; ri = repeat; ri+) scanf(%d, &n); for(i = 0; i n; i+) scanf(%d, &ai);index=0;for(i = 1; i n; i+)if(aiaindex)index=i;t=aindex; /* 最小值与第1个数交换 */aindex=a0;a0=t;index=0;for(i = 1; i aindex)index=i;t=aindex; /* 最大值与最后一个数交换 */aindex=an-1;an-1=t; printf(After swap: ); for(i = 0; i n; i+) printf(%d , ai); printf(n); 70016 选择法排序输入一个正整数 repeat (0repeat10),做 repeat 次下列运算:输入一个正整数 n (1n=10),再输入 n 个整数,将它们从大到小排序后输出。输入输出示例:括号内为说明输入3 (repeat=3) 4 (n=4) 5 1 7 63 (n=3) 1 2 35 (n=5) 5 4 3 2 1 输出After sorted: 7 6 5 1 After sorted: 3 2 1After sorted: 5 4 3 2 1#include int main(void) int i, index, k, n, temp; int repeat, ri; int a10; scanf(%d, &repeat); for(ri = 1; ri = repeat; ri+) scanf(%d, &n); for(i = 0; i n; i+) scanf(%d, &ai);for(k=0;kn-1;k+)index=k;for(i=k+1;iaindex)index=i;temp=aindex;aindex=ak;ak=temp; printf(After sorted: ); for(i = 0; i n; i+) printf(%d , ai); printf(n); 70017 在数组中查找指定的元素输入一个正整数 repeat (0repeat10),做 repeat 次下列运算:输入一个正整数 n (1n=10),再输入 n 个整数,将它们存入数组 a 中,再输入一个整数 x,然后在数组 a 中查找与 x 相同的元素,如果找到,输出 x 在数组 a 中对应元素的最小下标,如果没有找到,输出相应信息。输入输出示例:括号内为说明输入:2(repeat=2)6(n=6)1 3 5 7 9 55(x=5)4(n=4)1 3 5 72(x=2)输出:5: a22: not found#include int main(void) int flag, i, n, x; int repeat, ri; int a10; scanf(%d, &repeat); for(ri = 1; ri = repeat; ri+) flag=0; /* 若标志不重新初始化的化,就会一影响下一轮循环的计算 */ scanf(%d, &n); for(i = 0; i n; i+) scanf(%d, &ai); scanf(%d, &x);for (i = 0; i n; i+) if(x=ai) flag = 1;break; if(flag != 0) printf( %d: a%dn, x, i); else printf( %d: not foundn, x); 70021 求矩阵各行元素之和输入2个正整数 m 和 n (1=m=6, 1=n=6),然后输入矩阵 a(m 行 n 列)中的元素,分别求出各行元素之和,并输出。输出使用语句:printf(sum of row %d is %dn, i, sum);输入输出示例:括号内为说明输入:3 2(m=3,n=2)6 31 -83 12输出:sum of row 0 is 9sum of row 1 is -7sum of row 2 is 15#include int main(void) int i, j, m, n, sum; int a66; scanf(%d%d,&m,&n); for(i = 0; i m; i+) for(j = 0; j n; j+) scanf(%d, &aij);for(i = 0; i m; i+) sum=0;for(j = 0; j n; j+)sum+=aij;printf(sum of row %d is %dn, i, sum);70022 矩阵运算程序填空,不要改变与输入输出有关的语句。输入一个正整数 repeat (0repeat10),做 repeat 次下列运算:读入 1 个正整数 n(1n6), 再读入 n 阶方阵 a , 计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。输入输出示例:括号内为说明输入:1 (repeat=1)4 (n=4)2 3 4 15 6 1 17 1 8 11 1 1 1sum = 35 (2+3+4+5+6+7+8=35)#include stdio.hint main(void) int i, j, n, sum; int repeat, ri; int a66; scanf(%d, &repeat); for(ri = 1; ri = repeat; ri+) scanf(%d, &n); for(i = 0; i n; i+) for(j = 0; j n; j+) scanf(%d, &aij);sum=0;for(i = 0; i n; i+)for(j = 0; j n; j+)sum+=aij;for(i = 1; i n-1; i+) sum-=ain-i-1; /* 减去副对角线的元素 */for(j =0; j n; j+) sum-=an-1j; /* 减去最下一行 */for(i =0; i n; i+)sum-=ain-1; /* 减去最右一列 */sum=sum+an-1n-1; /* 右下角元素减了两次,补回一次 */ printf(sum = %dn, sum); 70023 九九乘法表 程序填空,不要改变与输入输出有关的语句。输入一个正整数 repeat (0repeat10),做 repeat 次下列运算:输入一个正整数 n(0n10),输出九九乘法表的前nn项。提示:将乘数、被乘数和乘积放入一个二维数组中,再输出该数组。输入输出示例:括号内为说明输入:1 (repeat=1)3 (n=3)输出:* 1 2 31 12 2 43 3 6 9/* 根据输出要求 将乘数存于a0j 被乘数存于ai0; 结果放在aij, i,j不为0*/#include stdio.hint main(void) int i, j, n; int a1010; int repeat, ri; scanf(%d,&repeat); for(ri = 1; ri = repeat; ri+) scanf(%d, &n);for(j = 0; j = n; j+)a0j=j; /* 乘数 */for(i = 0; i = n; i+)ai0=i; /* 被乘数 */for(i = 1; i = n; i+) for(j = 1; j = n; j+)aij=i*j; /* 结果 */ for(i = 0; i = n; i+) for(j = 0; j = n; j+) if(i = 0 & j = 0) printf(%-4c, *); else if(i = 0 | j = i) printf(%-4d, aij); printf(n); 夏2周70024 判断上三角矩阵输入一个正整数 repeat (0repeat10),做 repeat 次下列运算:输入1 个正整数 n (1n6)和 n 阶方阵 a 中的元素,如果 a 是上三角矩阵, 输出YES, 否则, 输出NO。上三角矩阵指主对角线以下的元素都为0的矩阵, 主对角线为从矩阵的左上角至右下角的连线。输入输出示例:括号内为说明输入:2 (repeat=2)3 (n=3)1 2 3 0 4 5 0 0 6 2 (n=2)1 0 -8 2 输出:YES NO#include stdio.h#include math.hint main(void) int flag, i, j, n; int a66; int repeat, ri; scanf(%d, &repeat); for(ri = 1; ri = repeat; ri+) scanf(%d, &n); for(i = 0; i n; i+) for(j = 0; j n; j+) scanf(%d, &aij);flag=1;for(i = 0; i n; i+)for(j = 0; j i; j+) if(aij!=0)flag=0; break; /* 只要一个数值不满足就可以否定 */if (!flag) break; if(flag != 0) printf(YESn); else printf(NOn); 70025 算算看,这是第几天?输入一个正整数 repeat (0repeat10),做 repeat 次下列运算:输入日期(年、月、日),输出它是该年的第几天。要求定义与调用函数 day_of_year(year, month, day),计算并返回year(年)、month(月)和day(日)对应的是该年的第几天,函数形参year、month和day的类型是int,函数类型也是int。输入输出示例:括号内为说明输入:2 (repeat=2)1981 3 1 (1981年3月1日)2000 3 1 (2000年3月1日)输出:days of year: 60 (1981年3月1日是该年的第60天)days of year: 61 (2000年3月1日是该年的第61天)#include stdio.hint main(void) int day, day_year, month, year; int repeat, ri; int day_of_year(int year, int month, int day); scanf(%d, &repeat); for(ri = 1; ri = repeat; ri+) scanf(%d%d%d, &year, &month, &day);day_year=day_of_year(year,month,day); printf(days of year: %dn, day_year); int day_of_year(int year, int month, int day)int k,leap;int a231=0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31 ;leap=(year%4=0&year%100!=0|year%400=0);for(k=1;kmonth;k+)day=day+aleapk;return day;70026 找鞍点(选作) 输入一个正整数 repeat (0repeat10),做 repeat 次下列运算:输入 1 个正整数 n(1n6)和 n 阶方阵 a 中的元素,假设方阵 a 最多有1个鞍点,如果找到 a 的鞍点, 就输出其下标, 否则,输出NO。鞍点的元素值在该行上最大, 在该列上最小。输入输出示例:括号内为说明输入:2 (repeat=2)4 (n=4)1 7 4 14 8 3 61 6 1 20 7 8 92 (n=2)1 74 1输出:a21 = 6NO#include stdio.hint main(void) int flag, i, j, k, row, col, n; int a66; int repeat, ri; scanf(%d, &repeat); for(ri = 1; ri = repeat; ri+) scanf(%d, &n); for(i = 0; i n; i+) for(j = 0; j n; j+) scanf(%d, &aij); for(row=0;rown;row+) col=0; for(j=1;jarowcol) col=j; flag=1; for(i=0;iaicol) flag=0; break; /* 只要当前行的最大值不是当前列的最小,放弃*/ if(flag) break; /* 找到就可以跳出循环了 */ if(flag != 0) printf(a%d%d = %dn, row, col,arowcol); else printf(NOn); 70031 将字符串逆序存放输入一个以回车结束的字符串(少于80个字符),将它的内容逆序输出。如ABCD 的逆序为DCBA。输入输出示例:括号内为说明输入:Welcome to you!输出:!uoy ot emocleW思路:若输入: 0 1 2 3 4 5 要输出 5 4 3 2 1 0即第k个字符的位置变换成:n-k-1。由于两个位置上的值是互换的,所以只要对其中的一半数据操作就可以了。#include int main(void) int i, j, temp; char str80; i = 0; while(stri = getchar( ) != n) i+; stri = 0; /* 使用0 的必要性*/ for (j=0;ji/2;j+) temp=stri-j-1; stri-j-1=strj; strj=temp; for(i = 0; stri != 0; i+) putchar(stri); 另解思路:教材p16170032 查找字符输入一个正整数repeat (0repeat10),做repeat次下列运算:输入一个字符,再输入一个以回车结束的字符串(少于80个字符),在字符串中查找该字符,如果找到,输出该字符在字符串中所对应的最大下标 (下标从0开始);否则输出Not Found。输入输出示例:括号内为说明输入:2(repeat=2)m (字符m)programming(字符串programming)a(字符a)1234(字符串1234)输出:index = 7 (m在programming中对应的最大下标是7)Not Found (1234中没有a)#include stdio.h#define MAXLEN 80int main(void) char cc, ch; char strMAXLEN; int count, flag, i, index; int repeat, ri; scanf(%d, &repeat); getchar(); for(ri = 1; ri = repeat; ri+) cc = getchar(); getchar(); /* 用于抵消输入查询字符后的回车 */ i = 0; while(ch = getchar() != n) stri+ = ch; stri = 0;flag=0;for(i=0;stri != 0;i+)if(stri=cc)flag+;index=i; if(flag) printf(index = %dn, index); else printf(Not Foundn); 70033 统计大写辅音字母输入一个正整数 repeat (0repeat10),做 repeat 次下列运算:输入一个以回车结束的字符串(少于80个字符),统计并输出其中大写辅音字母的个数。大写辅音字母:除A, E, I, O, U以外的大写字母。输入输出示例:括号内为说明输入:2(repeat=2)HELLO group输出:count = 3 (HELLO中有3个大写辅音字母)count = 0 (group中没有大写辅音字母)#include stdio.h #define MAXLEN 80 int main(void) char ch; char strMAXLEN; int count, i; int repeat, ri; scanf(%d, &repeat); getchar(); for(ri = 1; ri = repeat; ri+) i = 0; while(ch = getchar() != n) stri+=ch; stri = 0; i=0; count=0; while(stri) if(stri=A) switch(stri) case A: case E: case I: case O: case U: break; default: count+;break; i+; printf(count = %dn, count); 70034 字符串替换输入一个正整数 repeat (0repeat10),做 repeat 次下列运算:输入一个以回车结束的字符串(少于80个字符),将其中的大写字母用下面列出的对应大写字母替换,其余字符不变,输出替换后的字符串。原字母 对应字母 A Z B Y C X D W X C Y B Z A输

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论