第4章 数组 - 44584

while(*pa) {*pb=*pa+3; pa++;pb++;} *pb='\\0'; pb=b;

while(*pb) {*pc=*pb-3; pb++;pc++;} *pc='\\0';

printf(\ printf(\ printf(\}

(7)输入一个字符串,输出每个大写英文字母出现的次数。

解答:定义一个有26个元素的一维整型数组num,依次用来存放各个大写英文字母出现的个数。由于各大写英文字母的ASCII码与'A'的ASCII码的差,正好是用来存放该大写英文字母个数的数组元素的下标,所以,若当前字符*p为大写英文字母,则执行num[*p-'A']++即可使指定的数组元素值加1。

#include \main()

{ char str[81],*p=str; int num[26]={0},i;

printf(\ gets(str); while(*p)

{ if(*p>='A'&&*p<='Z') num[*p-'A']++; p++; }

for(i='A';i<='Z';i++) printf(\ printf(\ for(i=0;i<26;i++)

printf(\ printf(\}

(8)把从键盘输入的字符串逆置存放并输出。

解答:定义两个字符指针变量p和q,分别指向第一个字符和最后一个字符,交换p和q指向的字符,然后 p指向下一个字符,q指向前一个字符,再交换p和q指向的字符,如此下去,直到p>=q为止。

#include \main()

{ char str[81],*p,*q,ch;

printf(\ gets(str); p=str;q=p; while(*q) q++; q--;

while(p

82

printf(\}

(9)输出4×4阶矩阵的主次对角线元素之和。

解答:矩阵主对角线上的元素,其行标和列标相等,矩阵次对角线上的元素,其行标与列标之和为3,用二维数组a[4][4]来表示4×4阶矩,所以,对满足行标和列标相等或行标与列标之和为3的二维数组元素求和即可。

main()

{ int a[4][4],i,j,sum=0;

printf(\ for(i=0;i<4;i++) for(j=0;j<4;j++)

scanf(\ for(i=0;i<4;i++) for(j=0;j<4;j++) if(i==j||i+j==3) sum+=a[i][j];

printf(\}

(10)统计一个英文句子中含有英文单词的个数,单词之间用空格隔开。

解答:单词的个数可以由空格出现的次数决定(连续的若干空格作为出现一次空格,一行开头的空格不统计在内)。如果当前字符不是空格,而它前面的字符是空格,则表示新单词开始,此时计数器加1。如果当前字符和它前面的字符都不是空格,则意味着仍然是原来单词的继续,计数器不能加1。前一个字符是否为空格,可以用一个变量word来标识,若word=0,则表示前一个字符为空格,若word=1,则表示前一个字符不为空格。

#include \main()

{ char str[81],*p=str; int num=0,word=0;

printf(\ gets(str); while(*p)

{ if(*p==' ') word=0; else if(word==0)

{ num++; word=1;} p++; }

printf(\}

(11)从键盘上输入四个字符串(长度小于80),对其进行升序排序并输出。

解答:利用选择排序法进行排序,用strcmp()函数进行比较,用strcpy()函数进行交换。

#include \#include \main()

83

{ char str[4][81],temp[81]; int i,j;

printf(\ for(i=0;i<4;i++) gets(str[i]); for(i=0;i<3;i++) for(j=i+1;j<4;j++)

if(strcmp(str[i],str[j])>0) { strcpy(temp,str[i]); strcpy(str[i],str[j]); strcpy(str[j],temp); }

printf(\ for(i=0;i<4;i++) puts(str[i]); }

(12)已知一个排好序的数组,输入一个数,要求按原来排序的规律将它插入到数组中。 解答:从数组的最后一个元素开始,逐个进行输入数和数组元素值的比较,若输入数小于数组元素值(假设原来升序排序),则数组元素值后移一个位置,否则将输入数存入当前数组元素的后一个元素。

main()

{ int a[10]={1,3,5,7,9,11},n=6,i,num; printf(\ scanf(\ i=n-1;

while(a[i]>num&&i>=0) {a[i+1]=a[i];i--;} a[i+1]=num;

printf(\ for(i=0;i<=n;i++) printf(\ printf(\}

(13)编写程序,实现两个字符串的比较。不许使用字符串比较函数strcmp()。 解答:

#include \main()

{ char str1[81],str2[81],*p1=str1,*p2=str2; printf(\ gets(str1);

printf(\ gets(str2); while(*p1&&*p2)

if(*p1==*p2) {p1++;p2++;}

84

else break;

printf(\}

(14)已知A是一个4×3阶矩阵,B是一个3×5阶矩阵,计算A和B的乘积。

解答:用二维数组a[4][3]、b[3][5]、c[4][5]来表示矩阵A、B、C,根据数学知识可知,c[i][j]=a[i][0]*b[0][j]+ a[i][1]*b[1][j]+ a[i][2]*b[2][j],所以用一个三重循环就可以求出数组c中全部元素。

main()

{ int a[4][3],b[3][5],c[4][5],i,j,k; printf(\ for(i=0;i<4;i++) for(j=0;j<3;j++)

scanf(\

printf(\ for(i=0;i<3;i++) for(j=0;j<5;j++)

scanf(\ for(i=0;i<4;i++) for(j=0;j<5;j++) { c[i][j]=0;

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

c[i][j]+=a[i][k]*b[k][j]; }

printf(\ for(i=0;i<4;i++) { for(j=0;j<5;j++)

printf(\ printf(\ } }

(15)输入10个数,将其中最小数与第一个数交换,将最大数与最后一个数交换。 解答:用一维数组a存放输入的10个数,在数组中找出最小元素和最大元素的下标maxi和mini,若maxi=0且mini=9,则[0]和a[9]交换即可,若maxi=0且mini≠9,则先交换a[0]和a[mini],然后再交换a[9]和a[mini],否则,先交换a[0]和a[mini],然后再交换a[9]和a[maxi]。

main()

{ int a[10],i,maxi,mini,max,min; printf(\ for(i=0;i<10;i++) scanf(\ maxi=0;mini=0; max=a[0];min=a[0]; for(i=1;i<10;i++)

{ if(a[i]>max) {max=a[i];maxi=i;}

85

联系客服:779662525#qq.com(#替换为@)