实验十一利用数组处理批量数据

 

一、实验目的和要求:

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)运行结果与分析

 

 

四、实验总结与心得

 

总结:

学习的时候一定要自己理解,巧妙记忆。

审题是关键,对题意理解了,借助自己所学的知识,进行合理设计,然后整理程序。

心得:

不断利用基础的结构设计

利用自己知道的题型逐步设计程序

自己一定要记住一些模型,才能更快的编辑程序。