C程序设计实习报告
题目:组数游戏
学 院: 机电学院
专 业: 机械设计制造及自动化
姓 名:
班级学号:
指导教师:
目录
第一章:题目要求
1.1:要求
1.2:提示
第二章:需求分析
第三章:概要分析
3.1:系统结构图
3.2:软件运行开发平台
3.3:设计思想
第四章:详细设计
4.1:主函数
4.2:结构体
4.3:各功能模块函数
4.3.1:输入存储模块
4.3.2:位数变化模块
4.3.3:排序模块
4.3.4:返回原值模块
4.3.5:输出模块
第五章:测试、结果分析
5.1:程序运行
5.2:文本文件
第六章:总结
参考文献
附录
第一章 题目要求
1.1 要求:
设有n个正整数(n<=20),将它们连成一排,组成一个最大的多位数。并将输入数据添0后的数字、数位、添0个数存入到文件中。程序输入:n,程序输出:n个数连成的多位数。
1.2 提示:
设计思路:
可以将问题这样变化一下:
比如输出的是123、2、33、1006、12这样几个数字。
先找出最大数字的位数为4位,再将所有的数字变成4位数:1230、20##、3300、1006、1200
然后进行排序:3300、20##、1230、1200、1006
这样将后面加上的0去掉然后连接起来的数就是最大的多位数。即:
332123121006
第二章 需求分析
根据题目要求,由于需要输入数据添0后的数字、数位、添0个数存入到文件中,所以应提供文件的输入与输出等操作;程序中需要得到最大的多位数,要得到最大数需要进行计算数位、添加0、排序、去0等操作。
第三章 概要分析
3.1 系统结构图
根据题目要求,该系统的结构图如图(3.1)所示:
图(3.1)
3.2 程序开发运行平台
程序运行与开发平台: Microsoft Visual c++ 6.0
3.3 设计思想
根据题目要求,可以将系统分为输入存储、数位变化、排序、去0、输出五个模块,输入模块主要是完成数据的输入,并将数据存储到文件中,数位变化模块主要是将所有的数据全变成位数相同的数,便于比较,排序是重要的步骤,它完成了数字从大到小的排列,为输出做准备,去0操作是将原数值计算出来,输出模块只要将去0操作后的数据顺序输出就可得到题目要求的数值。各个模块之间比较独立,都由主函数一一调用,结构清晰。模块之间主要通过数位变化及添加0的个数相互传递信息,结构严谨。
第四章 详细设计
4.1 主函数
主函数设计要求简洁,能实现各模块功能的调用,它分为数据输入储存、位数计算、位数变化、排序、去0操作、输出操作。它的程序如下,程序流程图如图(4.1.1)所示:
main()
{
input_num();
add_zero();
sort_num();
delete_zero();
printf_num();
4.2 结构体
输入的数据个数为n,因为输入数据中,每个数据要用到的数字信息有:数字大小、数字位数、将要添加0的个数。这三个信息构成一个整体,故选择使用结构体比较合适。而输入数据中n<=20,故可以建立20个结构体ZHANG。结构体程序如下:
typedef struct
{
int num;
int digit;
int zero;
}ZHANG;
ZHANG a[20];
4.3 各功能模块函数设计
4.3.1 输入及存储模块
在结构体中,对程序的数据结构进行了分析与选择,选用结构体,并定义了结构体成员。int num;int digit;int zero;由于n为变量,为了便于其它函数的调用,因此n要在函数外定义。即 int n。输入函数中需要输入数字个数n,然后循环输入每个数字,所以根据以上分析可以得到数据输入程序为:
void input_num()
{
int i;
printf("input n:");
scanf("%d",&n);
for(i=0;i
{
printf("input the %d number:",(i+1));
scanf("%d",&(a[i].num));
}
}
算法流程图如图(4.3.1)所示
图(4.3.1)
为了方便后面计算,输入函数中还要包含计算数据的位数功能,计算数字的位数可以用累除10的方法进行计算。即:
While (b[i].num!=0)
{
r+=1;
b[i].num/=10;
}
return r;
为了便于添加0的操作,需要再输入是就先找出最大的数,即数位最长的数。防止函数过于复杂,计算数位的功能可以包含在下述函数中,即:
int getdigit(int a)
{
int r=0;
for(;a!=0;)
{
r+=1;
a/=10;
}
return r;
}
算法如图(4.3.2)所示 :
图(4.3.2)
在结构体成员digit中记录输入数据的位数可以通过以下语句实现。即:
a[i].digit= getdigit(a[i].num);
if(a[i].num>max.num)
max=a[i];
输入模块中还要求将输入的数字、添0个数、数位保存到文本zhangqy.txt中。所以可以在输入数据后调用一个load函数将这些数据保存到文件中。load函数程序如下:
void load()
{
FILE *fp;
int i;
if ((fp=fopen("zhangqy.txt","r"))==NULL)
{
printf("\nCannot open this file\n");
return;
}
for (i=0;i
{
fscanf(fp,"%d%d%d",&a[i].num,a[i].digit,
a[i].zero);
}
fclose(fp);
}
其算法流程图如图(4.3.3)所示
图(4.3.3)
综上所述,输入及保存模块的完整程序如下:
void input_num()
{
int i;
printf("input n:");
scanf("%d",&n);
for(i=0;i
{
printf("input the %d number:",(i+1));
scanf("%d",&(a[i].num));
a[i].digit= getdigit(a[i].num);
if(a[i].num>max.num)
max=a[i];
save();
}
}
输入及存储模块的算法流程图如图(4.3.4)所示:
图(4.3.4)
4.3.2 添0操作(位数变化模块)
要实现位数的变化,只需要在数据后添加0即可,添加0即数据乘以10,欲达到最大位数,就要每个数据乘以若干个10,模块一中已经计算出了每个数字的位数,且最大位数也知道。所以要实现位数变化即简单了很多。即:
while(a[i].digit
{
a[i].num*=10;
a[i].digit+=1;
}
由于在程序后面还涉及到去0操作,所以必须要在结构体中记录下添加了多少个0。即zero的值。即:a[i].zero+=1;
题目要求将添加0后的数字、数位、添加0的个数存入到文件中,所以可 以在添加0后调用一个save函数完成此功能。save函数的程序如下,它的算法流程图如图(4.3.5)所示:
void save()
{
FILE *fp;
int i;
if((fp=fopen("zhangqy.txt","w"))==NULL)
{
printf("\n Can not open file\n");
return;
}
for(i=0;i
fprintf(fp,"数字:%d 数位:%d 添0个数:%d\n",a[i].num,a[i].digit,a[i].zero);
fclose(fp);
}
综上所述,模块二的程序如下:
void add_zero()
{
int i;
load();
for(i=0;i
{
while(a[i].digit
{
a[i].num*=10;
a[i].digit+=1;
a[i].zero+=1;
}
}
for(i=0;i
printf("数字:%d数位:%d添0个数:%d\n",a[i].num,a[i].digit,a[i].zero);
save();
}
图(4.3.5)
模块二的算法流程图如图(4.3.6)所示:
图(4.3.6)
4.3.3 排序模块
将扩大的数字进行排序时,选用选择排序法,即在n个数中找到最大的一个数使它与a[0]互换位置,然后从剩下的n-1个数中,再找到一个最大数使它与a[1]互换位置,依次类推,直到剩下最后一个数为止。在比较时通常需要设一个数据,将值进行传递,达到交换的目的。故模块三的程序如下,算法流程图(4.3.7)所示:
图(4.3.7)
printf("顺序为:");
for(i=0;i
printf("%d",a[i].num);
printf("\n");
}
4.3.4 返回原值模块(去0操作)
此操作的目的是将所有乘以10若干次的数值返回原值,这就需要用到结构体中记录的乘以10的次数,也就是zero的值,可以将现在的数字累除以10,相应的zero的值也减去1,同时将zero的值与0进行比较,如果大于0则继续除,如果小于或等于0则程序运行停止。程序如下:
void delete_zero()
int i;
for (i=0;i
while(a[i].zero>0)
{
a[i].num/=10;
a[i].digit-=1;
a[i].zero-=1;
}
for(i=0;i
printf("数字:%d数位:%d添0个数:%d\n",a[i].num,a[i].digit,a[i].zero);
}
去0模块的算法流程图如图(4.3.8)所示:
图(4.3.8)
4.3.5 输出模块(输出最大数字)
将模块四中返回的原值连续输出就是最大数值,程序如下:
void printf_num()
{
int i;
printf("最大数:");
for(i=0;i
printf("%d",a[i].num);
printf("\n");
}
第五章 运行结果分析
5.1 程序运行
程序运行结果如图(5.1.1)所示:
图(5.1.1)
5.2 文本文件
文本文件的存储如图(5.2.1)所示:
图(5.2.1)
第六章 总结
学习心得体会:
在短短一周的实习期间使我获取了不少新知识也巩固了许多老知识。取得了不少成果。通过认真编写程序和实习报告,描述实习操作和心得体会,总结在这次实习中的业务收获,作出自我评价。我们基本掌握并学会C语言程序设计的各个知识点。掌握结构体和指针的联合使用,学会文件的读入与输出等操作方法,认真编写实习日志和实习体会。并通过各种途径查找所需资料,拓宽视野,培养自学能力。
一周的实习,我体会到了老师和同学们的热心帮助,无论面对学习中多大的困难,同学们都会帮助你,老师也会帮助你,大家就像兄弟姐妹一样。我们不会的地方就去问学习比较好一些的同学,或者去问老师,老师和同学们总是那么的热心,只要你还不明白,不论你问多少次,老师和同学们都会耐心地给你细心的讲解,直到讲会为止。
在计算机机房里同学们积极的对C语言进行巩固与实习,老师热心的讲解同学们提出的问题和实习过程中应该注意的事项。在我们实习结束后每一个同学都把自己组里的成果展示给老师和大家,告诉大家编程的原理、方法等,使同学们既有动手能力,又能提高语言表达能力。这次实习是有益的,它不仅让我们学习到了C语言的知识,更让我们学习到了同学们之间的那种团结精神,为我以后踏入社会工作准备了很多良好的知识与经验。
通过这几节课,我们集思广益,多练习,多思考。进行检查错误的时候认真仔细,不放过每一个小的环节。这也告诉我们不管做什么事情都要认认真真,这样才能把事情做到最好。
参考文献
[1]:作者:谭浩强 书名:C语言程序设计 清华大学出版社出版 20##年7月第3版;
[2]:作者:张冬梅 刘远兴 陈晶 王媛妮 书名:C语言课程设计与学习指导 中国铁道出版社出版 20##年7月第1版
[3]:书名:全国计算机等级考试——公共基础知识 高等教育出版社出版 20##年5月第1版
附录(系统源程序)
程序如下:
#include "stdio.h"
typedef struct /*定义结构体类型*/
{
int num;
int digit;
int zero;
}ZHANG;
ZHANG a[20];
void load();
void save();
int n;
ZHANG max;
int getdigit(int a) /*计算各个数字的位数,并返回r值*/
{
int r=0;
for(;a!=0;)
{
r+=1;
a/=10;
}
return r;
}
void load() /*加载,将函数中计算的数据加载到磁盘*/
{
FILE *fp;
int i;
if ((fp=fopen("zhangqy.txt","r"))==NULL)
{
printf("\nCannot open this file\n");
return;
}
for (i=0;i
{
fscanf(fp,"%d%d%d",&a[i].num,a[i].digit,
a[i].zero);
}
fclose(fp);
}
void save() /*将输入的数据保存到文件中*/
{
FILE *fp;
int i;
if((fp=fopen("zhangqy.txt","w"))==NULL)
{
printf("\n Can not open file\n");
return;
}
for(i=0;i
fprintf(fp,"数字:%d 数位:%d 添0个数:%d \n",a[i].num,a[i].digit,
a[i].zero);
fclose(fp);
}
void input_num() /*数据输入及找出输入数据中的最大值并将数据保存到文件*/
{
int i;
printf("input n:");
scanf("%d",&n);
for(i=0;i
{
printf("input the %d number:",(i+1));
scanf("%d",&(a[i].num));
a[i].digit= getdigit(a[i].num);
if(a[i].num>max.num)
max=a[i];
save();
}
}
void add_zero() /*添加0操作,并用zero在结构体中记录下各个数字添加0的次数并将改变后的数据
保存到文件中*/
{
int i;
load();
for(i=0;i
{
while(a[i].digit
{
a[i].num*=10;
a[i].digit+=1;
a[i].zero+=1;
}
}
for(i=0;i
printf("数字:%d数位:%d添0个数:%d\n",a[i].num,a[i].digit,a[i].zero);
save();
}
void sort_num() /*数字排序,用选择排序法对添0后的数字排序并输出*/
{
int i,j,k;
ZHANG t;
for(i=0;i
{
k=i;
for(j=i+1;j
if(a[j].num>a[k].num)
k=j;
t=a[i];
a[i]=a[k];
a[k]=t;
}
printf("顺序为:");
for(i=0;i
printf("%d",a[i].num);
printf("\n");
}
void delete_zero() /*去0操作,将zero的值与0比较,变回原输入数据*/
{
int i;
for (i=0;i
while(a[i].zero>0)
{
a[i].num/=10;
a[i].digit-=1;
a[i].zero-=1;
}
for(i=0;i
printf("数字:%d数位:%d添0个数:%d\n",a[i].num,a[i].digit,a[i].zero);
}
void printf_num() /*输出数据*/
{
int i;
printf("最大数:");
for(i=0;i
printf("%d",a[i].num);
printf("\n");
}
main() /*主函数,由主函数调用各个函数*/
{
input_num();
add_zero();
sort_num();
delete_zero();
printf_num();
}