实验6-数组——参考答案

实验6-数组——参考答案
实验6-数组——参考答案

实验6 数组

一、一维数组实验

2. 编程:输入长度为10的整型数组并输出;然后将其逆序存放后再输出。例如:

Input 10 number: 0 1 2 3 4 5 6 7 8 9

After reversed: 9 8 7 6 5 4 3 2 1 0

#include

void main()

{

int i, j, a[10], t;

printf("Input 10 number: ");

for(i=0; i<10; i++) /*读入数据*/

scanf("%d", &a[i]);

printf("origin data: ");

for(i=0; i<10; i++) /*输出原始数据*/

printf("%d ", a[i]);

printf("\n");

for(i=0,j=9; i

{

t=a[i];

a[i]=a[j];

a[j]= t;

}

printf("After reversed: "); /*输出逆序存放后的数据*/

for(i=0; i<10; i++)

printf("%d ", a[i]);

printf("\n");

}

3. 编程:输入n个(1

Input n: 5

Input 5 integer: 8 2 5 1 4

max=8 index=0

min=1 index=3

average=4

#include

void main()

{

int i, n , max, min, a[10], sum;

float average;

printf("Input n (1

scanf("%d", &n);

if(1

{

printf("Input %d integer:", n); /*输入数据并求累加和*/

for(i=0, sum=0; i

{

scanf("%d", &a[i]);

sum+=a[i];

}

average=(float)sum/n; /*求出平均值*/

for(i=0, max=0, min=0; i

{

if(a[i] > a[max])

max= i;

if(a[i] < a[min])

min= i;

}

printf("max=%-5d index=%d\n", a[max], max);

printf("min=%-5d index=%d\n", a[min], min);

printf("average=%.2f\n", average);

}

else

printf("数据超出围");

}

4. 编程:青年歌手参加歌曲大奖赛,有10个评委对她(他)进行打分,试编程求这位选手的平均得分并输出(去掉一个最高分和一个最低分)。

#include

void main()

{

int i, max, min;

float a[10], ave;

printf("请输入10个评委的打分:");

for(i=0, ave=0; i<10; i++) /*输入分数并求累加和*/

{

scanf("%f", &a[i]);

ave+=a[i];

}

for(i=0, max=0 , min=0; i<10; i++) /*求最大、最小值的下标*/

{

if(a[i]>a[max])

max=i;

if(a[i]

min=i;

}

ave=ave-a[max]-a[min];

ave=ave/8;

printf("该选手的评委打分是:");

for(i=0; i<10; i++)

printf("%.2f ", a[i]);

printf("\n");

printf("去掉最高分%.2f,去掉最低分%.2f,该选手的平均得分是%.2f\n", a[max], a[min], 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("\n");

f1= f2;

f2= f3;

}

}

(2)方法2:使用一维数组。

#include

void main()

{

int i;

int fib[40];

fib[0]=fib[1]=1;

for(i=2; i<40; i++) /*计算其余的38个数*/

fib[i]= fib[i-1] + fib[i-2];

for(i=0; i<40; i++)

{

printf("%12d",fib[i]);

if((i+1)%5==0)

printf("\n");

}

}

6. 编程:输入n个(1

Input n: 5

Input 5 number: 8.5 2.3 5.1 1.4 4.9

After sorted: 8.50 5.10 4.90 2.30 1.40

#include

void main()

{

int i, j, n;

float a[10], t;

printf("Input n: ");

scanf("%d",&n);

if(n>1 && n<=10)

{

printf("Input %d number:", n);

for(i=0;i

scanf("%f",&a[i]);

printf("Before sorted:"); /*输出排序前的数据*/

for(i=0; i

printf("%.2f ", a[i]);

printf("\n");

for(i=0; i

for(j=0; j

if( a[j] < a[j+1] )

{

t=a[j];

a[j]=a[j+1];

a[j+1]=t;

}

printf("After sorted:"); /*输出排序结果*/

for(i=0; i

printf("%.2f ", a[i]);

printf("\n");

}

else

printf("数据超出围");

}

7. 在上题基础上(输入n个float型的数据并保存到数组中,用冒泡法或选择法将它们从大到小排序后输出)完成:在已经排好序的数组(长度不足10)中插入一个数m(键盘输入)后输出,保持数组的降序排列。

程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。

#include

void main()

{

int i, j, n, p;

float a[10], t, m;

printf("Input n: ");

scanf("%d", &n);

if(n>1 && n<=10)

{

printf("Input %d number:", n);

for(i=0; i

scanf("%f", &a[i]);

printf("Before sorted: "); /*输出排序前的数据*/

for(i=0; i

printf("%.2f ", a[i]);

printf("\n");

for(i=0; i

for(j=0; j

if( a[j] < a[j+1] )

{

t=a[j];

a[j]=a[j+1];

a[j+1]=t;

}

printf("After sorted:"); /*输出排序结果*/

for(i=0; i

printf("%.2f ", a[i]);

printf("\n");

printf("请输入要插入的数据m: ");

scanf("%f", &m);

/*找到插入位置*/

if(m < a[n-1]) /*如果m比最后一个元素小,则直接插入到最后的位置*/ p = n;

else

{

for(i=0; i

if( m > a[i])

{

p=i;

break;

}

for(i=n; i>=p+1; i--) /*将插入位置之后的元素后移*/

a[i]=a[i-1];

}

/*插入*/

a[p]=m;

printf("插入%.2f 后:", m); /*输出插入后结果*/

for(i=0; i

printf("%.2f ", a[i]);

printf("\n");

}

else

printf("数据超出围");

}

二、二维数组实验

1. 以下程序功能为:将下列矩阵中的元素向右移动一列,最后一列移至第一列。找出并改正以下源程序中

错误,通过调试得出正确的运行结果。

1 4 6

8 10 12

源程序(有错误的程序)

#include

#define ROW 2

#define COL 3

int main()

{

int a[ROW][COL]={1,4,6,8,10,12};

int i,j,temp;

for(i=0;i

{

temp=a[i][COL-1];

for(j=COL-2;j>=0;j--)

{

a[i][j]=a[i][j+1]; /*调试时设置断点*/ //改为a[i][j+1]=a[i][j];

}

a[i][0]=temp; /*调试时设置断点*/

}

for(int i=0;i

{

for(j=0;j

printf("%6d",a[i][j]);

printf("\n");

}

return 0;

}

运行结果(改正后程序的运行结果)

6 1 4

12 8 10

2. 编程:利用二维数组计算并打印一个n 行的辉三角。例如:

Input n: 6

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 4 10 10 5 1

提示:第一列及对角线上的元素都是1,其他元素通过计算得出:

如果用i 表示行,j 表示列,则第i 行j 列的元素j i j i j i p p p ,11,1,---+=

#include

void main()

{

int a[10][10]={0}; //设最多10层

int i, j, n;

printf("请输入辉三角形的层数:");

scanf("%d", &n);

if(n>10)

{

printf("层数超出围");

return;

}

for(i=0;i

{

a[i][0]=1;

a[i][i]=1;

}

for(i=2;i

for(j=1;j

a[i][j]=a[i-1][j-1]+a[i-1][j];

for(i=0;i

{

for(j=0;j<=i;j++)

printf("%4d",a[i][j]);

printf("\n");

}

}

3. 编程:通过键盘输入3行4列的二维数组,分别按行和按列输出数组。例如:

Input numner:

1 2 3 4

5 6 7 8

9 10 11 0

output by row: 1 2 3 4 5 6 7 8 9 10 11 0

output by col: 1 5 9 2 6 10 3 7 11 4 8 0

#include

void main()

{

int a[3][4],i,j;

printf("请输入 3 X 4 整数矩阵:\n");

for(i=0; i<3; i++)

for(j=0; j<4; j++)

scanf("%d", &a[i][j]);

printf("按行输出:");

for(i=0; i<3; i++)

for(j=0; j<4; j++)

printf("%d ",a[i][j]);

printf("\n");

printf("按列输出:");

for(i=0; i<4; i++)

for(j=0; j<3; j++)

printf("%d ",a[j][i]);

printf("\n");

}

4. 编程:输入一个m*n矩阵,求他们的各行元素之和。例如:

Input m , n: 2 2

Input 2*2 matrix:

4 5

5 6

sum[0]=9

sum[1]=11

提示:设计一个一维数组 int s[10],分别保存各行元素之和。

#include

void main()

{

int a[10][10], s[10]={0}; //设定矩阵最大为10 x 10

int m, n, i, j;

printf("请输入矩阵的行数和列数:");

scanf("%d%d", &m, &n);

if(m<0 || m>10 || n<0 || n>10)

{

printf("行或列(1~10)值超出围");

return;

}

printf("请输入 %d*%d 矩阵:\n",m,n);

for(i=0; i

for(j=0; j

scanf("%d",&a[i][j]);

//求各行之和并输出

for(i=0; i

{

for(j=0; j

s[i]+=a[i][j];

printf("sun[%d]= %d \n", i, s[i]);

}

}

5. 编程:判断一个二维数组是否存在鞍点,若存在,则输出鞍点及其行号和列号;否则输出没有鞍点信息。“鞍点”是指这样的元素:它在本行是最大元素,而在本列是最小的元素。

Input m , n: 2 2

Input 2*2 matrix:

4 5

5 6

i=0, j=1, saddle point: 5

提示:找鞍点需要处理三件事情:(1)找每行中最大值所在的列下标;(2)判断该元素在本列上是否为最小;(3)判断是否找到了鞍点,若找到,输出。

#include

void main()

{

int a[10][10]; //设定矩阵最大为10 x 10

int m, n, i, j, col, flag=0;

printf("请输入矩阵的行数和列数:");

scanf("%d%d", &m, &n);

if(m<0 || m>10 || n<0 || n>10)

{

printf("行或列(1~10)值超出围");

return; //退出程序

}

printf("请输入 %d*%d 矩阵:\n",m,n);

for(i=0; i

for(j=0; j

scanf("%d",&a[i][j]);

for(i=0; i

{

col=0; //找出第i行中的最大值所在列下标col

for(j=1; j

if(a[i][col]

col=j;

for(j=0; j

if(a[i][col]>a[j][col])

break;

if(j==m)

{

flag=1; //有鞍点

printf("i=%d, j=%d, saddle point:%d\n",i,col,a[i][col]);

}

}

if(flag==0)

printf("No saddle point!\n");

}

三、字符串实验

1. 以下程序功能为:输入一个字符串,将其逆序输出。找出并改正以下源程序中错误,通过调试得出正确的运行结果。

源代码(有错误的程序)

#include

#include

void main()

{

int i,j;

char s[80],result[80];

printf("Enter a string:\n");

gets(s);

for(i=strlen(s)-1,j=0;i>=0;i--,j++)

{

result[j]=s[i];

}

result[j]='\0'; //必须给字符串加上串结束标志

printf("This is reverse string:\n");

puts(result);

}

运行结果(改正后的程序)

Enter a string :

asdfg

This is the reverse string:

gfdsa

2. 编程:任意输一个字符串保存在一维字符数组中,求其长度(不用strlen函数)。例如:

Input a string: aadfdg

length=6

提示:字符串的有效长度就是有效字符的个数,即数组中第一个‘\0’前面的字符个数。

#include

void main()

{

int i, len=0;

char s[80];

printf("请输入字符串,以回车键结束:");

gets(s);

for(i=0; s[i]!='\0'; i++)

len++;

printf("字符串%s的长度为:%d\n",s, len);

}

3. 编程:任意输入两个字符串分别保存在一维字符数组中,把第二个字符串连接到第一个字符串末尾(不用strcat函数)。例如:

Input two string:

asdfg

erty

after strcat: asdfgerty

#include

void main()

{

int i,j;

char s1[80], s2[80];

printf("请输入字符串1以回车键结束:\n");

gets(s1);

printf("请输入字符串2以回车键结束:\n");

gets(s2);

for(i=0; s1[i]!='\0'; i++) ; /* 定位第一个字符串的结束标志*/

for(j=0; s2[j] && i<80; i++, j++ ) /*将s2接到s1后*/

s1[i]=s2[j];

s1[i]='\0';

printf("两个串连接后:%s\n",s1);

}

4. 编程:从键盘读入两个字符串分别保存在一维字符数中,比较两个字符串大小(不用strcmp函数),输出较大的字符串。

#include

void main()

{

int i;

char a[80], b[80];

printf("请输入字符串1以回车键结束:\n");

gets(a);

printf("请输入字符串2以回车键结束:\n");

gets(b);

//逐个比较直到两个字符不同或其中一个字符串结束

for(i=0; a[i] && b[i] ; i++)

{

if(a[i]!=b[i])

break;

}

if (a[i]>b[i])

printf("第一个字符串%s大!\n", a);

else if (a[i]==b[i])

printf("两字符串相同!\n");

else

printf("第二个字符串%s大!\n", b);

}

5. 编程:任意输入一个字符串保存在一维字符数组中,判断里面数字字符的个数。例如:

Input a string:

adg4521gadg4adg

number: 5

#include

void main()

{

int i, n=0;

char s[80];

printf("请输入一个字符串以回车键结束:\n");

gets(s);

for(i=0 ; s[i]; i++)

if(s[i]>='0' && s[i]<='9')

n++;

printf("字符串中包含的数字个数为:%d\n",n);

}

6. 编程:从一个字符串中删除从某个特定字符开始的所有字符。例如原字符串为"abcdefg",特定字符为'd',删除后的字符串为"abc"。

#include

void main()

{

int i, flag=0;

char c, s[80];

printf("请输入一个字符串以回车键结束:\n");

gets(s);

printf("请输入特定字符:");

c=getchar();

for(i=0 ; s[i]; i++)

if(s[i]==c)

{

s[i]='\0';

flag=1;

break;

}

if(flag==0)

printf("输入字符中没有特定字符!\n");

else

puts(s);

}

7. 编程:编写程序,从一个输入的字符串中抽取一部分(从第n个字符开始,抽取m个字符)构成一个新的字符串,并输出。要求:n和m都由用户输入。

#include

#include

void main()

{

unsigned int i, j, m, n;

char s1[80], s2[80];

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; s1[i] && i< n+m-1 ; i++, j++)

s2[j]=s1[i];

s2[j]='\0';

puts(s2);

}

else

printf("长度超出围!\n");

}

else

printf("起始位置超出围!\n");

}

8. 编程:利用字符串库函数puts, gets, strcat, strcmp, strcpy, strlen完成下述操作:

●读入三个字符串str1,str2,str3

●输出这三个字符串

●分别求出这三个字符串的长度;

●比较str1和str2的大小;

●将str2连接到str1之后,并输出连接后的str1;

●复制str3到str1,并输出复制操作后的str1;

#include

#include

void main()

{

char str1[80], str2[80], str3[80];

printf("请输入字符串str1以回车键结束:\n");

gets(str1);

printf("请输入字符串str2以回车键结束:\n");

gets(str2);

printf("请输入字符串str3以回车键结束:\n");

gets(str3);

printf("三个字符串分别是:\n");

printf("str1: %s\n", str1);

printf("str2: %s\n", str2);

printf("str3: %s\n", str3);

printf("三个字符串的长度分别是:\n");

printf("str1: %d\n", strlen(str1));

printf("str2: %d\n", strlen(str2));

printf("str3: %d\n", strlen(str3));

if(strcmp(str1, str2)>0)

printf("字符串str1大于str2\n");

else if(strcmp(str1, str2)==0)

printf("字符串str1等于str2\n");

else

printf("字符串str1小于str2\n");

strcat(str1,str2);

printf(" str2连接到str1之后: %s\n",str1);

strcpy(str1,str3);

printf("复制str3到str1: %s\n",str1);

}

选作题:

输入一个小写字母组成的英文句子,统计该句子有几个英文单词,并统计每个字母出现的次数,并将句子中每个单词的首字母大写后输出。

如:输入: this is a cat!

输出:4个单词;

每个字母出现次数t:2 h:1 i:2 s:2 a:2 c:1

This Is A Cat!

#include

void main()

{

char s[80];

int count[26]={0}; //与26个字母对应,统计各个字母出现的次数

int i, j, wordnum=0, flag=0;

printf("请输入一个英文句子(小写字母)以回车键结束:");

gets(s);

for(i=0; s[i]; i++)

{

if(s[i]>='a' && s[i]<='z') //逐个字母判断,使其对应的出现次数增加1

{

j=s[i]-'a'; // 计算该字母在26个字母中的序号

count[j]++;

}

if(i==0 && s[i]!=' ' || flag==1) //句首单词及每个单词第一个字母的处理

{

wordnum++; //单词个数增加1

s[i]=s[i]-32; //小写换大写

flag=0;

}

else if(s[i]==' ' && s[i+1]>='a' && s[i+1]<='z')

flag=1;

//当前是空格,但下一个字符是字母,则该字母一定是单词的起始字母flag=1。

//即判断一个单词的起始字符,单词间用空格区分,这里考虑了单词间多个空格的情况}

printf("句子中有%d个单词;\n", wordnum);

printf("每个字母出现的次数:");

for(i=0; i<26; i++)

{

if(count[i]!=0)

printf("%c: %d ", i+'a', count[i]);

}

printf("\n");

printf("每个单词首字母大写后:");

puts(s);

}

相关主题
相关文档
最新文档