实验7 数组(2)-参考答案
上机实验八二维数组与字符数组—参考答案一.目的要求1.掌握二维数组的基本概念,如何定义二维数组,如何初始化二维数组。2.掌握二维数组的基本操作:引用数组元素、行(列)求和,行(列)最大最小值,整个数组的输入输出等。3.掌握与二维数组有关的算法,如找最大最小值(或位置)、矩阵转置等。4.掌握字符串与字符数组的基本应用方法5.掌握字符串有关的算法,如字符转换、查询、统计和进制转换等二.实验内容【实验题1】程序填空:输入一个4×4矩阵,求出主对角线上的元素之和sum1、副对角线上的元素之和sum2,并输出结果。提示:每一行只有一个主对角线元素a[i][i](特征:i==j),也仅有一个副对角线元素a[i][n-i-1](特征:i+j==n-1,即j=n-1-i)源程序:#include
voidmain(){inti,j,sum1=0,sum2=0,a[4][4];printf("Inputa4*4matrix:n");for(i=0;i<4;i++)//输入矩阵元素for(j=0;j<4;j++)scanf("%d",&a[i][j]);for(i=0;i<4;i++){//计算sum1和sum2sum1+=a[i][i];sum2+=a[i][3-i];}printf("sum1=%d,sum2=%dn",sum1,sum2);//输出结果}运行程序,并输入数据:12345678910111213141516运行结果:sum1=,sum2=【实验题2】程序填空:打印杨辉三角形前10行:11112113311464115101051……………………算法提示:分析一个10行的杨辉三角,需要一个10×10的二维矩阵a,则:1)杨辉三角为下三角矩阵,只需要求出第i行(i=0,1,2,…,9)前i+1个元素,即a[i][j]!=0(j=0…i).2)每行的第0列元素均为1,即a[i][0]=1;3)每行的主对角线元素也均为1,即a[i][i]=1;4)从第2行开始,每行夹在第0列元素与主对角线元素之间的元素a[i][j](i=2,3,…,9,j=1,..,i-1)等于其左上方元素a[i-1][j-1]与正上方元素a[i-1][j]之和,即a[i][j]=a[i-1][j-1]+a[i-1][j];5)输出该矩阵的下三角,即得出杨辉三角的前10行。n源程序:#includevoidmain(){inti,j,inta[10][10];for(i=0;i<10;i++)//各行的第0列元素与主对角线元素赋1a[i][0]=a[i][i]=1;for(i=2;i<10;i++)//为第2~9行的夹在第0列与主对角线之间的元素赋值for(j=1;jvoidmain(){inti;chars[80];i=0;while((s[i]=getchar())!=’n’)i++;//输入字符串s[i]=‘ ’;for(i=0;s[i]!=’ ’;i++)//将遍历字符串,将小写字母转换成大写字母if(s[i]>='a'&&a[i]<='z')s[i]=s[i]-32;for(i=0;s[i]!=' ';i++)putchar(s[i]);//输出字符串printf("n");}运行程序,输入:Tom&Jack-s10输出结果:【实验题4】.程序填空:二-十进制转换:输入一个8位二进制字符串b(由字符’1’和’0’组成),输出对应的十进制整数。例如,输入二进制字符串10010001,输出十进制整数145算法提示:1、由于二进制字符串b的长度固定为8,因此定义字符数组charb[8]即可,每个元素对应一个二进制位;n1、循环1:输入二进制字符,输入的每一个字符先暂存在字符变量ch中,检查ch是否是’0’或’1’,是则存入数组b,并令数组下标i增1,不是则跳过该字符。2、循环2:二-十进制转换:从前往后,带权累加数组b各元素对应的数值b[i]-‘0’:d=d×2+b[i]-‘源程序:#includevoidmain(){inti,d;charch,b[8];printf("Input8-bitbinary:n");//输入二进制字符串i=0;while(i<8){//输入8位二进制字符ch=getchar();if(ch=='0'||ch=='1')s[i++]=ch;//输入'0'或'1'则存入数组b,忽略其他字符}d=0;//二-十进制转换for(i=0;i<8;i++)d=d*2+s[i]-‘0’;//二进制:逢2进1printf("digit=%dn",d);//输出十进制整数d}思考:如果改为输入一个4位长度的十六进制字符串,如”2f3a”,要输出对应的十进制整数,上面的程序需要如何修改?-源程序:#includevoidmain(){inti,d,k;charch,h[4];printf("Input4-bithexadecimal:n");//输入4位长度的十六进制字符串i=0;while(i<4){//输入4位十六进制字符ch=getchar();if(ch>='0'&&ch<=’9’||ch>='a'&&ch<=’f’||ch>=’A’&&ch>=’F’)h[i++]=ch;//十六进制中合法字符存入字符数组,忽略其他字符}d=0;//十六-十进制转换for(i=0;i<4;i++){if(h[i]>=’0’&&h[i]<=’9’)k=h[i]-‘0’;if(h[i]>=’a’&&h[i]<=’f’)k=h[i]-‘a’+10;if(h[i]>=’A’&&h[i]<=’F’)k=h[i]-‘A’+10;d=d*16+k;//逢16进1}printf("digit=%dn",d);//输出十进制整数d}n【实验题5】.程序填空:输入一个以回车结束的字符串(有效长度少于80),将该字符串中的字符重新排列,使原先第0个字符出现在最后一位,原先第1个字符出现在倒数第2位,。。。,原先最后1个字符出现在第0位,例如:字符串”abcdef”经重排后变成”fedcba”。算法分析:该问题类似于方阵转置,即把特定位置的数组元素进行交换。本题中的字符串存放在一维字符型数组s中,需要解决以下问题:1)计算字符串s的有效长度len2)将字符串s的前半部分(0~len/2-1)与字符串的后半部分对调,即交换对称元素,与s[i]对称的元素是s[len-1-i],如下图所示:012345abcdef …len=6源程序:#includevoidmain(){inti,len=0;chars[80],temp;printf("Inputastring(<80):n");gets(s);//调用字符串输入函数gets(),输入字符串到sfor(i=0;s[i]!=' ';i++)//统计字符串有效长度lenlen++;for(i=0;ivoidmain(){ints[5][4],i,sum,max=-1;//输入5个学生的4门课程成绩printf(“input4scoresfor5students:n”);for(i=0;i<5;i++)for(j=0;j<4;j++)scanf(“%d”,&s[i][j]);//求最高个人总分for(i=0;i<5;i++){for(sum=0,j=0;j<4;j++)nsum+=s[i][j];if(sum>max)max=sum;}//输出最高个人总分printf(“Thetoptotalscoreis%d.n”,max);}