第七章实验报告

C程序设计实验报告

实验练习:

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

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

  7.3.2.1、输出指定行数的杨辉三角

  7.3.2.2、给定某年某月某日,将其装换成这一年的第几天并输出

  7.3.3.、编写程序,判断某一字符串是不是“回文数”,回文数是从左至右或者从右至左读起来都是一样的字符串

姓名:钟俊敏    实验地点:教学楼514教室     实验时间:5月29日

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

● 定义一个一维整型数组,其大小为10,即它能存放10个数据
● 使用循环语句,利用随机函数产生10个整数存放在数组中。
● 编写排序函数sort1()
●使用循环语句,将排好序的10个数依次输出
●将数组定义为全局数组或局部数组
●在主函数中,用随机函数生成10个元素放入数组中
●将sort(1)函数部分放入主函数中

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

● 定义一个一维整型数组,其大小为10,即它能存放10个数据
● 使用循环语句,利用随机函数产生10个整数存放在数组中。
● 编写排序函数sort1()
●使用循环语句,将排好序的10个数依次输出
●将数组定义为全局数组或局部数组
●在主函数中,用随机函数生成10个元素放入数组中
●将sort(1)函数部分放入主函数中

7.3.2.1、输出指定行数的杨辉三角

● 怎样定义和使用二维数组
●怎样用循环进行二维数组中值的计算
●使用循环依次输出二维数组中的元素(注意换行)
●用if语句根据条件判断某个字符是否是大写字母

7.3.2.2、给定某年某月某日,将其装换成这一年的第几天并输出

● 使用scanf()函数输入年、月、日
●使用一个二维数组存放闰年和非闰年的每个月的天数
●使用逻辑表达式判断某年是否是闰年
●使用变量day对前几个月的天数进行累加
●在强化练习中,学生将练习不使用二维数组存放每个月的天数
●使用if语句对年、月、日的正确性进行验证
●将存放每个月的天数的二维数组说明为局部数组

7.3.3、编写程序,判断某一字符串是不是“回文数”,回文数是从左至右或者从右至左读起来都是一样的字符串

● 用scanf()函数,从键盘输入一个字符串存入字符数组中
●求出该字符串的长度
●用for循环依次比较,循环的终值为长度的一半
●设置一个标志符ch,初值为‘Y’,若某字符对不相等,将其设置为‘N’
●根据ch是‘Y’还是‘N’,输出该字符串是否是回文数
●强化练习中不使用strlen()求出字符串的长度
●将求回文数的部分独立出来,编成一个函数

二、实验内容

1、实验练习(7.3.1.1):

1.问题的简单描述:

编写程序,利用随机函数产生10个随机数,按升序排列输出。

2.流程图如下:

 

3.实验代码:

#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;
    for(i=0;i<10;i++)
       printf("%d  ",a[i]);
       printf("\n");
    sort1(a,10);
       printf("排序后的结果:\n");
    for(i=0;i<10;i++)
       printf("%d  ",a[i]);    
}

 

3.问题分析:

a、主要的问题:首先这个程序的最主要的问题是函数的调用问题。

      解决方法:该程序的一个核心算法就是冒泡排序法,它是通过选取两个数进行比较以及数之间换位置来进行排序,而两数之间的数值交换是引入第三变量,该算法大概就是这样。

还有就是对于参数的定义,例如形参int s[ ],当我后面在用时应该用a[ ],而不是s,否则不会对这10个数进行排列。

b、程序运行如下:

 

2、实验练习(7.3.1.2):

1.问题的简单描述:

编写函数,利用随机函数产生10个随机数,按升序排列输出.

2.程序流程图:

 

3.实验代码:

#include"stdio.h"
#include"stdlib.h"
#include"time.h"
void sort2(int s[],int n)
{
    int i,j,k;
    int temp;
    for(i=0;i<n-1;i++)
        {   
            k=i;
            for(j=i+1;j<=n-1;j++)
               {
                   if(s[j]<s[k])
                     {
                         k=j;
                         }
               }
               if(k!=i)
                         {
                    temp=s[k];
                         s[k]=s[i];
                         s[i]=temp;
                         }
        }
}
main()
{
    int i,a[10];
    srand(time(NULL));
    printf("随机产生10个整数:\n");
    for(i=0;i<10;i++)
       a[i]=rand()%100;
    for(i=0;i<10;i++)
       printf("%d  ",a[i]);
       printf("\n");
    sort2(a,10);
       printf("排序后的结果:\n");
    for(i=0;i<10;i++)
       printf("%d  ",a[i]);    
}

 

