第七章 数组实验

C语言设计实验报告

试验项目:

1、一维数组的运用

2、二维数组的应用

3、字符数组的应用

 

姓名:李小玲  实验地点:514教室  实验时间:2019.5.29

一、实验目的与要求

7.3.1一维数组的运用

实验1:写一个函数,对用随机函数产生的10个整数按从小到大的顺序排序(升序,用冒泡排序实现)

1.定义一个一维数组,其大小为10,即它能存放10个数据。

2.使用循环语句,利用随机函数产生10个随机整数存放在数组中。

3.编写排序函数sort 1()。

4.使用循环语句,将排好序的10个数依次输出。

实验2:写一个函数,对用随机函数产生的10个整数按从小到大的顺序排序(升序,用选择排序实现)

实验3:输出指定函数的杨辉三角

1.怎样定义和使用二维数组。

2.怎样用循环进行二维数组中值的计算。

3.使用循环依次输出二维数组中的元素(注意换行);

4.用if语句根据条件判断某个字符是否是大写字母。

实验4:给定某年某月某日,将其转换成这一年的第几天输出

1.使用scanf()函数输入年、月、日。

2.使用一个二维数组存放闰年和非闰年的每个月的天数。

3.使用逻辑表达式判断某年是否是闰年。

4.使用变量day对前几个月的天数进行累加。

实验5:判断某一字符串是否为回文数

1.用scanf()函数,从键盘上输入一个字符串存入字符数组中。

2.求出该字符的长度。

3.用for循环依次比较,循环的终值为长度的一半。

4.设置一个标识符ch,初值为‘Y’,若某字符对不相等,将其设置为‘N’,输出该字符串是否是回文数。

二、实验内容

实验1:写一个函数,对用随机函数产生的10个整数按从小到大的顺序排序(升序,用冒泡排序实现)

1.问题的简单描述:编写程序,利用随机函数产生的10个数,按升序排序输出。

2.实验代码,流程图,效果图:

/*ex7-1.c*/
#include "stdio.h"
#include "stdlib.h"
#include"time.h"
void sort1(int s[ ],int n)
{
    int i,j,temp;
    for(i=0;i<n-1;i++)  //*用于排序外的循环*//
  {

    for(j=9;j>=i+1;j--) //*用于排序内的循环*//
      {

    if (s[j]<s[j-1])
          {
            temp=s[j];
            s[j]=s[j-1];
             s[j-1]=temp;
            }
      }
   }
}
 main()
{
    int i,a[10];
    srand(time (NULL)); //*给出随机数*//
    printf("随机产生10个整数:\n");
    for(i=0;i<10;i++) 
         {
            a[i]=rand()%100;
            printf("%d ",a[i]);
         } 
    

    printf(" \n");
    sort1(a,i);
    printf("输出排序后的十个整数:\n");
    for(i=0;i<10;i++)
    printf("%d ",a[i]);
    
    }

3.分析:第一个实验我做了超级久,首先的话是不知道怎么产生随机数,后面看了课本上的才出来的;再就是刚开始我写的时候没有特别注意在每个for的时候,要把它的包含内容用花括号括起来,比如说:这个就是我没有用花括号把for里面的内容括起来,所以在产生整数的时候他直接输出的是空格,而不是十个数字(错误示例)后我会多注意for里面的内容要括号起来。

实验2:写一个函数,对用随机函数产生的10个整数按从小到大的顺序排序(升序,用冒泡排序实现)

1.问题的简单描述:对随机产生的10个随机整数从大到小的顺序排列。

2.实验代码,流程图,效果图:

/*ex7-2.c*/
#include "stdio.h"
#include "stdlib.h"
#include"time.h"
void sort2(int s[ ],int n)
{
    int i,j,temp;
    for(i=0;i<n-1;i++)  //*用于排序外的循环*//
  {

    for(j=9;j>=i+1;j--) //*用于排序内的循环*//
      {

    if (s[j]<s[j-1])
          {
            temp=s[j];
            s[j]=s[j-1];
             s[j-1]=temp;
            }
      }
   }
}
main()
{
    
    int i,a[10];
    srand(time (NULL));  //*给出随机数*//
    printf("随机产生10个整数:\n");
    for(i=0;i<10;i++) 
         {
            a[i]=rand()%100;
            printf("%d ",a[i]);
         } 
    
    printf("\n");
    sort2(a,10);
    printf("输出排序后的十个整数:\n");
    for(i=0;i<10;i++)
    printf("%d ",a[i]);
    
}

3.分析:这个实验跟第一个差不多一样,不同就是采用的是选择排序法,第一个的问题解决了,第二个就不会很难了。

实验3:输出指定函数的杨辉三角

