《实验 数组——参考答案.docx》由会员分享,可在线阅读,更多相关《实验 数组——参考答案.docx(14页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、实验 6 数组一、一维数组实验0 1 2 3 4 5 6 7 8 9#includevoid main()int i, j, a10, t; printf(Input 10 number: ); for(i=0; i10; i+)scanf(%d, &ai);printf(origin data: ); for(i=0; i10; i+)printf(%d , ai);printf(n); for(i=0,j=9;ij ; i+,j-)t=ai; ai=aj; aj= t;printf(After reversed: ); for(i=0; i10; i+)printf(%d , ai); p
2、rintf(n);/*读入数据*/*输出原始数据*/*逆序存放*/*输出逆序存放后得数据*/2、 编程:输入长度为 10 得整型数组并输出;然后将其逆序存放后再输出。例如:3、 编程:输入 n 个(1n=10)正整数并保存到数组中,求出最大值、最小值、平均值,以及最大值、最小值在数组中得下标分别就是多少。例如:5#include void main()int i, n , max, min, a10, sum; float average;printf(Input n (1n=10): ); scanf(%d, &n);if(1n & n=10)printf(Input %d integer:
3、, n);for(i=0, sum=0; in; i+)scanf(%d, &ai); sum+=ai;average=(float)sum/n;for(i=0, max=0, min=0; i amax) max= i;if(ai amin) min= i;/*输入数据并求累加与*/*求出平均值*/*求最大、最小值得下标*/printf(max=%-5d index=%dn, amax, max); printf(min=%-5d index=%dn, amin, min);printf(average=%、2fn, average);elseprintf(数据超出范围);#include
4、void main()inti, max, min;float a10, ave;printf(请输入 10 个评委得打分:); for(i=0, ave=0; i10; i+)scanf(%f, &ai); ave+=ai;for(i=0, max=0 , min=0; iamax) max=i;if(aiamin) min=i;ave=ave-amax-amin; ave=ave/8;printf(该选手得评委打分就是:); for(i=0; i10; i+)/*输入分数并求累加与*/*求最大、最小值得下标*/4、 编程:青年歌手参加歌曲大奖赛,有 10 个评委对她(她)进行打分,试编程求
5、这位选手得平均得分并输出(去掉一个最高分与一个最低分)。printf(%、2f, ai); printf(n);printf(去掉最高分%、2f,去掉最低分%、2f,该选手得平均得分就是%、2fn, amax, amin,ave);5、 编程:用两种方法输出斐波那切数列得前 40 项(参考例 6-4)。要求: (1)方法 1:不使用数组;#include void main()int f1=1, f2=1, f3, i; printf(%12d%12d, f1, f2); for(i=3; i=40; i+)f3=f1+f2; printf(%12d, f3); if(i%5=0)printf
6、(n); f1= f2;f2= f3;#include void main()int i;int fib40; fib0=fib1=1; for(i=2; i40; i+)fibi= fibi-1 + fibi-2;for(i=0; i40; i+)printf(%12d,fibi); if(i+1)%5=0)printf(n);/*计算其余得 38 个数*/(2)方法 2:使用一维数组。6、 编程:输入n 个(1n=10)float 型得数据并保存到数组中,用冒泡法或选择法将它们从大到小排序后输出。例如:552351144950510490230140#include void main()
7、int i, j, n;float a10, t; printf(Input n: );scanf(%d,&n); if(n1 & n=10)printf(Input %d number:, n); for(i=0;in;i+)scanf(%f,&ai); printf(Before sorted:); for(i=0; in; i+)printf(%、2f , ai); printf(n);for(i=0; in-1; i+) for(j=0; jn-i-1; j+)if( aj aj+1 )t=aj; aj=aj+1; aj+1=t;/*输出排序前得数据*/*冒泡排序*/printf(Af
8、ter sorted:); for(i=0; in; i+)printf(%、2f , ai); printf(n);/*输出排序结果*/elseprintf(数据超出范围);7、 在上题基础上(输入 n 个 float 型得数据并保存到数组中,用冒泡法或选择法将它们从大到小排序后输出)程序分析:首先判断此数就是否大于最后一个数,然后再考虑插入中间得数得情况,插入后此元素之后得数, 依次后移一个位置。#include void main()int i, j, n, p;float a10, t, m;printf(Input n: );scanf(%d, &n); if(n1 & n=10)p
9、rintf(Input %d number:, n); for(i=0; in; i+)scanf(%f, &ai);完成:在已经排好序得数组(长度不足 10)中插入一个数 m(键盘输入)后输出,保持数组得降序排列。printf(Before sorted: );/*输出排序前得数据*/ for(i=0; in; i+)printf(%、2f , ai); printf(n);for(i=0; in-1; i+)/*冒泡排序*/ for(j=0; jn-i-1; j+)if( aj aj+1 )t=aj; aj=aj+1; aj+1=t;elseprintf(After sorted:);/*
10、输出排序结果*/ for(i=0; in; i+)printf(%、2f , ai);printf(n);printf( 请输入要插入得数据 m: ); scanf(%f, &m);/*找到插入位置*/if(m an-1)/*如果 m 比最后一个元素小,则直接插入到最后得位置*/ p = n;for(i=0; i ai)p=i;break;for(i=n; i=p+1; i-)/*将插入位置之后得元素后移*/ ai=ai-1;/*插入*/ ap=m;printf(插入%、2f 后:, m);/*输出插入后结果*/ for(i=0; in+1; i+)printf(%、2f , ai); pri
11、ntf(n);elseprintf(数据超出范围);二、二维数组实验1、 以下程序功能为:将下列矩阵中得元素向右移动一列,最后一列移至第一列。找出并改正以下源程序中错误,通过调试得出正确得运行结果。14681012源程序(有错误得程序) #include #define ROW 2#define COL 3 int main()int aROWCOL=1,4,6,8,10,12;int i,j,temp; for(i=0;i=0;j-)aij=aij+1;/*调试时设置断点*/改为 aij+1=aij;ai0=temp;/*调试时设置断点*/for(int i=0;iROW;i+)/去掉 in
12、tfor(j=0;jCOL;j+) printf(%6d,aij);printf(n);return 0;运行结果(改正后程序得运行结果)614128102、 编程:利用二维数组计算并打印一个 n 行得杨辉三角。例如:11112113311464114101051提示:第一列及对角线上得元素都就是 1,其她元素通过计算得出:如果用 i 表示行,j 表示列,则第 i 行 j 列得元素#include void main()int a1010=0;int i, j, n;/设最多 10 层printf(请输入杨辉三角形得层数:);scanf(%d, &n); if(n10)printf(层数超出范
13、围); return;for(i=0;in;i+)ai0=1;aii=1;for(i=2;in;i+)for(j=1;ji;j+)/给第 0 列与主对角线上得元素赋值 1/计算其她位置元素得值aij=ai-1j-1+ai-1j;for(i=0;in;i+)/输出for(j=0;j=i;j+) printf(%4d,aij);printf(n);12345678910110#include void main()int a34,i,j;printf(请输入3 X 4整数矩阵:n); for(i=0; i3; i+)for(j=0; j4; j+) scanf(%d, &aij);printf(按
14、行输出:); for(i=0; i3; i+)for(j=0; j4; j+) printf(%d,aij);printf(n);printf(按列输出:); for(i=0; i4; i+)for(j=0; j3; j+) printf(%d ,aji);printf(n);3、 编程:通过键盘输入 3 行 4 列得二维数组,分别按行与按列输出数组。例如:245564、 编程:输入一个 m*n 矩阵,求她们得各行元素之与。例如:提示:设计一个一维数组 int s10,分别保存各行元素之与。#include void main()int a1010, s10=0;int m, n, i, j;
15、/设定矩阵最大为 10 x 10printf(请输入矩阵得行数与列数:); scanf(%d%d, &m, &n);if(m10 | n10)printf(行或列(110)值超出范围); return;printf(请输入%d*%d矩阵:n,m,n); for(i=0; im; i+)for(j=0; jn; j+) scanf(%d,&aij);/求各行之与并输出for(i=0; im; i+)for(j=0; jn; j+) si+=aij;printf(sun%d= %d n, i, si);5、 编程:判断一个二维数组就是否存在鞍点,若存在,则输出鞍点及其行号与列号;否则输出没有鞍点信
16、息。“鞍点”就是指这样得元素:它在本行就是最大元素,而在本列就是最小得元素。提示:找鞍点需要处理三件事情:(1)找每行中最大值所在得列下标;(2)判断该元素在本列上就是否为最小;(3) 判断就是否找到了鞍点,若找到,输出。#include void main()int a1010;/设定矩阵最大为 10 x 10int m, n, i, j, col, flag=0;printf(请输入矩阵得行数与列数:); scanf(%d%d, &m, &n);if(m10 | n10)printf(行或列(110)值超出范围); return;printf(请输入%d*%d矩阵:n,m,n); for(
17、i=0; im; i+)for(j=0; jn; j+) scanf(%d,&aij);for(i=0; im; i+)col=0;for(j=1; jn; j+) if(aicolaij)col=j; for(j=0; jajcol)break; if(j=m)/退出程序/找出第 i 行中得最大值所在列下标 col/判断该元素在本列上就是否为最小flag=1;/有鞍点printf(i=%d, j=%d, saddle point:%dn,i,col,aicol);if(flag=0)printf(No saddle point!n);三、字符串实验1、 以下程序功能为:输入一个字符串,将其逆
18、序输出。找出并改正以下源程序中错误,通过调试得出正确得运行结果。源代码(有错误得程序) #include #include void main()int i,j;char s80,result80; printf(Enter a string:n); gets(s);for(i=strlen(s)-1,j=0;i=0;i-,j+)resultj=si;resultj=0;/必须给字符串加上串结束标志printf(This is reverse string:n);puts(result);运行结果(改正后得程序)2、 编程:任意输一个字符串保存在一维字符数组中,求其长度(不用 strlen 函
19、数)。例如:#include void main()int i, len=0; char s80;printf(请输入字符串,以回车键结束:); gets(s);for(i=0; si!=0; i+) len+;printf(字符串%s 得长度为:%dn,s, len);提示:字符串得有效长度就就是有效字符得个数,即数组中第一个0前面得字符个数。3、 编程:任意输入两个字符串分别保存在一维字符数组中,把第二个字符串连接到第一个字符串末尾(不用#include void main()int i,j;char s180, s280;printf(请输入字符串 1 以回车键结束:n); gets(s
20、1);printf(请输入字符串 2 以回车键结束:n); gets(s2);for(i=0; s1i!=0; i+) ; for(j=0; s2j & i80; i+, j+ )s1i=s2j;s1i=0;/* 定位第一个字符串得结束标志*/*将 s2 接到 s1 后*/strcat 函数)。例如:printf(两个串连接后:%sn,s1);#include void main()int i;char a80, b80;printf(请输入字符串 1 以回车键结束:n); gets(a);printf(请输入字符串 2 以回车键结束:n); gets(b);/逐个比较直到两个字符不同或其中一
21、个字符串结束for(i=0; ai & bi ; i+)if(ai!=bi) break;if (aibi)printf(第一个字符串%s 大!n, a); else if (ai=bi)printf(两字符串相同!n); elseprintf(第二个字符串%s 大!n, b);4、 编程:从键盘读入两个字符串分别保存在一维字符数中,比较两个字符串大小(不用 strcmp 函数),输出较大得字符串。5、 编程:任意输入一个字符串保存在一维字符数组中,判断里面数字字符得个数。例如:#include #include void main()int i, n=0; char s80;printf(请
22、输入一个字符串以回车键结束:n); gets(s);for(i=0 ; si; i+) if(si=0 & si=9)n+;printf(字符串中包含得数字个数为:%dn,n);6、 编程:从一个字符串中删除从某个特定字符开始得所有字符。例如原字符串为abcdefg,特定字符为d, 删除后得字符串为abc。void main()int i, flag=0; char c, s80;printf(请输入一个字符串以回车键结束:n); gets(s);printf(请输入特定字符:); c=getchar();for(i=0 ; si; i+) if(si=c)si=0; flag=1; brea
23、k;if(flag=0)printf(输入字符中没有特定字符!n); elseputs(s);#include #include void main()unsigned int i, j, m, n; char s180, s280;printf(请输入一个字符串以回车键结束:n); gets(s1);printf(请输入子串得起始位置与长度:); scanf(%d%d, &n, &m);if( n0 & n0 & n+m = strlen(s1)+1 )for(i=n-1,j=0; s1i & i n+m-1 ; i+, j+)s2j=s1i;s2j=0;puts(s2);elseprint
24、f(长度超出范围!n);elseprintf(起始位置超出范围!n);7、 编程:编写程序,从一个输入得字符串中抽取一部分(从第 n 个字符开始,抽取 m 个字符)构成一个新得字符串,并输出。要求:n 与 m 都由用户输入。8、 编程:利用字符串库函数 puts, gets, strcat, strcmp, strcpy, strlen 完成下述操作:l 读入三个字符串 str1,str2,str3l 输出这三个字符串l 分别求出这三个字符串得长度;l 比较 str1 与 str2 得大小;l 将 str2 连接到 str1 之后,并输出连接后得 str1;l 复制 str3 到 str1,并
25、输出复制操作后得 str1;#include #include void main()选作题:char str180, str280, str380;printf(请输入字符串 str1 以回车键结束:n);gets(str1);printf(请输入字符串 str2 以回车键结束:n); gets(str2);printf(请输入字符串 str3 以回车键结束:n);gets(str3);printf(三个字符串分别就是:n); printf(str1:%sn, str1); printf(str2:%sn, str2);printf(str3:%sn, str3);printf(三个字符串得
26、长度分别就是:n); printf(str1:%dn, strlen(str1); printf(str2:%dn, strlen(str2);printf(str3:%dn, strlen(str3);if(strcmp(str1, str2)0)printf(字符串 str1 大于 str2n); else if(strcmp(str1, str2)=0)printf(字符串 str1 等于 str2n);elseprintf(字符串 str1 小于 str2n); strcat(str1,str2);printf( str2 连接到 str1 之后:%sn,str1);strcpy(st
27、r1,str3);printf(复制 str3 到 str1:%sn,str1);输入一个小写字母组成得英文句子,统计该句子有几个英文单词,并统计每个字母出现得次数,并将句子中每个单词得首字母大写后输出。如:输入: this is a cat! 输出:4 个单词;每个字母出现次数 t:2h:1i:2s:2a:2c:1 This Is A Cat!#include void main()char s80;int count26=0;/与 26 个字母对应,统计各个字母出现得次数int i, j, wordnum=0, flag=0;printf(请输入一个英文句子(小写字母)以回车键结束:); gets(s);for(i=0; si; i+)if(si=a & si=a & si+1=z) flag=1;/当前就是空格,但下一个字符就是字母,则该字母一定就是单词得起始字母 flag=1。/即判断一个单词得起始字符,单词间用空格区分,这里考虑了单词间多个空格得情况printf(句子中有%d 个单词;n,wordnum); printf(每个字母出现得次数:);for(i=0; i26; i+)if(counti!=0)printf(%c: %d , i+a, counti);printf(n);printf(每个单词首字母大写后:); puts(s);
限制150内