4.问题分析:

a、这个程序中的main函数和上面的那个程序中的一样,主要是它的排序方法变了,使用的是选择排序法,主要按照流程图来,并不是很难。

b、程序运行如下:

3、实验练习(7.3.2.1):

1.问题的简单描述:

编写程序,从键盘输入行数,输出指定行数的杨辉三角形。

2.流程图如下:

3.实验代码:

 

#include"stdio.h"
main()
{
    int a[50][50],i,j,n;
    printf("请输入杨辉三角的行数:");
    scanf("%d",&n);
    for(i=1;i<=n;i++)
       {
           a[i][i]=1;
           a[i][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++)
                printf("%5d",a[i][j]);
                printf("\n");
            }
            printf("\n");
    
}

3.问题分析:

a、主要的问题:怎么样将数字能够按照书上这么排列

      解决方法:该程序用了两个嵌套的for循环,其中的第一个和最后一个是输入和输出数组,而其中最核心的算就是 a[i][j]=a[i-1][j-1]+a[i-1][j],其意义就是下一项目是上面两项的和,让后在用换行就行

b、程序运行如下:

4、实验练习(7.3.2.2):

1.问题的简单描述:

编写程序,从键盘分别输入年,月,日。计算出该天是这年中的第几天。

2.程序流程图:

 

3.实验代码:

#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 y,int m,int d)
    {
        int i,j,s=0;
        if(y%4==0&&y%100!=0||y%400==0)
        i=1;
        else     
        i=0;
        printf("%d",i);
        for(j=1;j<m;j++)
           {
               s=s+day_tab[i][j];
           }
           s=s+d;
           return s;
    }
    main()
    {
        int y,m,d,n;
        printf("input year_month_day:\n");
        scanf("%d%d%d",&y,&m,&d);
        n=day_year(y,m,d);
        printf("是这年的第%d天\n",n);
    }

 

4.问题分析:

a、这个程序是但是问题最大的一个题目了,首先是不知道书上提示的统计函数的头部怎么编写,这个问题是通过看书上的内容自行解决,也就是最year,month,day进行整形就行,应为这几个变量都只能是整数。第二个问题就是运行的结果一直都是347天,而正确的答案是346天,这个问题是通过老师的帮助完成的,老师让我输出一下 i 的值,结果 i 的值一直都是1,而其应该是0,所以这才是错误的根源。而我这个程序的最大的问题就是搞清楚if中的判断条件,不应该用i,而是用year,通过year来判断 i 的取值。

b、程序运行如下:

5、实验练习(7.3.3):

1.问题的简单描述:

编写 程序,从键盘输入一个字符串,判断其是否为回文数。

2.程序流程图:

 

 

3.实验代码:

#include"stdio.h"
#include"string.h"
#define n 40
main()
{
    char str[n],ch='y',s;
    int i;
    int len;
    printf("请输入一段字符:");
    scanf("%s",str);
    len=strlen(str);
    for(i=0;i<=len/2;i++)
    {
        if(str[i]!=str[len-i-1])
        {
            ch='n';
            break;
        } 
    }
    
        if(ch=='y')
        printf("%s是一个回文数\n",str);
        else
        printf("该字符串不是回文数");                       
}

4.问题分析:

a、这个程序最大的问题就是理解这个算法,以及我一直出错的地方,if中的判断语句。其实很多时候都是应为这种小的问题,而导致整个程序无法运行。回文数从左至右和从右至左一致,所以只需判断前一半与后一半对应数是否一致,所以无需判断所有的字符。

b、程序运行如下:

 

三、实验小结

这次实验课总共完成了5个实验,我觉得这次的几个实验都比较有难度。这是我在这次实验课上的收获:1、#include "stdio.h",这种形式用于引用用户头文件。它在包含当前文件的目录中搜索名为 stdio 的文件,而其就是一个输入和输出函数。2、选择排序法和冒泡排序法的异同点,相同点:¹都是通过n-1组排出具有n个数的顺序  ²都是通过逐个比较,调整位置。不同点:冒泡排序法是最值在其中和其他值交换。选择排序法确是假定一个最值,所以最值和其他值得交换就发生在假定最值得地方。3、rand()函数的作用是随机产生数,而其最大的缺陷就是会产生重复的随机数,在rand函数后面加上%100的意思就是100以内的随机数。4、%md指的是以宽度m输出整数,数据宽度不足m时,左补空格。杨辉三角之间的空格就可以用%5d来实现。

 

posted @ 2019-06-01 11:40  gy都敏俊  阅读(334)  评论(0编辑  收藏  举报