常熟理工学院
《C语言程序设计》实验指导与报告书
______学年 第____ 学期
专 业: ___________________________________________
学 号: ___________________________________________
姓 名: ___________________________________________
实验地点:___________________________________________
指导教师:___________________________________________
计算机科学与工程学院
2014
实验7 数组程序设计(1)
7.1 实验目的
1.掌握一维数组的定义及初始化方法。
2.掌握用循环语句对一维数组进行处理的方法。
3.熟悉对数组元素进行处理的常规算法(如排序、插入、删除及查等)。
7.2 示例程序
【实验7.1】本程序的功能是:取出一个十进制正整数中的所有偶数数字,用这些数字构成一个最大数。
程序代码:
#include<stdio.h>
#define N 10
int main()
{ int i,j,k=0,t,d,a[N];
long n,m=0;
printf("Please enter a long integer.");
scanf("%ld",&n);
while(n>0) /* 依次取出每位数,并将偶数存入数组 */
{ t=n%10; /* 取出一位数 */
if(t%2==0) /* 判断是否偶数 */
a[k++]=t; /* 将偶数存入数组 */
n/=10; /* 为取下一位数做准备 */
}
for(i=0;i<k-1;i++) /* 对取出的偶数进行降序排序,共k-1轮 */
{ d=i; /* 记录每轮起始元素的下标 */
for(j=i+1;j<k;j++)
if(a[j]>a[d]) /* 后续元素依次与起始元素进行比较 */
d=j; /* 记录比起始元素大的元素的下标 */
if(d!=i) /* 一轮比较后判断记录的下标是否发生了变化 */
{ t=a[d];a[d]=a[i];a[i]=t;} /* 若发生了变化,则交换元素值 */
}
for(i=0;i<k;i++) /* 将排序后的偶数组合成一个最大数 */
m=m*10+a[i];
printf("max=%ld",m);
return 0;
}
说明:
1.while循环语句的作用是依次将每一位数字分离出来,判断分离的数字是否为偶数,若是偶数,将其存入数组中。
2.对取出的偶数进行降序排序,排序采用的是选择排序算法。
3.使用表达式“m=m*10+a[i]”将排序后的偶数组合成一个最大数。
7.3 阅读程序
【实验7.2】以下程序的功能是:验证在7~2000之间的所有素数中存在这样的两个素数,它们的差恰好是1898。
程序代码:
#include<stdio.h>
int main()
{ int i,j,a[1000],k=0,m,n,flag=0;
for(i=7;i<2000;i+=2)
{ for(j=2;j<=i/2;j++) /* */
if(i%j==0)break; /* */
if(j>i/2) /* */
a[k++]=i; /* */
}
for(i=0;i<k-1;i++)
for(j=1;j<k;j++)
if(a[j]-a[i]==1898) /* */
{ m=i;
n=j;
flag=1; /* */
break;
}
if(flag)
printf("%d-%d=%d",a[n],a[m],a[n]-a[m]);
else
printf("not found!");
return 0;
}
说明:
1.程序中首先出7~2000之间的所有素数,将其存入数组中。
2.采用双循环遍历素数数组元素,若两个元素的差是1898,则分别记录两个元素的下标,同时退出循环。
3.程序中的flag变量作为标志变量,其初始值为0,若到符合条件的两个元素时,将其值置为1。循环外依据标志变量flag的值给出结果。
【实验7.3】编写程序,由键盘输入一个十进制整数,输出其补码。
程序代码:
#include<stdio.h>
int main()
{ int n,k,sign,carry,bm[8];
do
{ printf("Please enter a integer(-128>=n<=127):");
scanf("%d",&n);
}while(n<-128||n>127); /* */
for(k=0;k<8;k++)
bm[k]=0; /* */
if(n>0)sign=0;
else { sign=1; n=-n; }
k=0;
do
{ bm[k++]=n%2; /* */
n/=2;
}while(n>0);
if(sign)
{ carry=1;
for(k=0;k<7;k++)
{ bm[k]=1-bm[k]+carry; /* */
if(bm[k]>1)一维数组的定义和初始化
{ bm[k]-=2;
carry=1; /* */
}
else
carry=0;
}
}
bm[k]=sign;
for(k=7;k>=0;k--)
printf("%d",bm[k]);
return 0;
}
说明:
1.bm数组用于存放补码。
2.首先使用do-while循环求出整数的二进制数,并将每一位二进制数存于bm数组,然后对bm数组中的每一位进行求反操作。
7.4 完善程序
【实验7.4】将一个整数插入到已经排好序的数组中,使该数组仍有序。
程序代码:
#include<stdio.h>
int main()
{ int i,j,t,n,a[11]={12,31,5,7,19,4,8,16,32,42};
for(i=0;i<10;i++) /* 对数组进行降序排序 */
for(j=i+1;j<=10;j++)
if(a[i]<a[j])
{ t=a[i];________;a[j]=t;}
printf("Inserted before:");
for(i=0;i<10;i++) /* 输出排序后的数组 */
printf("%3d",a[i]);
printf("\nPlease enter a number:");
________; /* 输入要插入的数 */
for(i=0;i<10;i++)
if(a[i]<n) /* 寻插入点 */
{ for(j=9;j>=i;j--)
________; /* 元素依次后移一个位置 */
break; /* 已到插入点,结束寻 */
}
a[i]=n; /* 将要插入的数送入数组 */
printf("Inserted after:");
for(i=0;i<=10;i++)
printf("%3d",a[i]);
return 0;
}
说明:
1.定义数组时,直接给数组赋值。
2.首先对数组进行降序排序。然后从第一个元素开始依次与要插入的数进行比较,寻插入点。到插入点后,将插入点开始的元素依次后移一个位置,结束寻。
3.移出位置后,将要插入的数送入数组。
7.5 改错程序
【实验7.5】本程序的功能是:输出15至100之间所有能被3整除且至少有一位数字是5的整数。请改正程序中的错误,并调试。
注意:改错时不允许增加及删除语句,只允许修改或移动语句的位置。
【含有错误的程序代码】
#include<stdio.h>
int main()
{ int i,j,n,m,k,a[100],b[5];
for(i=15;i<=100;i++)
if(i%3=0) /* 判断是否是3的倍数 */
{ i=m; /* 将判断的数赋给m */
j=0;
k=0;
do
{ b[j]=m%10; /* 分离出一位数并赋给数组 */
m/=10; /* 为分离下一位数做准备 */
if(b[j]==5) /* 判断该位数是否是5 */
k++;
j++;
}while(m<0); /* 满足条件结束循环 */
if(k>0)
a[n++]=i; /* 满足条件的数存入数组 */
}
for(i=0;i<n;i++)
printf("%4d",a[i]);
return 0;
}
7.6 自己练习
1.编写程序,将一个数组中的元素逆序存放。例如,原来顺序是12,3,11,14,21,15,25,18,22,27,逆序后为27,22,18,25,15,21,14,11,3,12。
2.编写程序,取出一个十进制正整数中的所有奇数数字,用这些数字构成一个最小数。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论