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

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

 

一、实验目的和要求:

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

 

 

四、实验总结与心得

 

总结:

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

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

心得:

不断利用基础的结构设计

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

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

 

posted @ 2020-12-16 08:42  刘磊i  阅读(1109)  评论(0编辑  收藏  举报