8、
a[k]=a[k-1];
a[k-1]=data;
}
else
break;
}
for(k=0;k<=8;k++)
printf("%7d",a[k]);
putchar('\n');
}
注:原程序的代码有误,其核心部分有元素交换操作,这对已按升序排列各元素的数组,在插入一个元素时是没有必要的。完整的代码如下:
#include
void main()
{
int data,k;
static int a[9]={-10,2,4,8,10,15,25,50};
printf("\n
9、Enter 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
10、 15 25 50
⑵从键盘输入一串英文字符(不含空格与其他字符),统计每个字符的个数,并输出字母及相应的个数。
#include
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
11、')
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')
12、
}
4.求一组成绩的平均分数以及高于平均分的成绩,设给定的成绩为90,85,92,77,80,62。
注:省略数据输入,用随机函数产生10个数,求其平均值。
#include
#include
#include
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]);
}
13、
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
#include
#include
int main()
{
int a
14、[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[
15、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(
16、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
#include
#include
int main()
{
int a[10],i,j,t,k;
srand((unsigned)time( NULL));//初始化rand()函数
for(i=0;i<
17、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++)
18、printf("%d ",a[i]);
putchar('\n');
return 0;
}
6.从键盘输入一个4×4整数矩阵,以主对角线为对称轴,将左下角元素中较大元素代替右上角对应元素,并将右上角元素(含对角线元素)输出。
注:本题与2题的操作相同。
#include
#include
#include
int main()
{
int d[4][4],i,j;
srand((unsigned)time( NULL));//初始化rand()函数
for(i=0;i<4;i++)
{
19、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;jd[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][
20、j]);//显示主对角线以上的元素
else
printf("%6c",' ');
}
putchar('\n');
return 0;
}
7.通过键盘给3×4的二维数组输入数据,然后分别按行和列输出数组元素。
#include
#include
#include
int main()
{
int d[3][4],i,j;
srand((unsigned)time( NULL));//初始化rand()函数
for(i=0;i<3;i++)
{
for(j=0;j<4
21、j++)
{
d[i][j]=rand()%100; //用随机数为数组元素赋值
printf("%6d",d[i][j]);
}
putchar('\n');
}
return 0;
}
8.编写程序,将两个字符串连接起来,不要用strcat函数。
#include
int main()
{
char a[80],b[40];
int i,j;
printf("Input a string:");
scanf("%s",a);
printf("Input a string:");
22、 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
int main()
{
char a[80];
int i,n=0;
printf("Input a string:");
scanf("%s",a);
for(i=0;a[i];i++)
{
23、if(a[i]=='a' && a[i+1]=='b')
n++;
}
printf("ab_number=%d\n",n);
return 0;
}
10.从键盘输入10个字符串,找出一最长的字符串。
#include
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)
{
w
24、hile(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
#include
#include
void risesort(int a[],int n)//升序排序
{
int i,j,k,t;
for(i=0;
25、ia[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;i26、元素
{
int i;
for(i=0;i27、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--];
28、
}
disp(c,20);
return 0;
}
实验七 数组
2.填空
⑴以下程序分别在a数组和b数组中放入an+1和bn+1个由小到大的有序数,程序把两个数组中的数按由小到大的顺序归并在c数组中。
#include
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]!=ma
29、x) || (b[j]!=max))
if(a[i]
#include
#include
int main()
{
int a[50],i;
//fo
30、r(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
#include
#include
#define S
31、IZE 12
int main()
{
int a[SIZE],i,j,t;
//for(i=0;i32、3d",a[i]);
printf("\n");
return 0;
}
⑷假设a数组中的数按由小到大的顺序存放,以下程序把a数组中相同的数删得只剩下一个,然后以每行5个数的形式输出a数组中的数,请填空。
#include
#include
#include
#define MAX 30
int main()
{
int a[MAX],i,j,k,t,n;
//for(i=0;i33、r(i=0;ia[j])k=j;
if(k!=i)
{t=a[i];a[i]=a[k];a[k]=t;}
}
for(i=0;i34、rintf("%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. 编程题。
35、⑴用筛法求2-100以内的素数。
#include
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==
36、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
void main()
{
int i;
37、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
#include
#include
#define MAX 20
void sort(int a[],int n)
{
38、
int i,k,j,t;
for(i=0;ia[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;i39、)%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;j40、 //调用排序函数
for(i=0;i
void mai
41、n()
{
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
void main()
{
int i,k,n,j=0;
int a[40];
for(k=1,n=0;n<40;k
42、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
int prime(int n) //判断素数的函数
43、{
int p=1,i;
for(i=2;i10;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');
}