北京联合大学 信息学院
“程序设计基础”课程
调研(研究)报告
题 目: 函数
姓名(学号):
专 业: 计算机科学与技术
编制时间: 20##-6-3 。
版 本:
指导教师:
北京联合大学-信息学院编制
函数实验(程序)设计报告
20##年6月3日
班号: 姓名: 学号:
第一章. 实验情况概述
本次实验主要做了判断素数和用一个函数来实现将一行字符串中最长的单词输出、写一函数能输入一个十六进制数后输出相应的十进制数以及用递归法将一个整数转换成字符串实验,主要实践了函数的定义、声明、调用及运用返回值等的内容,验证了函数的递归调用和嵌套调用。理解了函数用来完成特定功能的便捷性,并初步了解并掌握了模块化程序设计思路。
第二章. 实验记录
1.写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的信息。
素数定义:除了1和它本身外,不能被任何数整除且大于2的整数。
#include<stdio.h>
int main()
{
void fun(int n); //函数声明
int n;
printf(" input a number which is larger than 2 :\n ");
scanf("%d",&n);
fun(n); //调用函数
return 0; /*若主函数为int型用getchar()也可以,若为void则只能
用getchar,或什么都不用;此处可以将return注释掉*/
}
void fun(int n) //定义被调用函数
{
int i,j;
for(i=2,j=2;i<n;i++) //i做除数,j用来计数。
{
if(n%i!=0)
j++;
else
break;
}
if(j<n)
printf(" %d不是素数!\n",n);
else
printf(" %d是素数!\n",n);
}
2.写一函数,输入一个十六进制数,输出相应的十进制数。
#include<stdio.h>
int fun(void) //定义无参被调函数fun的类型、名称
{
int n; //定义int型变量n
printf(" Please input a hex number :"); //打印提示信息
scanf("%x",&n); //从键盘上读入数据,%x表示该数以16进制形式输入
printf("\n Its decimal number is : %d\n",n); //打印所需的结果,即十进制数输出
return 0;
}
int main() //主调函数
{
int fun(void); //声明无参被调函数的fun类型、名称
fun(); //调用函数fun
return 0;
}
3.用递归法将一个整数转换成字符串。
#include <stdio.h>
void main()
{
void exchange(int n); //声明转换函数exchange
int n;
printf("input a integer number:\n ");
scanf("%d",&n);
printf("its string is:\n ");
if(n<0) //如果输入的是负数
{
putchar('-'); //输出负号“-”
n=-n; //将此负数转化为正数处理
}
exchange(n); //调用转换函数,该函数包括了整数的转换和转换成的字符串的输出
printf("\n");
}
void exchange(int m) //定义转换函数,其中m为形参。
{
int i;
if((i=m/10)!=0)
{exchange(i);} /* 因为i和10都是整数,所以i=m/10的结果不会是浮点型,只能是整
型;根据该编译系统“向零取整”的规则,如果等于0,说明m就只有一位数;
若不为0,则说明m是一个多位数,递归调用继续处理i,使m 除去个位的数字 */
printf("%c ",m%10+'0'); /* m%10是取余运算,结果为0~9之间的整数,即整数n的最
后一位数。字符'0'~'9'的ASCⅡ代码依次比字符'0'的代码大0~9,
m%10+'0'表示所要输出的该数的ASCⅡ代码,这样才能使打印
出的是字符'0'~'9'中的某个字符而不是整数0~9中的某个整数。*/
}
4.用一个函数来实现将一行字符串中最长的单词输出。此行字符串从主函数传递给该函数。
#include<stdio.h>
#include<string.h>
/*以下6行,函数fun,判断是否为字母*/
int fun(char c)
{
if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
return(1);
else
return(0);
}
/*以下30行,函数longest,计算最长单词的起始位置。*/
int longest(char string[]) //变量为字符型数组
{
int i,flag,len=0,length=strlen(string),place,point; /*flag表示单词是否开始,flag=0表示未
开始,flag=1表示单词开始; len表示单词已累计的字
母个数;length表示先前单词中最长单词的长度; point
表示当前单词的起始位置;place表示最长单词的起始位置*/
for(i=0;i<=strlen(string);i++)
{
if(fun(string[i])) /*判断是否为字母*/
{
if(flag) /*是,开始*/
{
flag=0;
point=i;
}
else
len++; /*进入计算,+1*/
}
else /*不是,比较已统计*/
{
flag=1;
if(len>=length)
{
length=len;
place=point;
len=0;
}
}
}
return(place);
}
/*以下14行,主函数,调用longest计算最长单词的起始位置,并输出*/
void main()
{
char line[1000];
int i,n=0;
printf("please input one line:\n");
gets(line);
printf("The longest word is :");
for(i=longest(line);fun(line[i]);i++)
{
printf("%c",line[i]);
n++;
}
printf("\nIts length is %d.\n",n);
}
实验程序调试的步骤:根据该题目相应的要求,通过主动思考、查资料、与人交流等方式构思算法,在草稿纸上编写出简单的流程图,再将具体的程序在电脑上敲出来,不断的更正并改进,得出比较完善的程序。
遇到的问题:如图所示,调试程序时无错误,但运行完后,求得的是最长单词及其长度不是预期的,而是输入的第一个单词。
问题的解决方法:根据检查结果,出现上述问题的原因是第二个函数longest 内部for循环的控制条件及for内部的if()else()选择结构有重大缺陷,解决办法主要是在赋初始值时,将flag变为flag=1,将length=strlen(string)改为length=0,if选择结构里面就不至于混乱,这样就可以解决上述问题了。
第三章.系统的评测
测试方案:该程序是用一个函数来实现将一行字符串中最长的单词输出,且此行字符串从主函数传递给该函数。这样,我们不妨输入几组容易辨别的单词组,再夹杂一些数字或符号的混合组,查看是否与预期结果相符。
测试用例:(1)abc abcd(2)abcd abc(3)3a2bc @#$abc
根据测试的结果进行分析和修改:
部分运行结果如下:
有结果可知,经过改进后,运行结果完全符合要求,达到了预期目的。
第四章.程序清单
#include<stdio.h>
#include<string.h>
/*以下是函数letter,判断是否为字母*/
int letter(char c) //定义函数letter
{
if((c>='a'&&c<='z')||(c>='A'&&c<='Z')) //判断由主调函数传来的line[i]是否在a~b或A~Z之间
return(1); //是,则返回真值1给主调函数
else
return(0); //否,则返回假值0给主调函数
}
/*以下是函数longest,计算最长单词的起始地址。*/
int longest(char string[]) //定义函数longest,变量为字符串数组
{
int letter(char c); //声明被调函数
int i,flag=1; //flag表示单词是否开始,flag=0表示未开始,flag=1表示单词开始;
int length0=0,length=0; //length0表示单词已累计的字母个数;length表示先前单词中
最长单词的长度;
int point,place; //point表示当前单词的首字母地址,即起始地址;place表示最长单
词的起始地址
for(i=0;i<=strlen(string);i++) //strlen(string)表示string[]的长度,strlen为测字符串长度函数
{
if(letter(string[i])) //判断string[i]是否为字母,string[i]代表一个字母、空格或其他符号
{
if(flag) //若是,开始处理以string[i]开头的一个单词
{
point=i; //point代表当前单词的起始位置,将该单词首字母地址赋给point
flag=0; //将i传给point后,把flag变为零,使下几步连续执行length0++
}
else
length0++; //统计除首字母外该单词的长度
}
else //若string[i]不是字母,而是空格或其他符号
{
flag=1; // 将flag变为1,当下一个字符是字母时就计数
if(length0>length) //length代表该字符串数组中的单词的最大长度,初始化赋值为0
{
length=length0; //当length0大于length时,把length0赋给length
place=point; //把该单词的首字母地址作为所求的最长单词的起始位置
length0=0; //将统计的前一个单词的长度清零,以便统计下一个单词长度
}
}
}
return(place); //将所求最长单词的初始位置返回给主调函数
}
/*以下是主调函数,调用longest计算最长单词的起始位置,并输出*/
void main()
{
int longest(char string[]); //声明被调函数
int letter(char c); //声明被调函数
char line[1000]; //定义字符串数组
int i,n;
printf("please input one line:\n");
gets(line); //将从键盘输入的数据读入数组
printf("The longest word is :");
for(i=longest(line),n=0;letter(line[i]);i++) //调用函数longest(char)、letter(char)
{ //i的初始值为longest函数的返回值place,for循环的控制条件为函数letter的返回值为真值1
printf("%c",line[i]); //逐个输出最长单词的首字母及其后面的字母
n++; //输出一个字母时n自加1
}
printf("\nIts length is %d.\n",n); //输出最长单词的字母个数
}
第五章.实验分析
1.由于改程序算法实在过于复杂,实验进展相当不顺利,但完全达到了预期的目标。
2.实验中遇到的问题主要就是在复杂程序面前,还是显得手足无措,对复杂算法的构思和编程比较吃力,但归根结底是基础还不够扎实,致使程序中的选择结构混乱不堪,使计算机难以正确执行既定程序步骤。出现问题的原因一是解决复杂算法编程的能力有所欠缺,二是基本功还不够扎实。对于程序本身,解决方法是与人交流、查资料;而对于自身,则主要是再次温故课本,查漏补缺,温故知新。以及利用这一方法解决问题的结果相当不错,最终在自身积极钻研下,搞定了源程序。
3.实验中的得是知道了自己不足和弱项,失主要是由于基础不扎实浪费了大量的时间和精力。今后要注意的问题是要勤于书本,先掌握书本知识,才能做到得心应手。。
第六章.小结
1.掌握了定义、声明及调用函数以及运用函数返回值的方法;
2.掌握了函数实参与形参的对应关系,以及“值传递”的方式;
3.掌握了函数的嵌套调用和递归调用的方法;
4.掌握了全局变量和局部变量动态变量、静态变量的概念和使用方法。
5. 再次温故了一次课本,查漏补缺,温故知新,加强了记忆,熟练掌握了基本原理和技巧。
第二篇:C语言 函数 实验报告
实验报告
一、设计思想的简单描述:
在实验4_4中,我调用了pow函数,并通过定义MySerise函数来求和,最后通过“模”的计算使每行的输出控制在五个数。在实验4_5中,我首先定义了一个长度为50的数组,然后使用for和while语句编写了求最大值、最小值、平均数和方差的函数,最后在主函数中调用它们。在实验4_6中,首先定义了一个无返回值函数使它通过循环实现输出所输入数字个数的“*”,在主函数中,再次利用循环,使程序能够按行输出所有数据的直方图表示。在实验4_7中,利用已有的fabs函数,编写了求立方根的函数CubeRoot,并且在主函数中利用for循环使程序能按照步长来求在某一区间内的所有数的立方根。
二、程序结构及流程的简单描述:
1、实验4_4:
2、实验4_5:
3、实验4_6:
4、实验4_7:
三、实验心得体会:
在这次试验中,我更加深刻的体会到了运用循环的好处,它能使繁琐复杂的问题简单化,并可使不定个数的输入得以输出运算结果。