第四次实验报告

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:\n");
  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\n",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\n",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:\n");
    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('\n');
    }     
}
main ()
{
    int n;
    printf("please input one integers:\n");
    scanf("%d",&n);
    printf("\n");
    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\n",m,n);        
  }
} 

 

 

 

 

 

运行结果:

 

实验流程图 

 

问题分析:

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

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

 

 


三、实验小结

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

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

       耗费了大量的时间。

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

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

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

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

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

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

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

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

 

posted @ 2019-04-30 19:49  Avery墨念  阅读(277)  评论(0编辑  收藏  举报