常熟理工学院
C语言程序设计》实验指导与报告书
 
______学年 ____ 学期
业: ___________________________________________
号: ___________________________________________
名: ___________________________________________
实验地点:___________________________________________
指导教师:___________________________________________
计算机科学与工程学院
2014

实验数组程序设计(1)
71 实验目的
1.掌握一维数组的定义及初始化方法。
2.掌握用循环语句对一维数组进行处理的方法。
3.熟悉对数组元素进行处理的常规算法(如排序、插入、删除及查等)。
72 示例程序
【实验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]”将排序后的偶数组合成一个最大数。
73 阅读程序
【实验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数组中的每一位进行求反操作。
74 完善程序
【实验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.移出位置后,将要插入的数送入数组。
75 改错程序
【实验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;
}
76 自己练习
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小时内删除。