实验 数组——参考答案.docx
实验 6 数组一、一维数组实验0 1 2 3 4 5 6 7 8 9#include<stdio、h>void main()int i, j, a10, t; printf("Input 10 number: "); for(i=0; i<10; i+)scanf("%d", &ai);printf("origin data: "); for(i=0; i<10; i+)printf("%d ", ai);printf("n"); for(i=0,j=9;i<j ; i+,j-)t=ai; ai=aj; aj= t;printf("After reversed: "); for(i=0; i<10; i+)printf("%d ", ai); printf("n");/*读入数据*/*输出原始数据*/*逆序存放*/*输出逆序存放后得数据*/2、 编程:输入长度为 10 得整型数组并输出;然后将其逆序存放后再输出。例如:3、 编程:输入 n 个(1<n<=10)正整数并保存到数组中,求出最大值、最小值、平均值,以及最大值、最小值在数组中得下标分别就是多少。例如:5#include <stdio、h> void main()int i, n , max, min, a10, sum; float average;printf("Input n (1<n<=10): "); scanf("%d", &n);if(1<n && n<=10)printf("Input %d integer:", n);for(i=0, sum=0; i<n; i+)scanf("%d", &ai); sum+=ai;average=(float)sum/n;for(i=0, max=0, min=0; i<n; i+)if(ai > 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 <stdio、h> void main()inti, max, min;float a10, ave;printf("请输入 10 个评委得打分:"); for(i=0, ave=0; i<10; i+)scanf("%f", &ai); ave+=ai;for(i=0, max=0 , min=0; i<10; i+)if(ai>amax) max=i;if(ai<amin) min=i;ave=ave-amax-amin; ave=ave/8;printf("该选手得评委打分就是:"); for(i=0; i<10; i+)/*输入分数并求累加与*/*求最大、最小值得下标*/4、 编程:青年歌手参加歌曲大奖赛,有 10 个评委对她(她)进行打分,试编程求这位选手得平均得分并输出(去掉一个最高分与一个最低分)。printf("%、2f", ai); printf("n");printf("去掉最高分%、2f,去掉最低分%、2f,该选手得平均得分就是%、2fn", amax, amin,ave);5、 编程:用两种方法输出斐波那切数列得前 40 项(参考例 6-4)。要求: (1)方法 1:不使用数组;#include <stdio、h> 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("n"); f1= f2;f2= f3;#include <stdio、h> void main()int i;int fib40; fib0=fib1=1; for(i=2; i<40; i+)fibi= fibi-1 + fibi-2;for(i=0; i<40; i+)printf("%12d",fibi); if(i+1)%5=0)printf("n");/*计算其余得 38 个数*/(2)方法 2:使用一维数组。6、 编程:输入n 个(1<n<=10)float 型得数据并保存到数组中,用冒泡法或选择法将它们从大到小排序后输出。例如:552351144950510490230140#include <stdio、h> void main()int i, j, n;float a10, t; printf("Input n: ");scanf("%d",&n); if(n>1 && n<=10)printf("Input %d number:", n); for(i=0;i<n;i+)scanf("%f",&ai); printf("Before sorted:"); for(i=0; i<n; i+)printf("%、2f ", ai); printf("n");for(i=0; i<n-1; i+) for(j=0; j<n-i-1; j+)if( aj < aj+1 )t=aj; aj=aj+1; aj+1=t;/*输出排序前得数据*/*冒泡排序*/printf("After sorted:"); for(i=0; i<n; i+)printf("%、2f ", ai); printf("n");/*输出排序结果*/elseprintf("数据超出范围");7、 在上题基础上(输入 n 个 float 型得数据并保存到数组中,用冒泡法或选择法将它们从大到小排序后输出)程序分析:首先判断此数就是否大于最后一个数,然后再考虑插入中间得数得情况,插入后此元素之后得数, 依次后移一个位置。#include <stdio、h> void main()int i, j, n, p;float a10, t, m;printf("Input n: ");scanf("%d", &n); if(n>1 && n<=10)printf("Input %d number:", n); for(i=0; i<n; i+)scanf("%f", &ai);完成:在已经排好序得数组(长度不足 10)中插入一个数 m(键盘输入)后输出,保持数组得降序排列。printf("Before sorted: ");/*输出排序前得数据*/ for(i=0; i<n; i+)printf("%、2f ", ai); printf("n");for(i=0; i<n-1; i+)/*冒泡排序*/ for(j=0; j<n-i-1; j+)if( aj < aj+1 )t=aj; aj=aj+1; aj+1=t;elseprintf("After sorted:");/*输出排序结果*/ for(i=0; i<n; i+)printf("%、2f ", ai);printf("n");printf(" 请输入要插入得数据 m: "); scanf("%f", &m);/*找到插入位置*/if(m < an-1)/*如果 m 比最后一个元素小,则直接插入到最后得位置*/ p = n;for(i=0; i<n; i+)/*否则,插入到中间得某个位置*/ if( m > ai)p=i;break;for(i=n; i>=p+1; i-)/*将插入位置之后得元素后移*/ ai=ai-1;/*插入*/ ap=m;printf("插入%、2f 后:", m);/*输出插入后结果*/ for(i=0; i<n+1; i+)printf("%、2f ", ai); printf("n");elseprintf("数据超出范围");二、二维数组实验1、 以下程序功能为:将下列矩阵中得元素向右移动一列,最后一列移至第一列。找出并改正以下源程序中错误,通过调试得出正确得运行结果。14681012源程序(有错误得程序) #include <stdio 、 h> #define ROW 2#define COL 3 int main()int aROWCOL=1,4,6,8,10,12;int i,j,temp; for(i=0;i<ROW;i+)temp=aiCOL-1;for(j=COL-2;j>=0;j-)aij=aij+1;/*调试时设置断点*/改为 aij+1=aij;ai0=temp;/*调试时设置断点*/for(int i=0;i<ROW;i+)/去掉 intfor(j=0;j<COL;j+) printf("%6d",aij);printf("n");return 0;运行结果(改正后程序得运行结果)614128102、 编程:利用二维数组计算并打印一个 n 行得杨辉三角。例如:11112113311464114101051提示:第一列及对角线上得元素都就是 1,其她元素通过计算得出:如果用 i 表示行,j 表示列,则第 i 行 j 列得元素#include <stdio、h> void main()int a1010=0;int i, j, n;/设最多 10 层printf("请输入杨辉三角形得层数:");scanf("%d", &n); if(n>10)printf("层数超出范围"); return;for(i=0;i<n;i+)ai0=1;aii=1;for(i=2;i<n;i+)for(j=1;j<i;j+)/给第 0 列与主对角线上得元素赋值 1/计算其她位置元素得值aij=ai-1j-1+ai-1j;for(i=0;i<n;i+)/输出for(j=0;j<=i;j+) printf("%4d",aij);printf("n");12345678910110#include <stdio、h> void main()int a34,i,j;printf("请输入3 X 4整数矩阵:n"); for(i=0; i<3; i+)for(j=0; j<4; j+) scanf("%d", &aij);printf("按行输出:"); for(i=0; i<3; i+)for(j=0; j<4; j+) printf("%d",aij);printf("n");printf("按列输出:"); for(i=0; i<4; i+)for(j=0; j<3; j+) printf("%d ",aji);printf("n");3、 编程:通过键盘输入 3 行 4 列得二维数组,分别按行与按列输出数组。例如:245564、 编程:输入一个 m*n 矩阵,求她们得各行元素之与。例如:提示:设计一个一维数组 int s10,分别保存各行元素之与。#include <stdio、h> void main()int a1010, s10=0;int m, n, i, j;/设定矩阵最大为 10 x 10printf("请输入矩阵得行数与列数:"); scanf("%d%d", &m, &n);if(m<0 | m>10 | n<0 | n>10)printf("行或列(110)值超出范围"); return;printf("请输入%d*%d矩阵:n",m,n); for(i=0; i<m; i+)for(j=0; j<n; j+) scanf("%d",&aij);/求各行之与并输出for(i=0; i<m; i+)for(j=0; j<n; j+) si+=aij;printf("sun%d= %d n", i, si);5、 编程:判断一个二维数组就是否存在鞍点,若存在,则输出鞍点及其行号与列号;否则输出没有鞍点信息。“鞍点”就是指这样得元素:它在本行就是最大元素,而在本列就是最小得元素。提示:找鞍点需要处理三件事情:(1)找每行中最大值所在得列下标;(2)判断该元素在本列上就是否为最小;(3) 判断就是否找到了鞍点,若找到,输出。#include <stdio、h> void main()int a1010;/设定矩阵最大为 10 x 10int m, n, i, j, col, flag=0;printf("请输入矩阵得行数与列数:"); scanf("%d%d", &m, &n);if(m<0 | m>10 | n<0 | n>10)printf("行或列(110)值超出范围"); return;printf("请输入%d*%d矩阵:n",m,n); for(i=0; i<m; i+)for(j=0; j<n; j+) scanf("%d",&aij);for(i=0; i<m; i+)col=0;for(j=1; j<n; j+) if(aicol<aij)col=j; for(j=0; j<m; j+)if(aicol>ajcol)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、 以下程序功能为:输入一个字符串,将其逆序输出。找出并改正以下源程序中错误,通过调试得出正确得运行结果。源代码(有错误得程序) #include <stdio 、 h> #include <string 、 h> 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 函数)。例如:#include <stdio、h> 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 <stdio、h> void main()int i,j;char s180, s280;printf("请输入字符串 1 以回车键结束:n"); gets(s1);printf("请输入字符串 2 以回车键结束:n"); gets(s2);for(i=0; s1i!='0' i+) ; for(j=0; s2j && i<80; i+, j+ )s1i=s2j;s1i='0'/* 定位第一个字符串得结束标志*/*将 s2 接到 s1 后*/strcat 函数)。例如:printf("两个串连接后:%sn",s1);#include <stdio、h> void main()int i;char a80, b80;printf("请输入字符串 1 以回车键结束:n"); gets(a);printf("请输入字符串 2 以回车键结束:n"); gets(b);/逐个比较直到两个字符不同或其中一个字符串结束for(i=0; ai && bi ; i+)if(ai!=bi) break;if (ai>bi)printf("第一个字符串%s 大!n", a); else if (ai=bi)printf("两字符串相同!n"); elseprintf("第二个字符串%s 大!n", b);4、 编程:从键盘读入两个字符串分别保存在一维字符数中,比较两个字符串大小(不用 strcmp 函数),输出较大得字符串。5、 编程:任意输入一个字符串保存在一维字符数组中,判断里面数字字符得个数。例如:#include <stdio、h>#include <stdio、h> void main()int i, n=0; char s80;printf("请输入一个字符串以回车键结束: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; break;if(flag=0)printf("输入字符中没有特定字符!n"); elseputs(s);#include <stdio、h> #include <string、h> void main()unsigned int i, j, m, n; char s180, s280;printf("请输入一个字符串以回车键结束:n"); gets(s1);printf("请输入子串得起始位置与长度:"); scanf("%d%d", &n, &m);if( n>0 && n<=strlen(s1) )if (m>0 && n+m <= strlen(s1)+1 )for(i=n-1,j=0; s1i && i< n+m-1 ; i+, j+)s2j=s1i;s2j='0'puts(s2);elseprintf("长度超出范围!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,并输出复制操作后得 str1;#include <stdio、h> #include <string、h> 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("三个字符串得长度分别就是: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(str1,str3);printf("复制 str3 到 str1:%sn",str1);输入一个小写字母组成得英文句子,统计该句子有几个英文单词,并统计每个字母出现得次数,并将句子中每个单词得首字母大写后输出。如:输入: this is a cat! 输出:4 个单词;每个字母出现次数 t:2h:1i:2s:2a:2c:1 This Is A Cat!#include <stdio、h>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<='z')/逐个字母判断,使其对应得出现次数增加 1j=si-'a'/ 计算该字母在 26 个字母中得序号countj+;if(i=0 && si!=' ' | flag=1)/句首单词及每个单词第一个字母得处理wordnum+;/单词个数增加 1si=si-32;/小写换大写flag=0;else if(si=' ' &&si+1>='a' && si+1<='z') flag=1;/当前就是空格,但下一个字符就是字母,则该字母一定就是单词得起始字母 flag=1。/即判断一个单词得起始字符,单词间用空格区分,这里考虑了单词间多个空格得情况printf("句子中有%d 个单词;n",wordnum); printf("每个字母出现得次数:");for(i=0; i<26; i+)if(counti!=0)printf("%c: %d ", i+'a', counti);printf("n");printf("每个单词首字母大写后:"); puts(s);