实验十一 利用数组处理批量数据
实验十一 利用数组处理批量数据
一、实验目的和要求:
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)运行结果与分析
四、实验总结与心得
总结:
学习的时候一定要自己理解,巧妙记忆。
审题是关键,对题意理解了,借助自己所学的知识,进行合理设计,然后整理程序。
心得:
不断利用基础的结构设计
利用自己知道的题型逐步设计程序
自己一定要记住一些模型,才能更快的编辑程序。