实验十一利用数组处理批量数据
一、实验目的和要求:
1. 掌握一维数组和二维数组的定义、赋值和输入输出的方法。
2.掌握字符数组和字符串函数的使用。
二、实验内容:
1. 使用数组求Fibonacci数列的前20项。
2. 从键盘任意输入10个正整数,采用冒泡法对它们按照有小到大的顺序排列并输出。
3. 将一个数组中的值按逆序重新存放。
4. 用选择法对10个数进行排序。
5. 对一个已按升序排好的数组,要求从键盘输入一任意整型数后,按原来的排序规律将它插入到数组中。
6. 输出以下的杨辉三角形(要求输出10行):
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
……
7. 编写程序,实现两个字符串的连接,不用strcat函数。
8. 有15个数按由大到小的顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中的第几个元素的值。如果该数不存在,则输出“无此数”。
9. 编写程序,将字符数组str2中全部字符复制到字符数组str1中,不用strcopy函数,’\0’也要复制过去。
三、实验步骤与结果
1.使用数组求Fibonacci数列的前20项。
(1)设计思路
定义数组,数组的数据保存功能
(2)程序源码(加注释)
#include<stdio.h>
int main()
{
int i;
int f[20] = { 1,1 };//数组都是先定义再使用,定义好第一位数和第二位数
for (i = 2; i < 20; i++)
f[i] = f[i - 2] + f[i - 1];//求出剩下的18项的数字,并打印
for (i = 0; i < 20; i++)
{
printf("%8d", f[i]);//按格式打印20得到的20个数
}
printf("\n");
return 0;
}
|
(3)运行结果与分析
2.从键盘任意输入10个正整数,采用冒泡法对它们按照有小到大的顺序排列并输出。
(1)设计思路
利用数组的数据的存储功能,对存入的数据进行循环比较
(2)程序源码(加注释)
#include<stdio.h>
void main()
{
int a[10],t,i,j; //定义数组和数据类型
printf("请输入10个正整数:\n");
for(i=0;i<10;i++) //循环键盘得到输入的10个数存入数组
{
scanf("%d",&a[i]);
}
printf("\n");
for(j=0;j<=8;j++) //两两比较9次
{
for(i=0;i<=8-j;i++) //一个数与其他九个数不断比较,判断大小
{
if(a[i]>a[i+1])
{
t=a[i];a[i]=a[i+1];a[i+1]=t;
}
}
}
printf("这十个正整数按从小到大排序后:\n");
for(i=0;i<=9;i++) //打印结果
{
printf("%d\t",a[i]);
}
}
|
(3)运行结果与分析
3.将一个数组中的值按逆序重新存放。
(1)设计思路
利用数组和循环对存入数组的数,利用数组的内部有序存储,进行降序输出
(2)程序源码(加注释)
#include<stdio.h>
#include<math.h>
int main()
{
int a[10],i; //定义数组和数据类型
printf("请输入十个数:\n");
for(i=0;i<10;i++) //循环输入十个数并存入数组
{
scanf("%d",&a[i]);
}
printf("逆序后的排序为:\n");
for(i=9;i>0;i--) //利用for循环对存入数组的9个数进行打印输出
{
printf("%d ",a[i]);
}
printf("%d",a[0]); //打印原本第一个数
return 0;
}
|
(3)运行结果与分析
4.用选择法对10个数进行排序
(1)设计思路
利用数组比较数组存的数的大小,排序输出
(2)程序源码(加注释)
#include<stdio.h>
int main()
{
int a[10],i,j,n;
printf("输入10个数:\n");
for(i=0;i<=9;i++)
scanf("%d",&a[i]);
for(i=0;i<10;i++)
for(j=i;j<10;j++)//从第一个开始进行比较
{
if(a[i]>a[j])//选择最小的数
{
n=a[i];
a[i]=a[j];
a[j]=n;
}
}
printf("该十个数升序为: ");
for(i=0;i<10;i++)
printf("%3d",a[i]);
return 0;
}
|
(3)运行结果与分析
5.对一个已按升序排好的数组,要求从键盘输入一任意整型数后,按原来的排序规律将它插入到数组中。
(1)设计思路
利用数组里的位置替换,和数组比较插入的数的大小,再重新排序数组里的数输出
(2)程序源码(加注释)
#include <stdio.h>
int main()
{
int n[7]={22, 33, 44, 55, 66, 77, 88};
int i, j, k, num, r[8];
printf("请输入一个数: "); //输入一个数
scanf("%d", &num);
for (i=0, j=0; i<7; i++){ //判断数字位置
if (num>n[i]) //输入的数字和原本数组里面的数字逐个比较
{
r[j++]=n[i];
r[j]=num;
}
else{
for (j=i+1, k=i; j<8; r[j++]=n[i++]);
r[k]=num;
}
}
printf("插入后的排序为:\n ");
for (i=0; i<8; printf("%d ", r[i++])); //输出排序后数组
printf("\n");
return 0;
}
|
(3)运行结果与分析
6.输出以下的杨辉三角形(要求输出10行):
(1)设计思路
利用二维数组的存储特性,对行列的循环运算
(2)程序源码(加注释)
#include<stdio.h>
int main()
{
int i,j,a[10][10];
for(i=0;i<10;i++)
{
a[i][0]=1;
a[i][i]=1;
if(i>0)
{
for(j=1;j<i;j++)
{
a[i][j]=a[i-1][j-1]+a[i-1][j];
if(i==j)
break;
}
}
}
for(i=0;i<10;i++)
{for(j=0;j<i+1;j++)
{printf("%d\t",a[i][j]);
}
printf("\n");
}
return 0;
}
|
(3)运行结果与分析
7.编写程序,实现两个字符串的连接,不用strcat函数。
(1)设计思路
利用数组的连接
(2)程序源码(加注释)
#include<stdio.h>
int main()
{
char c1[80],c2[80]; //定义足够长的数组
int i,j;
printf("请输入第一个字符串:");
gets(c1); //接受第一个字符串
printf("请输入第二个字符串:");
gets(c2); //接受第二个字符串
for(i=0;c1[i]!='\0';i++) //
{
}
for(j=0;c2[j]!='\0';i++,j++)
{
c1[i]=c2[j]; //把数组C2中的数据存入到C1中
}
printf("两个字符串连接后:");
puts(c1); //打印c1连接好的字符串
return 0;
}
|
(3)运行结果与分析
8. 有15个数按由大到小的顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中的第几个元素的值。如果该数不存在,则输出“无此数”。
(1)设计思路
利用数组,进行不断的去中间值,主要是注意最大最小的值的选择
(2)程序源码(加注释)
#include <stdio.h>
int main()
{
int a[15] = {99, 88, 97, 86, 77, 75, 66, 68, 55, 43, 33, 31, 22, 25, 16}; //定义数组元素
int x, low, high, mid, n;
n = 15; //最多15个数
low = 0;
high = n - 1;
printf("请输入一个数:\n");
scanf("%d", &x);
while (low <= high)
{
mid = (low + high) / 2; //最大最小折半
if (x > a[mid]) //折半对应的值 与输入的值进行对比
high = mid - 1; //折半的中间值-1为最大的位置
else if (x < a[mid])
low = mid + 1; //折半的中间值+1为最小的位置
else if (x == a[mid]){
printf("%d is 第%d 位数字!\n", x, mid+1);
break;
}
}
if (x != a[mid])
printf("无此数\n");
return 0;
}
|
(3)运行结果与分析
9.编写程序,将字符数组str2中全部字符复制到字符数组str1中,不用strcopy函数,’ 0’也要复制过去。
(1)设计思路
strlen函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符'\0',利用strlen函数对连个数组里的字符串进行连接
(2)程序源码(加注释)
#include <stdio.h>
#include <string.h>
int main()
{
int i, j, gllost;
char s1[20]={"你真的要加油呀!"}; // 第一个数组
char s2[]={"刘磊!"}; //第二个数组
puts(s1);
gllost=strlen(s2);
for (i=0, j=0; i<20 || j<gllost; i++, j++)
s1[i]=s2[j]; //第二个数组连接到第一个数组去
puts(s1);
return 0;
}
|
(4)运行结果与分析
四、实验总结与心得
总结:
学习的时候一定要自己理解,巧妙记忆。
审题是关键,对题意理解了,借助自己所学的知识,进行合理设计,然后整理程序。
心得:
不断利用基础的结构设计
利用自己知道的题型逐步设计程序
自己一定要记住一些模型,才能更快的编辑程序。