资源描述
第7章 数组习题解答
1.以下各题中,选择一个正确的翻案。
⑴能正确对一维数组a中所有元素进行初始化的是(D)。
A. int a[5]={ } B. int a[]={0} C.int a[5]=0,0,0,0,0 D.int a[5]={0}
#include<stdio.h>
void main()
{
int i;
int a[5]={0};
for(i=0;i<5;i++)
printf("%d ",a[i]);
}
⑵有说明int k=3,a[10];
则下列可以正确引用数组元素的表达式是( A )。
A. a[k] B. a[10] C.a[1.3] D.a[3*5]
⑶有定义int d[][3]={1,2,3,4,5,6};
执行语句printf("%c ",d[1][0]+'A');
结果是(D)。
A. A B. B C. D D. E
#include<stdio.h>
void main()
{
int d[][3]={1,2,3,4,5,6};
printf("%c ",d[1][0]+'A');
}
⑷有定义char c='A',ch[20]={'a','b','c','\0','d','\0'};
若执行:printf("%s ",ch);
结果为(B)。
A. ‘abc’ B. abc C. abcd D. abc\0d
#include<stdio.h>
void main()
{
char c='A',ch[20]={'a','b','c','\0','d','\0'};
printf("%s ",ch);
}
⑸对数组进行初始化char carr[]={'s','t','u','d','e','n','t'},barr[]="student";
则正确的是(D)。
A. carr与barr长度相同 B. carr比barr
C. carr与barr相同 D. carr比barr短
#include<stdio.h>
void main()
{
char carr[]={'s','t','u','d','e','n','t'},barr[]="student";
}
2.阅读下列程序,写出运行结果。
⑴
#include<stdio.h>
void main()
{
int i,j,d[4][4]={{1,2,3,4},{5,6,7,8},{4,3,2,1},{1,2,3,4}};
for(i=0;i<4;i++)
for(j=0;j<i;j++)
if(d[i][j]>d[j][i])
d[j][i]=d[i][j];
for(i=0;i<4;i++)
{
printf("\n");
for(j=0;j<4;j++)
if(j>=i)
printf("%6d",d[i][j]);//显示主对角线以上的元素
else
printf("%6c",' ');
}
putchar('\n');
}
运行结果:
1 5 4 4
6 7 8
2 3
4
⑵若输入十进制数3291时,下列程序输出为:
6333
#include<stdio.h>
void main()
{
int i,d,m,n;
char s[8];
scanf("%d",&n);
i=0; //存储字符数组下标
do
{
m=n/8;
d=n%8;
s[i]='0'+d;//余数转换为数字字符
i++;
n=m; //商作为下一轮行循环操作的被除数
}while(n!=0); //商不为0,继续循环
for(i--;i>=0;i--)
putchar(s[i]);
}
3.程序填空。
⑴从键盘输入 一个数,将其插入到一个升序数组中,保持数组仍然按升序排列。
#include<stdio.h>
void main()
{
int data,temp,k;
static int a[9]={-10,2,4,8,10,15,25,50};
printf("\nEnter adata:");
scanf("%d",&data);
a[8]=data;
for(k=8;k>=0;k--)
{
if(a[k]<a[k-1])
{
temp=a[k];
a[k]=a[k-1];
a[k-1]=data;
}
else
break;
}
for(k=0;k<=8;k++)
printf("%7d",a[k]);
putchar('\n');
}
注:原程序的代码有误,其核心部分有元素交换操作,这对已按升序排列各元素的数组,在插入一个元素时是没有必要的。完整的代码如下:
#include<stdio.h>
void main()
{
int data,k;
static int a[9]={-10,2,4,8,10,15,25,50};
printf("\nEnter adata:");
scanf("%d",&data);
for(k=8;k>=0;k--)
{
if(data>a[k-1]||k==0)
{
a[k]=data;
break;
}
else
{
a[k]=a[k-1];
}
}
for(k=0;k<=8;k++)
printf("%7d",a[k]);
putchar('\n');
}
运行该程序:
Enter adata:9
-10 2 4 8 9 10 15 25 50
⑵从键盘输入一串英文字符(不含空格与其他字符),统计每个字符的个数,并输出字母及相应的个数。
#include<stdio.h>
void main()
{
int i=0,c[52]={0},m=0;
char str[80];
printf("Input a string:");
scanf("%s",str);
while(str[i])
{
if(str[i]>='A' && str[i]<='Z')
c[str[i]-'A']++;
if(str[i]>='a' && str[i]<='z')
c[str[i]-'a'+26]++;
i++;
}
for(i=0;i<26;i++)
if(c[i])
{
if(m%8==0)
putchar('\n');
m++;
printf("%c:%-d ",i+'A',c[i]);
}
for(i=0;i<26;i++)
if(c[i+26])
{
if(m%8==0)
putchar('\n');
m++;
printf("%c:%-d ",i+'a',c[i+26]);
}
putchar('\n');
}
4.求一组成绩的平均分数以及高于平均分的成绩,设给定的成绩为90,85,92,77,80,62。
注:省略数据输入,用随机函数产生10个数,求其平均值。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void main()
{
int a[10],i,sum=0;
double average;
srand((unsigned)time(NULL));
for(i=0;i<10;i++)
{
a[i]=rand()%100;
printf("%d ",a[i]);
}
putchar('\n');
for(i=0;i<10;i++)
sum+=a[i];
average=sum/10;
printf("average=%lf\n",average);
}
运行:
95 26 88 83 57 31 33 55 82 30
average=58.000000
5.编写程序,输入一组整数,将它们排序后由小到大输出。
[起泡法]
思路:两个数比较,小者前移,大者后移。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int a[10],i,j,t;
srand((unsigned)time( NULL));//初始化rand()函数
for(i=0;i<10;i++)
a[i]=rand()%100; //用随机数为数组元素赋值
printf("Before sorted:\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
putchar('\n');
for(j=0;j<9;j++)
for(i=0;i<10-j;i++)
if(a[i]>a[i+1])
{
t=a[i];a[i]=a[i+1];a[i+1]=t;
}
printf("After sorted:\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
putchar('\n');
return 0;
}
程序运行后输出:
Before sorted:
21 14 78 57 3 61 82 8 52 45
After sorted:
3 8 14 21 45 52 57 61 78 82
[选择法]
思路:用一个变量k保存当前最小元素的下标,不进行交换,直到完成一次内循环的比较后,把a(k)交换到希望的位置a(i):
①令k=0,a(k)与a(1)比较,若a(k)>a(1),令k=1,小者的下标存放在k中;
② a(k)又与a(2),a(3),……,直到a(10),重复①的工作,结束后,实现10个数中的最小者存放在a(k)中。
③a(1)与a(k)交换,把最小者存放在a(1)中。
④分别令k=1,2,3,….,9重复①②③的操作。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int a[10],i,j,t,k;
srand((unsigned)time( NULL));//初始化rand()函数
for(i=0;i<10;i++)
a[i]=rand()%100; //用随机数为数组元素赋值
printf("Before sorted:\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
putchar('\n');
for(i=0;i<9;i++)
{
k=i;
for(j=i+1;j<10;j++)
if(a[k]>a[j])k=j;
t=a[i];a[i]=a[k];a[k]=t;
}
printf("After sorted:\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
putchar('\n');
return 0;
}
6.从键盘输入一个4×4整数矩阵,以主对角线为对称轴,将左下角元素中较大元素代替右上角对应元素,并将右上角元素(含对角线元素)输出。
注:本题与2题的操作相同。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int d[4][4],i,j;
srand((unsigned)time( NULL));//初始化rand()函数
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
d[i][j]=rand()%100; //用随机数为数组元素赋值
printf("%6d",d[i][j]);
}
putchar('\n');
}
for(i=0;i<4;i++)
for(j=0;j<i;j++)
if(d[i][j]>d[j][i])
d[j][i]=d[i][j];
for(i=0;i<4;i++)
{
printf("\n");
for(j=0;j<4;j++)
if(j>=i)
printf("%6d",d[i][j]);//显示主对角线以上的元素
else
printf("%6c",' ');
}
putchar('\n');
return 0;
}
7.通过键盘给3×4的二维数组输入数据,然后分别按行和列输出数组元素。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int d[3][4],i,j;
srand((unsigned)time( NULL));//初始化rand()函数
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
d[i][j]=rand()%100; //用随机数为数组元素赋值
printf("%6d",d[i][j]);
}
putchar('\n');
}
return 0;
}
8.编写程序,将两个字符串连接起来,不要用strcat函数。
#include<stdio.h>
int main()
{
char a[80],b[40];
int i,j;
printf("Input a string:");
scanf("%s",a);
printf("Input a string:");
scanf("%s",b);
i=0;
while(a[i])i++; //搜索串尾元素下标
for(j=0;b[j];j++,i++)
a[i]=b[j];
a[i]='\0';
puts(a);
return 0;
}
9.输入一行字符串,统计该字符串中字符对ab的个数。
#include<stdio.h>
int main()
{
char a[80];
int i,n=0;
printf("Input a string:");
scanf("%s",a);
for(i=0;a[i];i++)
{
if(a[i]=='a' && a[i+1]=='b')
n++;
}
printf("ab_number=%d\n",n);
return 0;
}
10.从键盘输入10个字符串,找出一最长的字符串。
#include<stdio.h>
int main()
{
char a[5][80];
int i,j,n,max=0;
for(i=0;i<5;i++)
{
printf("Input a string:");
scanf("%s",a[i]);
}
for(i=0,j=0;i<5;i++,j=0)
{
while(a[i][j])j++;
if(j>max)
{
max=j;
n=i;
}
}
printf("Max_string:%s\n",a[n]);
return 0;
}
11.已知数组a中有m个按升序排列的元素,数组b中有n个按降序排列的元素,编程将a与b中的所有元素按降序存入数组c中。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void risesort(int a[],int n)//升序排序
{
int i,j,k,t;
for(i=0;i<n;i++)
{
k=i;
for(j=i+1;j<10;j++)
if(a[k]>a[j])k=j;
t=a[i];a[i]=a[k];a[k]=t;
}
}
void dropsort(int a[],int n)//降序排序
{
int i,j,k,t;
for(i=0;i<n;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(a[k]<a[j])k=j;
t=a[i];a[i]=a[k];a[k]=t;
}
}
void disp(int a[],int n) //显示数组中的各元素
{
int i;
for(i=0;i<n;i++)
printf("%d ",a[i]);
putchar('\n');
}
void f(int a[],int n)
{
int i;
for(i=0;i<n;i++)
a[i]=rand()%100; //用随机数为数组元素赋值
}
int main()
{
int a[10],b[10],c[20],i,j,k;
srand((unsigned)time( NULL));//初始化rand()函数
f(a,10);
risesort(a,10);
disp(a,10);
f(b,10);
dropsort(b,10);
disp(b,10);
for(i=9,j=0,k=0;k<20;)//i,j,k分别为数组a,b,c的下标
{
if(a[i]>b[j] && i!=-1 && j!=10)
c[k++]=a[i--];
else if(a[i]==b[i])
{
c[k++]=a[i--];
c[k++]=b[j++];
}
else if(j!=10)
c[k++]=b[j++];
else if(i!=-1)
c[k++]=a[i--];
}
disp(c,20);
return 0;
}
实验七 数组
2.填空
⑴以下程序分别在a数组和b数组中放入an+1和bn+1个由小到大的有序数,程序把两个数组中的数按由小到大的顺序归并在c数组中。
#include<stdio.h>
int main()
{
int a[10]={1,2,5,8,9,10},an=5;
int b[10]={1,3,4,8,12,18},bn=5;
int i,j,k,c[20],max=9999;
a[an+1]=b[bn+1]=max;
i=j=k=0;
while((a[i]!=max) || (b[j]!=max))
if(a[i]<b[j])
{
c[k]=a[i];k++;i++;
}
else
{
c[k]=b[j];k++;j++;
}
for(i=0;i<k;i++)printf("%4d",c[i]);
printf("\n");
return 0;
}
⑵以下程序以每行输出8个数据的形式输出a数组。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int a[50],i;
//for(i=0;i<50;i++)scanf("%d",&a[i]);
srand((unsigned)time( NULL));
for(i=0;i<50;i++)a[i]=rand()%100;
for(i=0;i<50;i++)
{
if(i%8==0)printf("\n");
printf("%3d",a[i]);
}
printf("\n");
return 0;
}
⑶以下程序将数组中的数据按逆序存放。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define SIZE 12
int main()
{
int a[SIZE],i,j,t;
//for(i=0;i<SIZE;i++)scanf("%d",&a[i]);
srand((unsigned)time( NULL));
for(i=0;i<SIZE;i++){a[i]=rand()%100;printf("%3d",a[i]);}
putchar('\n');
i=0;j=SIZE-1;
while(i<j)
{
t=a[i];a[i]=a[j];a[j]=t;
i++;j--;
}
for(i=0;i<SIZE;i++)printf("%3d",a[i]);
printf("\n");
return 0;
}
⑷假设a数组中的数按由小到大的顺序存放,以下程序把a数组中相同的数删得只剩下一个,然后以每行5个数的形式输出a数组中的数,请填空。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAX 30
int main()
{
int a[MAX],i,j,k,t,n;
//for(i=0;i<MAX;i++)scanf("%d",&a[i]);
srand((unsigned)time( NULL));
for(i=0;i<MAX;i++) //为各元素赋值
{
t=rand()%100;
a[i++]=t;a[i++]=t;a[i]=t;
printf("%3d%3d%3d",a[i-1],a[i-1],a[i]);
}
putchar('\n');
for(i=0;i<MAX-1;i++) //排序
{
k=i;
for(j=i+1;j<MAX;j++)
if(a[k]>a[j])k=j;
if(k!=i)
{t=a[i];a[i]=a[k];a[k]=t;}
}
for(i=0;i<MAX;i++)printf("%3d",a[i]);
putchar('\n');
n=i=MAX-1;
while(i>0)
{
if(a[i]==a[i-1]) //删除相同元素
{
for(j=i;j<=n;j++)a[j-1]=a[j];
n--; //总元素个数减1
}
i--;
}
for(i=0;i<=n;i++)
{
if(i%5==0)printf("\n");
printf("%3d",a[i]);
}
printf("\n");
return 0;
}
3. 编程题。
⑴用筛法求2-100以内的素数。
#include<stdio.h>
void main()
{
int i,j,k=0;
int a[100]; //用数组作筛
for(i=0;i<100;i++)a[i]=i; //为数组各元素赋值,下标与元素值相等
for(i=2;i<100;i++) //2是最小的素数
{
if(a[i]!=0) //当前不为0的元素即为素数(不能被较小的数整除)
{
for(j=i+1;j<100;j++)
{
if(j%i==0)//下标为素数倍数的元素赋值0
a[j]=0;
}
}
}
for(i=2;i<100;i++)
{
if(a[i]!=0) //元素不为零的元素均为素数
{
printf("%3d ",a[i]);//也可以输出i
k++;
if(k%10==0)putchar('\n');
}
}
putchar('\n');
}
⑵某数列前两项为2、3,其后每项为其前两项之积,求此数列的第10个数。
#include<stdio.h>
void main()
{
int i;
int a[8];
a[0]=2;
a[1]=3;
for(i=2;i<8;i++)a[i]=a[i-1]*a[i-2];
for(i=0;i<8;i++)printf("%d ",a[i]);
putchar('\n');
}
注:在VC下第9个数开始溢出(int和long均占用4个字节)。
⑶读入20个整数,统计非负数和个数及其和,且按从小到大的次序输出。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAX 20
void sort(int a[],int n)
{
int i,k,j,t;
for(i=0;i<n;i++) //排序
{
k=i;
for(j=i+1;j<n;j++)
if(a[k]>a[j])k=j;
if(k!=i)
{t=a[i];a[i]=a[k];a[k]=t;}
}
}
int main()
{
int a[MAX],i,j,t,n,s=0;
srand((unsigned)time( NULL));
for(i=0;i<MAX;i++) //为数组各元素赋值
{
t=rand()%10;
if(t%3==0)
a[i]=-rand()%100;
else
a[i]=rand()%100;
printf("%4d",a[i]);
if(i%10==0 && i!=0)putchar('\n');
}
putchar('\n');
n=MAX;
for(i=n-1;i>=0;i--) //删除数组中的负值元素
{
if(a[i]<0)
{
for(j=i;j<n;j++)a[j]=a[j+1];//用后面的非负元素复盖负值元素
n--; //数组元素个数减1
}
}
sort(a,n); //调用排序函数
for(i=0;i<n;i++) //计算各元素之和
{
s+=a[i];
printf("%d ",a[i]);
}
putchar('\n');
printf("No_negative_element_number=%d\n",n);
printf("Sum=%d\n",s);
return 0;
}
⑷求数列1,3,3,3,5,5,5,5,5,7,7,7,7,7,7,7,……的第40项。
注:下面程序输出该数列的前40项。
解法一(不用数组):
#include<stdio.h>
void main()
{
int i,k,n,j=0;
for(k=1,n=0;n<=40;k+=2)
{
for(i=1;i<=k;i++)
{
printf("%3d",k);
n++;j++;
if(j%10==0 && j!=0)putchar('\n');
if(n==40)break;
}
}
putchar('\n');
}
解法二(使用数组):
#include<stdio.h>
void main()
{
int i,k,n,j=0;
int a[40];
for(k=1,n=0;n<40;k+=2)
{
for(i=1;i<=k;i++)
{
a[n]=k;
printf("%3d",a[n]);
n++;j++;
if(j%10==0 && j!=0)putchar('\n');
if(n==40)break;
}
}
putchar('\n');
}
⑸一个素数依次从低位划去一位、二位、……,若所得的各数仍都是素数,则称为超级素数。例如239、23、2均为素数。求[100,9999]间的超级素数。
#include<stdio.h>
int prime(int n) //判断素数的函数
{
int p=1,i;
for(i=2;i<n-1;i++)
if(n%i==0){p=0;break;}
return p;
}
void main()
{
int i,k,n,j=0;
for(i=100;i<9999;i++)
{
if(prime(i))
{
for(k=10,n=11;n>10;k*=10) //n为1位时终止循环
{
n=i/k;
if(prime(n))
continue;
break;
}
if(prime(n)&&n!=1)
{
printf("%6d",i);
j++;
if(j%8==0 && j!=0)putchar('\n');
}
}
}
putchar('\n');
}
展开阅读全文