实验 8 二维数组与字符数.docx
《实验 8 二维数组与字符数.docx》由会员分享,可在线阅读,更多相关《实验 8 二维数组与字符数.docx(14页珍藏版)》请在冰豆网上搜索。
实验8二维数组与字符数
实验8二维数组与字符数组
1.实验目的
(1)掌握二维数组的基本概念,如何定义二维数组,如何初始化二维数组;
(2)掌握二维数组的基本操作:
引用数组元素、行(列)求和,行(列)最
大最小值,整个数组的输入输出等;
(3)掌握与二维数组有关的算法,如找最大最小值(或位置)、矩阵转置等;
(4)掌握字符串与字符数组的基本应用方法;
(5)掌握字符串有关的算法,如字符转换、查询、统计和进制转换等。
2.实验环境
(1)每人微机一台(WindowsXP操作系统+OFFICE2000软件)
(2)VISUALC++6.0编程软件
3.实验内容
【实验题1】程序填空,输入一个4×4矩阵,求出主对角线上的元素之和
sum1、副对角线上的元素之和sum2,并输出结果。
【算法分析】:
每一行只有一个主对角线元素a[i][i](特征:
i==j),也仅有一个副对角线元素a[i][ni1](特征:
i+j==n1,即j=n1i)
#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+=a[i][i];
sum2+=a[i][3-i];
}
printf("sum1=%d,sum2=%d\n",sum1,sum2);
}
【实验题2】程序填空,打印杨辉三角形前10行:
1
11
121
1331
14641
15101051
……………………
【算法分析】:
分析一个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,..,i1
)等于其左上方元素a[i1][
j1]
与正上方元素
a[i1][
j]之和,即a[i][j]=a[i1][
j1]+
a[i1][
j];
5)输出该矩阵的下三角,即得出杨辉三角的前10行。
l问:
如果删除Line12,程序运行结果有何不同?
#include
voidmain()
{
inti,j;
inta[10][10];
for(i=0;i<10;i++)
a[i][0]=a[i][i]=1;
for(i=2;i<10;i++)
for(j=1;j
a[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=0;i<10;i++){
for(j=0;j<=i;j++)
printf("%5d",a[i][j]);
printf("\n");
}
}
如果删除Line12,程序运行结果有何不同?
无法成三角形
【实验题3】程序填空,输入一个以回车结束的字符串(有效长度少于80),
将其中的小写字母统一更换成对应的大写字母。
【算法分析】:
1、输入字符串,并存储在字符数组中,’\n’表示回车;
2、遍历字符串的每个元素,如果是小写字母(’a’97~’z’122),则更换成大写字母;
3、输出更新后的字符串。
运行程序,输入:
Tom&Jacks10
输出结果:
#include
voidmain()
{
inti;
chars[80];
i=0;
while((s[i]=getchar())!
='\n')i++;
s[i]='\0';
for(i=0;i<80;i++)
if(s[i]>='a'&&s[i]<='z')s[i]-=32;
for(i=0;s[i]!
='\0';i++)
printf("%c",s[i]);
printf("\n");
}
【实验题4】程序填空,输入一个以回车结束的字符串(有效长度少于80),
将该字符串中的字符重新排列,使原先第0个字符出现在最后一位,原先第1
个字符出现在倒数第2位,……,原先最后1个字符出现在第0位,例如:
字符
串”abcdef”经重排后变成”fedcba”。
【算法分析】:
该问题类似于方阵转置,即把特定位置的数组元素进行交换。
本
题中的字符串存放在一维字符型数组s中,需要解决以下问题:
1)计算字符串s的有效长度len
2)将字符串s的前半部分(0~len/21)与字符串的后半部分对调,即交换对称元素,与s[i]对称的元素是s[len1i],
如下图所示:
012345
abcdef\0…
#include
voidmain()
{
inti,len=0;
chars[80],temp;
printf("Inputastring(<80):
\n");
gets(s);
for(i=0;s[i]!
='\0';i++)
len++;
for(i=0;i<=len/2-1;i++){
temp=s[i];
s[i]=s[len-1-i];
s[len-1-i]=temp;
}
for(i=0;s[i]!
='\0';i++)
putchar(s[i]);
printf("\n");
}
【实验题5】将一个整数字符串转换为整数输出。
(注:
整数字符串和整数是
不同的,比如"123"是一个整数字符串,每个元素都是一个数字,但不能进行数
值运算,而123是一个整数,可以进行数值运算。
两者外观形态相似,本质不同)
【算法分析】利用与字符’0’的ASCII之差进行计算。
#include
voidmain()
{
charstr[10];
doublet=0;
inti;
printf("请输入一个数字字符串(<=10位)");
gets(str);
for(i=0;str[i]!
='\0';i++)
t=t*10+(str[i]-'0');
printf("result=%.0f",t);
printf("\n谢谢,按回车键结束");
}
【实验题6】程序填空,编写一个字符串复制程序,它的功能是把一个字符串
的所有内容复制给另一个字符串,并输出复制后的字符串。
#include
voidmain()
{
chars1[80],s2[80];
inti;
printf("请输入字符串s1(<=80字符)\n");
gets(s1);
for(i=0;s1[i]!
='\0';i++)//判断s1的结束标志
s2[i]=s1[i];
s2[i]='\0';
printf("s2=%s\n",s2);
printf("谢谢,按回车键结束");
}
【实验题7】程序填空,编写一个求字符串长度的程序,它的功能求出一个字
符串中有效字符的个数。
#include
voidmain()
{
chars[80];
inti;
intlen=0;
printf("请输入一个字符串:
");
gets(s);
for(i=0;s[i]!
='\0';i++)
;
len=i;
printf("字符串有效长度=%d",len);
printf("\n谢谢,按回车键结束");
}
【实验题8】程序填空,编写一个字符串连接程序,它的功能是把两个不知道
长度的字符串s1、s2的内容连接成为一个字符串,并保存在字符串s1中。
(提
示:
要定义足够长的字符串s1)
#include
voidmain()
{
chars1[80],s2[80];
inti,j;
printf("请输入字符串s1:
");
gets(s1);
printf("请输入字符串s2:
");
gets(s2);
for(i=0;s1[i]!
='\0';i++);
for(j=0;s2[j]!
='\0';j++)
s1[i+j]=s2[j];
s1[i+j]='\0';
printf("连接后的s1=%s",s1);
printf("\n谢谢,按回车键结束");
}
******以下题目为选做题******
【实验题9】程序填空,判断一个字符串是否为回文,如果是输出“yes”,否
则输出“no”。
所谓回文是指正读和反读相同的字符串,比如“12321”
#include
voidmain()
{
chars[80];
inti;
intlen=0;
printf("请输入一个字符串:
");
gets(s);
//求出字符串的长度
for(i=0;s[i]!
='\0';i++)
len++;
len=len-1;
for(i=0;i<=len/2;i++)
if(s[i]!
=s[len-i])//比较
break;//跳出循环
if(i>len/2)//判断
printf("yes");
else
printf("no");
printf("\n谢谢,按回车键结束");
}
【实验题10】有一篇文章,共有3行文字,每行有80个字符,统计这篇文章
中各个英文字母的个数。
(提示:
可以定义一个长度为26的整型数组num,分别记录26个英文字母的个数,比如读入的字母为'a',则num[0]++,读入的字母为'b',则num[1]++,......)
#include
voidmain()
{
charstr[3][80],c;
intcnt[26],i,j;
for(i=0;i<26;i++)
cnt[i]=0;
for(i=0;i<3;i++)
{
printf("请输入第%d行字符:
",i+1);
gets(str[i]);
}
for(i=0;i<3;i++)
for(j=0;str[i][j]!
='\0';j++)
{
c=str[i][j];
if(c>='a'&&c<='z')
cnt[c-'a']++;
elseif(c>='A'&&c<='Z')
cnt[c-'A']++;
}
for(i=0;i<26;i++)
printf("%c:
%d\t",'A'+i,cnt[i]);
printf("\n谢谢,按回车键结束");
}
【实验题11】该程序功能:
输入1个字符串,按字母出现次序输出其中所出现
过的大写英文字母。
如运行时输入字符串"FONTNAMEandFILENAME",应输
出"FONTAMEIL"。
该文件中“/*****N*****/”的下一行中有错误,请改正!
#include
voidmain()
{
charx[80],y[26];inti,j,ny=0;gets(x);
for(i=0;x[i]!
='\0';i++)
if(x[i]>='A'&&x[i]<='Z')
{
for(j=0;j/*****1*****/
if(y[j]==x[i])break;
if(j==ny){y[ny]=x[i];ny++;}
}
/*****2*****/
for(i=0;iprintf("%c",y[i]);
printf("\n");
}
【实验题12】程序填空,二-十进制转换:
输入一个8位二进制字符串b(由字符’1’和’0’组成),输出对应的十进制整数。
例如,输入二进制字符串10010001,
输出十进制整数145
【算法分析】:
1、由于二进制字符串b的长度固定为8,因此定义字符数组charb[8]即
可,每个元素对应一个二进制位;
2、循环1:
输入二进制字符,输入的每一个字符先暂存在字符变量ch
中,检查ch是否是’0’或’1’,是则存入数组b,并令数组下标i增1,不是
则跳过该字符。
3、循环2:
二-十进制转换:
从前往后,带权累加数组b各元素对应的数
值b[i]‘0’:
d=d×2+b[i]‘0’
#include
voidmain()
{
inti,d;
charch,b[8];
printf("Intput8-bitbinary:
");
i=0;
while(i<8){
ch=getchar();
if(ch=='0'||ch=='1'){b[i]=ch;i++;}
}
d=0;
for(i=0;i<8;i++)d=d*2+b[i]-'0';
printf("digit=%d\n",d);
}
l思考:
如果改为输入一个4位长度的十六进制字符串,如”2f3a”,要输出对应的十进制整数,上面的程序需要如何修改?
#include
voidmain()
{
inti,d;
charch,b[4];
printf("Intput4-bitbinary:
");
i=0;
while(i<4){
ch=getchar();
if(ch>='1'&&ch<='9'||ch>='a'&&ch<='f'||ch>='A'&&ch<='F')
{b[i]=ch;i++;}
}
d=0;
for(i=0;i<4;i++)
{if(b[i]>='1'&&b[i]<='9')d=d*16+(b[i]-'0');
if(b[i]>='a'&&b[i]<='f')d=d*16+(b[i]-'a'+10);
if(b[i]>='A'&&b[i]<='F')d=d*16+(b[i]-'A'+10);}
printf("digit=%d\n",d);
}