实验报告_实验8 函数(1)(学号_姓名)一、实验目的:1、理解函数的功能2、熟练掌握函数的定义、声明和调用方法;二、实验内容1、(基础题)根据海伦公式由三角形的三边长度a、b、c可以计算三角形面积,公式为:,其中:。
请根据下列要求编写程序:(1)三角形面积的计算由函数triangle_area实现,函数原型为:double triangle_area(double a, double b, double c);当输入的a、b、c 值不能构成三角形时,返回0.0;(提示:构成三角形的三边条件:任意两边之和大于第三边,任意两边之差小于第三边。
)(2)主函数的功能是输入三角形的三条边长,再调用triangle_area()得到面积,最后输出结果;(3)主函数在前,triangel_area()在后面定义。
程序代码:#include <stdio.h>#include <math.h>int main(){double triangle_area(double a,double b, double c);//函数声明double x, y, z,area;printf("请输入三角形的三边长度: ");scanf("%lf%lf%lf",&x,&y,&z);area=triangle_area(x,y,z);printf("三角形的面积=%.4lf\n\n",area);return 0;}double triangle_area(double a,double b, double c)//函数定义{if ((a+b<=c)||(a+c<=b)||(b+c<=a))//不能构成三角形return 0.0;double s,p;p=(a+b+c)/2.0;s=sqrt(p*(p-a)*(p-b)*(p-c));return s;}2、(基础题)定义一个求最大公约数函数int gcd(int x, int y),在主函数输入两个整数,然后调用gcd()输出这两个整数的最大公约数。
提示:辗转相除法求最大公约数的原理:先比较两个数的大小:(1)用较大数去除较小数,得到一个余数;(2)如果余数为0,则除数(较小数)就是最大公约数,结束运算;(3)如果余数不为0,则计算除数(较小数)和余数的最大公约数即可(舍去被除数)。
转向执行(1)。
程序运行结果如下图所示:程序代码:#include <stdio.h>#include <stdlib.h>int main(){int m,n,t;int gcd(int x, int y); //声明printf("请输入2个正整数:");scanf("%d%d",&m,&n);while(m<0||n<0){printf("不能是负数,请重新输入2个正整数:");scanf("%d%d",&m,&n);}if(m<n){t=m;m=n;n=t;}printf("%d和%d的最大公约数为:%d\n",m,n,gcd(m,n));system("pause");return 0;}int gcd(int x, int y)//定义{int r;r=x%y;while(r!=0){x=y;y=r;r=x%y;}//余数为0,除数y即是最大公约数return y;}3、(基础题)定义一个将十进制数转换成十六进制数的函数void dec_to_hex(int n),该函数的功能是将参数中的十进制数以十六进制方式输出(编程思路参考第6讲课件例子)。
在主函数输入一个十进制整数,然后调用dec2hex()输出对应的十六进制数。
程序运行结果图如下:请根据题意及注释,填充程序所缺代码:(1):void dec_to_hex (int n)(2):dec_to_hex (n)(3):num[i++]=rem;(4):num[i++]=rem+55;程序代码:#include <stdio.h>#include <stdlib.h>int main(){int n,rem;void dec_to_hex (int n); // dec_to_hex函数的声明printf("Enter n: ");scanf("%d",&n);printf("\n十进制数:%d 转换为十六进制数是:",n);dec_to_hex (n); // dec_to_hex函数的调用printf("\n");system("PAUSE");return 0;}void dec_to_hex (int n){char num[20];int rem,i=0;do{rem=n%16; //存放余数n=n/16;if (rem<10)num[i++]=rem; //10以内的数字转换成对应的字符存放在字符数组num[]中elsenum[i++]=rem+55; //10以上的数字转换成对应的字符存放在字符数组num[]中}while(n>0);for(i=i-1;i>=0;i--)printf("%c",num[i]);printf("\n");}4、(提高题)编写程序,当用户从键盘输入公元年、月、日三个整数值( 年份的范围为2001--2099),能够计算该日期是这一年份的第几天,例如:当输入的数据有错误时,也能输出提示信息,并结束程序,例如:(提示:本程序主要考查多个函数的相互调用,除主函数外,可以定义如下三个函数:int is_leap_year(int year) //判断是否为闰年,如果是返回1,否则返回0 int check_pass(int year, int month, int day) //检查输入的数据是否有错误,通过返回1,否则返回0int count_days(int year,int month, int day) //统计该日期是当年中的第几天,先累加之前各月份天数(区分闰年与平年),再加上本月份的day)提示:闰年2月份是29天,非闰年2月份是28天。
请根据题意及注释,填充程序所缺代码:(1):int check_pass(int year, int month, int day) ;(2):int count_days(int year,int month, int day) ;(3):int is_leap_year(int year);(4):check_pass(year,month, day)(5):if(((year%4==0)&&(year%100!=0))||(year%400==0))return 1;elsereturn 0;(6):int monthday[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};int leapmonthday[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};int day_count=0;int i;if(is_leap_year(year))//(6)完成代码,不止一行for(i=0;i<month;i++)day_count+=leapmonthday[i];elsefor(i=0;i<month;i++)day_count+=monthday[i];day_count+=day;return day_count;程序代码1:#include <stdio.h>#include <stdlib.h>int main(){int is_leap_year(int year);//3个函数的声明int check_pass(int year, int month, int day);int count_days(int year,int month, int day);int year,month,day,days;label: printf("请输入年份:(2001--2099)");scanf("%d%d%d",&year,&month,&day);if(check_pass(year,month,day)) //判断输入的日期是否有误days=count_days(year,month,day);else{printf("输入的天数有误,程序结束!\n");goto label;}printf("%d-%d-%d是当年的第%d天",year,month,day,days);while(1);return 0;}//判断是否为闰年,如果是返回1,否则返回0int is_leap_year(int year){if(((year%4==0)&&(year%100!=0))||(year%400==0))return 1;elsereturn 0;}//检查输入的数据是否有错误,通过返回1,否则返回0int check_pass(int year, int month, int day){if(month==2){if((!is_leap_year(year))&&(day==29))return 0;}else return 1;}//统计该日期是当年中的第几天,先累加之前各月份天数(区分闰年与平年),再加上本月份的dayint count_days(int year,int month, int day){int monthday[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};int leapmonthday[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};int day_count=0;int i;if(is_leap_year(year))//(6)完成代码,不止一行for(i=0;i<month;i++)day_count+=leapmonthday[i];elsefor(i=0;i<month;i++)day_count+=monthday[i];day_count+=day;return day_count;}或者2:#include <stdio.h>int days1[]={0,31,28,31,30,31,30,31,31,30,31,30,31};//平年各月份天数,下标从1开始int days2[]={0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年各月份天数,下标从1开始int main(){int check_pass(int year, int month, int day);//函数声明int count_days(int year,int month, int day);//函数声明int year, month, day;printf("请输入年(2001-2099)、月、日:");scanf("%d%d%d",&year,&month,&day);if (!check_pass(year,month, day))return 1;printf("%d-%d-%d 是当年的第%d天。