• 第四次实验报告


    C程序设计实验报告
    实验项目:函数与宏定义
    姓名:许鑫琪    实验地点:  第一教学楼514    实验时间:4月30日
    一、实验目的与要求
    1、函数的定义与调用

    •  编写由三角形三边求面积的函数。
    • 编写求N阶乘的函数。 
    • 求两个整数的最大公约数。
    • 打印输出指定图形

    2、模块化程序设计

        求500以内的所有亲密数对

    二、实验内容

       6.4.1

    实验练习1:编写由三角形三边求面积的函数。

    问题描述:编写程序,从键盘输入三角形的3条边,调用三角形面积函数求出其面积,并输出结果。

    实验代码:

    #include <stdio.h>
    #include<math.h>
    float area (float a,float  b,float c)//函数的定义.// 
    {
    
      float s,p,area;
      s=(a+b+c)/2;
      p=s*(s-a)*(s-b)*(s-c);
      area=sqrt(p);
      return(area); 
    }
    main()
    {
      float x,y,z,ts;
      printf("请键盘输入三角形的三边x、y、z:
    ");
      scanf("%f%f%f",&x,&y,&z);
        
      if ((x>0)&&(y>0)&&(z>0)&&(x+y>z)&&(y+z>x)&&(x+z>y))
          {
              ts=area(x,y,z);//函数的调用// 
              printf("area=%f
    ",ts);
          }
      else printf("data error!");
    }

    运行结果:

     

    实验流程图

    问题分析:这个题一个是所有实验中最简单的,但是我却花了最长的时间,我写完了之后一直运行不出来,我便在检查代码,发现没啥问题,

    线上问同学,然后我们一直讨论,但并没有效果,就用老师说的断点试了一下,找出错误后修改了,但是由于自己输入的格式不对,还是没能

    输出正确的结果,我又重新检查了一遍,%f,%f,%f;我运行时用了空格代替结果运行不出来,卡了好久。

    实验练习2:编写求N阶乘的函数。

     

    问题描述:编写函数,求出从主函数传来的数值i的阶乘值,然后将其传回主调函数并输出。

    实验代码:

    #include<stdio.h>
    char N=5;//定义符号常量N,代表数字5// 
    long function (int i)
    {
        static int f=1;//定义局部静态变量f并赋初值为1// 
        f=f*i;//求形参i 的阶乘// 
        return f;
    }
    int main()
    {
        long product;
        int i;
        for (i=1;i<=N;i++)
        {
        product= function(i);
          printf("%d!=%1d
    ",i,product);
        }
    }

     

    运行结果:

     

    实验流程图

    问题分析:在没看流程图的情况下这一题我写的格式出了错误,看了流程图之后,想了一下便改正了。

    实验练习3:求两个整数的最大公约数。

    问题描述:编写程序,从键盘输入两个整数,调用gcd()函数求它们的最大公约数,并输出结果。

    实验代码:

    #include<stdio.h>
    int gcd(int a,int b)
    {
      int temp;
      int remainder; 
      if(a<b)
       {
              temp=a;
              a=b;
              b=temp;          
        //交换a与b的值//
        }
         remainder=a%b;
     while (remainder!=0)
       {
           a=b;
           b=remainder;
           remainder=a%b;
       }
       return b;
    }  
    main ()
    {
        int x,y;
        int fac;
        printf("please input two integers:
    ");
        scanf("%d%d",&x,&y);
        fac=gcd(x,y);
        printf("The great common divisor is:%d",fac);
    }

     

    运行结果:

     

    实验流程图

    问题分析:

    这道题也卡了比较久,一直运行不出来,然后同学说把第二个while改为if的形式,试了一下有用;

    不过之后老师讲解了,再不改变while的形式下就要在加一行remainder=a%b;

    实验练习4:打印输出指定图形。

    问题描述:输入整数n,输出高度为n的等边三角形。当n=5时的等边三角形如下:

                               *

                             ***

                            *****

                          *******

                         *********

    实验代码:

    #include<stdio.h>
    void trangle(int n)
    {
        int i,j,k;
        for (i=1;i<n;i++)
        {   
           for(j=i;j<=n;j++)
            printf(" ") ;
           for(k=1;k<=2*i-1;k++)
           printf("*");
           putchar('
    ');
        }     
    }
    main ()
    {
        int n;
        printf("please input one integers:
    ");
        scanf("%d",&n);
        printf("
    ");
        trangle(n);
    }

     

    运行结果:

    实验流程图

     

    问题分析:

    这道题比较简单,之前写的课后思考题做了很多这样的例子,这里只要换一下形式用函数定义的;

    6.4.2模块化程序设计

    实验练习1:求500以内的所有亲密数对。

    问题描述:若正整数A的所有因子(包括1但不包括自身,下同)之和为B ,而B的因子之和

    为A ,则称A和B为一对亲密数。例如,6的因子之和为1+2+3=6,因此6与6为一对亲密数(即

    自身构成一对亲密数);又如,220的因子之和为1+2+4+5+10+11+20+22+44+55+110=248,

    而248的因子之和为1+2+4+71+142=220,因此220与248是一对亲密数。

    求500以内的所有亲密数对。

    具体要求若下:

    (1)编制一个函数facsum(m),返回给定的正整数m的所有的因子(包括1但不包括本身)之和。

    (2)编制一个主函数,调用(1)中的函数facsum (),寻找并输出500以内的所有亲密数对。

    (3)输出要有文字说明。在输出每对亲密数时,要求从小到大排列并去掉重复的亲密数对。

    (4)所有函数中的循环均采用for循环。

    实验代码:

    #include<stdio.h>
    int facsum(int m)
    {
        int sum=1,f=2;
        while(f<=m/2)
        {
          if (m%f==0)
          sum=sum+f;
          f++;
        }    
        return sum;    
    }
    main ()
    {
        int m=3,n,k;
     for(;m<=500;m++)    
      {
         n=facsum(m);
         k=facsum(n);
         if(m==k&&m<=n)
         printf("%d,%d
    ",m,n);        
      }
    } 

    运行结果:

    实验流程图 

    问题分析:

    这道题根据运行的内容应该是没有问题的,但是由于没有换行导致了这样子的结果

    我开始一直没有找出问题,然后又觉得算法应该是没有问题的,就跟同学讨论了一下。


    三、实验小结

    1、“细心”真得很重要,之前一直觉得是自己敲代码太慢了,

           现在发现主要是自己太粗心了,老是犯一些低级错误,

           耗费了大量的时间。

    2、看懂流程图并把其转化为代码的形式和画流程图都是十

         分重要的,就如看懂他人和自己的想法一样,才能进行

         下一步的工作,没有思想的程序员无异于普通的打字员。

    3、对于不懂的知识点最好的方法就是多多练习,就像写输

         出图形是实验信手拈来,平常自己要多思考多练习。

    4、设断点是一个发现自己问题的捷径,同时会让你的思维

         更加的清晰,不可能每次都会有同学,有老师在身边提

         醒,这是断点无疑是最好的老师。

  • 相关阅读:
    java实现遍历树形菜单方法——service层
    Es 中一个分片一般设置多大
    Too Many Open Files的错误
    线程池队列满导致错误
    ES正在弱化type这个概念
    更新设置api
    遥控器 静音键 点播键
    Byzantine failures
    TGI指数
    墨菲定律(Murphy's Law)
  • 原文地址:https://www.cnblogs.com/Paranoid-For/p/10782421.html
Copyright © 2020-2023  润新知