1.问题的简单描述:编写程序,从键盘输入行数,输出指定函数的杨辉三角形。

2.实验代码,流程图,效果图:

/*ex7-3.c*/
#include"stdio.h"
main()
{
    int a[50][50],i,j,n;
    printf("请输入杨辉三角形行数:\n");
    scanf("%d",&n);
    for(i=1;i<=n;i++)
{     a[i][i]=1;
    a[i][1]=1;  //*第一列全为1*//
    }
    
    for(i=3;i<=n;i++)
    for(j=2;j<=i-1;j++)
        a[i][j]=a[i-1][j-1]+a[i-1][j];  //*每个数是上面两数之和*//
    
     for(i=1;i<=n;i++)
     {

       for(j=1;j<=i;j++)  //*第i行的数字个数为i个*//
    
            {
printf(
"%5d",a[i][j]);
            }
printf("\n"); 
}

}

3.分析:这个杨辉三角,重要的是看懂它的规律,它一开始就定下了每一行的数字都是1;然后每个数字等于上一行的左右两个数字之和,这个在运算过程中也有示例;最后,我还有一个问题就是为什么它i,j不能是从0 开始的,我想了i,j分别代表行列,是从一开始的,但是我试了下0 的时候,感觉又说不通,数组不是从0开始的么?(这个是从0 开始的运行结果)

实验4:给定某年某月某日,将其转换成这一年的第几天输出

1.问题的简单描述:编写程序,从键盘分别输入年、月、日,计算出该天是这年的第几天。

2.实验代码,流程图,效果图:

 /*ex7-4.c*/
 #include"stdio.h"
 int day_tab[2][13]={
 {0,31,28,31,30,31,30,31,31,30,31,30,31},
 {0,31,29,31,30,31,30,31,31,30,31,30,31}};
 int day_year(int year,int month,int day) 
 {
     int i,j,s=0;
     if(year % 4 == 0 && year %100 != 0 ||year % 400 == 0)
     i=1;
     else
     i=0;
     for(j=1;j<month;j++)
     {
         s=s+day_tab[i][j];
     }
     s=s+day;
     return s;
 }
 main()
 {
     int y,m,d;
     printf("请输入年月日:\n");
     scanf("%d%d%d",&y,&m,&d);
     printf("是这年的第%d天\n",day_year(y,m,d));
     
 }

3.分析:刚开始的时候,我不会写统计天数函数的头部,其实就是函数的定义,然后判断是否是闰年的时候,我用的是 i 判断,但是要判断的是year这个变量,所以不行;再就是注意输出时候的格式,仔细看流程图。

实验5:判断某一字符串是否为回文数

1.问题的简单描述:编写程序,从键盘输入一个字符串,判断其是否是回文数。

2.实验代码,流程图,效果图:

 /*ex7-5.c*/
 #include"stdio.h"
 #include"string.h"
 #define N 40
main()
{
    char str[N],ch='Y';
    int i;
    int len;
    printf("请输入一个字符串:");
    scanf("%s",&str);
    len=strlen(str);
    for(i=0;i<=len/2;i++)  //*比较一半的len*//
    if(str[i]!=str[len-1-i])  //第一个数与最后一个相比*//
    {
        ch='Y';
        break;
    }
    if(ch=='Y')
    printf("%s是一个回文\n",str);
    else
        printf("%s不是一个回文\n",str);
 } 

3.分析:回文数是指正读反读都一样的数字,重点就是,需要比较一半的len就可以了和怎么去比,程序是用第一个数与最后一个相比再以此类推直到len/2的时候,刚开始第一下的时候我没有看懂for循环语句的头部是什么,后面根据流程图捋捋思路,慢慢看也就懂了。

三、实验小结

    这次的五个实验,我觉得对我来说还是挺有难度的,就比如刚开始时候的冒泡排序法,我对于内外循环这两个问题就是没弄好,后面我会多注意花括号的使用,并且 在重要的地方加注释;再就是杨辉三角,我刚开始的时候没有看懂流程图里面=3,j=2这个是干什么用的,后面我查了下杨辉三角的定义,就能理解了,所以在做题之前,要看懂原理,比如说,冒泡排序法是什么意思,杨辉三角的规律和回门数的规律,不然的话,我自己光看流程提很难看懂;再就是定义,就说要输出天数的那题,我刚看到要我写统计天数函数头部的时候我就有点懵逼,一下没反应过来是要定义,所以我要多熟悉课本;当然也了解了回门数,杨辉三角等等,还是有收获的,并且我开始会注释一点重要的部分了,因为发现,就算是自己写的代码,现在拿过来看,也会一下没反应过来,所以就是注释的重要性了。

posted @ 2019-05-31 23:55  一只龟  阅读(356)  评论(0编辑  收藏  举报