C语言编写的程序1

先发一些编写的C语言程序,后期再补充内容。

学习写一个main函数,然后过渡到写自定义函数,将函数功能独立,主函数减轻功能,仅保留调用功能。

程序需要在VC++6.0编译器环境运行!

下面的程序是一个模拟超市购物小票的打印程序

#include "stdio.h"

#include "stdlib.h"

#include "windows.h"

#define MAX 20

void main()

{

//变量定义区域,在下面开始定义程序中用到的各种变量

int split_num=24,split_i; //后面用,不可删除

char split_line='*'; //后面用,不可删除,可更改*为其他符号

/*

对小票用数组输出解释:

首先,我们倒着分析,先看小票的样式

序号 商品名 数量 单价 金额

======================================

1 火龙果 3.5 5.00 17.50

3 冬枣 2.0 7.00 14.00

8 白萝卜 10.0 0.50 5.00

... ... ... ... ...

======================================

总计 00.00


上面是我列出的随机购买商品的票样,也即是,假如我们库里有10样商品,但是我们不可能每次都把这些商品买了,我们只能从中间挑选需要购买的商品,那自然,打印小票的时候,也只能把你买的商品信息打出来,


没有买的商品就不能列出来。那就要提前规划好,就是像超市一样,在电脑中已经存入了商品的名称以及商品的单价,剩下的就是让客户挑选商品,然后结账时,电脑输入了商品条码以及数量后,自动会对应找到该件


商品的名称以及单价,然后计算相关费用,那谁来起到关联商品数量与商品名称以及对应单价的作用呢,这里似乎只有商品条码或者二维码了,这里需要涉及到多个表格的关联了。你们在数据库这门课需要学到。这里


就暂时用序号来起到这个作用了。那这个序号就要保证把商品数量,商品名称以及商品单价按照一个序列固定放到对应数组的位序,这是最简单的。也就是,比如位序3,单价数组的这个位序变量里正好存的就是这件


商品的单价,商品名称的这个对应位序变量里存放的正好也是这件商品的名称,自然,商品数量也必须刚好放到这个位序的变量里,这样,我们就用序号把这些量关联起来了。


那现在,你就要解决


1、第一行(序号 商品名 数量 单价 金额),这个票样头部的显示,这个简单,因为只用一次,固定不变,我们可以直接把这些当作原样要输出的就行


2、分割线也一样,也是基本不变的,也原样输出,当然也可以采用可变长度和符号的代码段完成输出功能,这都简单


3、问题是下面的随机购买商品怎么解决(首先,序号,这个简单,就是个数字编号,就相当于真正的商品条码或者二维码一样,这本来就是人为随机的,在这里,我们暂时无法用条码或者二维码,当然也是懒得像超市收银员那样,


真的就手动输入那些条码数字,所以,我们直接就用简单的数字编号就行。那商品名呢,这个就需要解决先存入的问题,那我们就需要一个二维字符数组来解决,解决了这个,后面的数量呢,数量是真正买商品的时候才会出现,


在程序中只能先暂时预留下位置,也就是定义好变量,为后面结账时输入,并为计算商品费用预备,那单价呢,这个也是需要提前就存入电脑中的,所以,也需要解决怎么存放它,然后就是每件商品的费用和总的商品的费用,


那这两个就需要用到其他量来计算了,这个量都属于中间量,不属于源头(原始量,比如,程序中直接存好的,或者是从键盘上提供的),那好,列清楚这些量的关系,下面我们解决)


4、商品单价,以前我们用一个一个的变量(或者define定义的常变量代替),现在我们需要用到数组,看下面

*/

double goods_pr[MAX]={1.2,2.3,3.1,2.5,2.8,4.2,2.15,3.05,5.5,6.1,14.3,50.2,15.8,24.6,20.3,15.3,14.0,18.6,21.5,22.5}; //定义商品单价


//可以理解了吗?


//5、下面还需要定义一个求总的费用的量,也简单

double total=0.0;


//6、商品名称怎么存储呢,看下面


char goods_name[MAX][MAX]={"火龙果","桃子","梨","苹果","猕猴桃","康师傅方便面","哇哈哈矿泉水","冰糖雪梨","辣条","榨菜","大葱","香菜","胡萝卜","大白菜","猪头肉","五香牛肉","手帕纸","旺旺雪饼","豆腐","烤红薯"};

//至于存放到电脑中是怎么放的,看我给你的数组的讲解,要理解,是为了后面要操作取商品名称用


//7、商品数量呢,那就先定义一个空数组,里面没有任何值,当然可以提供默认值,比如不影响这个单元值使用的,如对于加法来说,给0,对于乘法来说,给1,因为0加任何数都为任何数,1乘任何数都是任何数。那这个单元要存入初始值,

//这个初始值就不能是影响后面要存入的值,或者说,并没有给这个单元存入值,就提前有了一个值,这不符合实际。所以,这种情况下,就给0值,或者空值。


int goods_num[MAX]={0}; //商品数量,通过键盘输入,默认为0


//8、然后定义一些额外的量,比如这个票样,肯定要用循环结构,那就还得给循环结构考虑循环控制变量

int i; //用来表示随机购买的商品编号,用来对应寻找已经存储的商品的单价和商品名

//9、对于前面定义的数量数组,是用来接受从键盘输入的,然后要存进去,为后续其他量使用,如果不存进去,那必须考虑后面的量要能计算出来,并存放,因为,这里没有再定义一个存放小计的独立数组,本身这个小计金额就是采用

//取出对应商品的单价和商品的数量,然后相乘就可以了,所以,省去一个量的定义,但是,你要把键盘输入的数量先接收到,然后再给到对应的商品数量数组中,那谁来接收这个数量,又给到对应商品数量数组的那个位置去?这就要再


//考虑我们的应用,我们目的是要能保证所购买商品的对应关系,那这个对应关系最简单的就是,让商品数量数组和商品名称数组的下标位序自然对应,免得找来找去,所以,好了,需要再定义一个量表示从键盘接受输入的数量,因为这个


//数量每次只用一下,这件商品数量存入后,这个量其实就没用了,也就可以腾出来重新接受其他商品的数量,相当于这个量公用,可以重复使用。


int num; //表示某件商品的数量,可以重复使用

//变量定义区域结束

//业务处理区域,下面开始处理程序各种业务运算

//好了,上面假如都定义好,做好准备了,下面就模拟键盘输入商品编号和数量了,也就能让电脑自动计算其他的量了


printf("请分别输入所购买商品的编号(0-19,不要超过哦,程序不做异常检查)和数量\n");

printf("输入格式采用(商品序号 商品数量)(用空格隔开哦,然后回车再输入第二件商品,以此类推),最后再输入数字-1 -1作为结束\n");


//输入-1是需要用到无限循环,然后要外界控制退出的机制

printf("模拟超市扫描\n");

for(;1;)

{

scanf("%d %d",&i,&num);

if(i==-1) break;

goods_num[i]=num; //这里的i代表的就是商品序号,也自然是起关联各数组下标位序的作用,保证对应

}


//业务运算处理结束


//输出控制区域,下面集中处理各种输出


//注意:如果业务处理区域临时用到一些输出提示,可以不受限制


system("cls");

//下面就是处理输出了,也就是这个程序是模拟先把各个商品数量都先输进去,最后整体再打印小票,


//当然,你可以可以模拟像真正的超市那样,实时刷新显示每件商品的信息,最后结账

printf("商品编号 商品名称\t 商品单价 商品数量 商品小计\n");

printf("======================================================\n");

for(i=0;i<MAX;i++)

{

if(goods_num[i]!=0)

printf("%-9d%-16s %-8.2f%5d%13.2f\n",i,goods_name[i],goods_pr[i],goods_num[i],goods_pr[i]*goods_num[i]);

total+=(goods_pr[i]*goods_num[i]);

}

printf("======================================================\n");

printf("总计:%46.2f\n",total);


//下面固定输出版权信息

//个人根据情况不同,请修改成自己的信息

printf("\n\n");

//我是分割线

for(split_i=1;split_i<=split_num;split_i++)

printf("%c",split_line);

printf("\n");

printf(" 班级:XXXXXXX\n");

printf(" 姓名:XXXXXXX\n");

printf(" 学号:XXXXXXX\n");

printf(" 系部:信息工程系\n");

//我是分割线

for(split_i=1;split_i<=split_num;split_i++)

printf("%c",split_line);

printf("\n");

getchar();

getchar();

}

下面是改成自定义函数的形式

#include "stdio.h"

#include "stdlib.h"

#include "windows.h"

#define MAX 20

/*

好了,下面我们学习函数。

什么是函数,函数就是具有某一独立功能的程序块,如果某一项目有多个功能块,我们可以将这多个功能块,单独独立出来,而不是都集中写在一起。

比如,对于超市小票而言,要最终完成购买商品打印出小票,必须搭配 1、首先要给定商品的一些单价 货物名称等 2、还要能选择购买商品 3、最后能打印出来购买商品的小票

那,这三部分就相当于三个相对对立的功能块,各管各的功能,又相互配合完成项目的功能

那这三个功能块怎么独立体现?那就是可以变成函数的形式!

什么是函数?比如 我们现在使用的框架中,经常用的

void main( )

{

}

这就是函数,这个函数不过有些暂时是固定的写法,比如前面的void main就没有更改过,因为这里的void表示一种类型,main表示的函数名字 后面的()就是固定要求的,是放置一些量的位置的,

只是这里面我们暂时没有给出要用的量,后面的{}也是一对固定的,是用来框定一些代码的,需要把一些代码包围在一起,

这几部分就是一个函数必须有的内容

总结下

第一、void所在的位置,在这个位置,要写一个所谓的数据类型名,比如我们以前学的int char double float等,都可以用,你设计的函数,如果要用到这些,那你就改成这些吧

那void表示啥?表示的是main这个函数呢,执行完,运行后不需要返回结果,那什么是函数返回结果呢?比如,数学上正弦函数,如果我们求sin30°,那是不是已经知道,可以得到一个结果是1/2呢,那1/2就是sin函数求30度的(运算)返回结果。

如果以后,你设计的函数呢,就像我们目前大量编写的main函数一样,没有说要得到一个结果,那你也可以直接用void表示啦,当然,要是你设计的函数,像正弦函数一样,你给一个值,带进去,他就能给你一个结果(必须是能得到一个具体的值,

原则不能是多个值,),那你就要考虑你这个结果是符合哪种数据类型呢,原则上要对应,不能随便给类型的,也就是你设计要返回int(char float double)类型值,那你函数必须最后给人家得到一个int(char float double)类型的值,得不到不行。

得到了必须用return 来辅助返回。

第二、main是啥,为啥我们刚开始就必须一直写成main,其他的名字符号不行嘛,刚开始是不行的,现在要学函数了,就可以了,那你不想用main,你想用啥?想用你的名字替换main嘛,可以啦,没关系。那main是啥,main是C语言程序代码默认的

程序执行的入口函数,这就是,如果我们写下好多个功能块的函数,哪个是入口呢,从哪个开始执行呢?这就要定规矩啦,规矩就是定义main为入口函数,那我的名字main也就必须固定,main就是所有函数的老大,如果你的程序块(函数)要起名字,

那就不能用main了,只能改用其他的名字,而且不能当老大,main是老大,是主的,也叫主函数,你其他的统统叫自定义函数,可以是老二、老三、老四等,老二、老三、老四之间原则上没有先后顺序,不分先后次序的,是对等的,平等的,平行的。

所以,可认为一个大型的程序,其实就是分成主函数main和用户自定义函数两大类,当然,自定义函数可以是多个,但是main只能是一个,也就是一个C语言文件中,只能编写一个main主函数,要是再有函数,统统要变成自定义函数。

有学生还是没有学懂,还在一个C语言文件中再新建一个文件,函数还起main名字,然后程序就不能运行了,成了三头六臂,就出问题了,所以,如果你再写一个函数,再建立一个文件,那不能用main这个名字啦。切记切记。

第三、()干嘛,当然是包围东西的,包围啥?包围一些量的,那main里面并没有量出现啊,那是我们编写的这些代码不需要给main的()里放置量,什么时候要放置一些量呢,那需要就放,不需要就不放,空着吧!

第四、{}干嘛,当然也是包围东西的,包为啥?包围你写的实现函数功能的程序代码啊

好了,现在我们看下我们的小票,我们怎么把功能分开,单独做成功能独立的块呢,或者说,做成函数呢?

看下面

*/

void init_goods_buy(int goods_num[])

{

int i,num;

printf("说明:\n请分别输入所购买商品的编号(0-19,不要超过哦,程序不做异常检查)和数量\n");

printf("输入格式采用(商品序号 商品数量)\n(用空格隔开哦,然后回车再输入第二件商品,以此类推),\n最后再输入数字-1 -1作为结束\n");


printf("\n下面模拟超市扫描商品过程\n");

for(;1;)

{

scanf("%d %d",&i,&num);

if(i==-1) break;

goods_num[i]=num;

}

}

/*

上面这一段代码就是从主函数main里面独立出来了,单独写成了与原来写main的时候一摸一样的样子啦,只不过名字不一样,我另取了一个名字叫init_goods_buy,另外,有些量的位置也变了,比如

int goods_num[],我给放到init_goods_buy这个名字后面的()里面了,懂了吧!然后呢,有一些原来在main里面的代码拉出来,放到void init_goods_buy(int goods_num[])后面的{}里了,

好像要脱离你main函数了。

那再看

*/

void print_goods_bill(char goods_name[ ][MAX],double goods_pr[],int goods_num[])

{

int i;

double total=0.0;

printf("商品编号 商品名称\t 商品单价 商品数量 商品小计\n");

printf("======================================================\n");

for(i=0;i<MAX;i++)

{

if(goods_num[i]!=0)

printf("%-9d%-16s %-8.2f%5d%13.2f\n",i,goods_name[i],goods_pr[i],goods_num[i],goods_pr[i]*goods_num[i]);

total+=(goods_pr[i]*goods_num[i]);

}

printf("======================================================\n");

printf("总计:%46.2f\n",total);

}

/*

哈哈,麻烦了,不过也简单,懂了就七窍通了七窍,都通了啊。

是不是能理解格式了,就这个样子,每个地方,可能需要改改名字,不变的就固定,要加的就加上,想要加几个,根据功能设计就加几个啦,不限制的哦

看,是不是我把打印小票最后结账的代码也拉出来放独立函数中了,就不在主函数里面了。长大了,嫁人了,跑了,哈哈

其实后面还有个分割线和版权,那也让他跑了吧

那就再写一个自定义函数呗,没啥关系的,继续

*/

void print_line_copyright( )

{

//下面固定输出版权信息

//个人根据情况不同,请修改成自己的信息

int split_num=24,split_i; //后面用,不可删除

char split_line='*'; //后面用,不可删除,可更改*为其他符号


printf("\n\n");

//我是分割线

for(split_i=1;split_i<=split_num;split_i++)

printf("%c",split_line);

printf("\n");

printf(" 班级:XXXXXXX\n");

printf(" 姓名:XXXXXXX\n");

printf(" 学号:XXXXXXX\n");

printf(" 系部:信息工程系\n");

//我是分割线

for(split_i=1;split_i<=split_num;split_i++)

printf("%c",split_line);

printf("\n");

getchar();

}

/*

留给主函数的是一地鸡毛啊,自己打扫自己的战场吧

主函数就留下部分定义变量与初始化

其他的就是一些与我们定义各自功能块的自定义函数名一样的代码,只不过个别地方有些区别啦

当然,最后的效果是一样的,试试吧。

有没有感觉主函数忽然清爽了很多,不那么拥挤了,臃肿了。

*/

void main()

{

double goods_pr[MAX]={1.2,2.3,3.1,2.5,2.8,4.2,2.15,3.05,5.5,6.1,14.3,50.2,15.8,24.6,20.3,15.3,14.0,18.6,21.5,22.5};

char goods_name[MAX][MAX]={"火龙果","桃子","梨","苹果","猕猴桃","康师傅方便面","哇哈哈矿泉水","冰糖雪梨","辣条","榨菜","大葱","香菜","胡萝卜","大白菜","猪头肉","五香牛肉","手帕纸","旺旺雪饼","豆腐","烤红薯"};

int goods_num[MAX]={0};

//调用选购商品功能代码

init_goods_buy(goods_num);

//清屏吧

system("cls");

//调用打印小票结账功能代码

print_goods_bill(goods_name,goods_pr,goods_num);

//调用打印分割线和版权信息功能代码

print_line_copyright( );


getchar();

}

下面再修改,增加分页条功能

#include "stdio.h"

#include "stdlib.h"

#include "windows.h"

#define MAX 50

#define LEN 20

//购买商品,并修改商品数量数组,该数组通过传地址调用

void init_goods_buy(int goods_num[])

{

int i,num;

printf("\n\t说明:\n\t请分别输入所购买商品的编号\n\t(编号范围0-%d,不要超过哦,程序不做异常检查)\n\t和数量(实际购买量)\n",MAX-1);

printf("\t输入格式采用(商品序号 商品数量)\n\t(用空格隔开哦,然后回车再输入第二件商品,\n\t以此类推),最后再输入数字-1 -1作为结束\n");


printf("\n\t下面模拟超市扫描商品过程\n");

for(;1;)

{

printf("\t");

scanf("%d %d",&i,&num);

if(i==-1) break;

if(i>49)

{

printf("编号错误,请重新输入!\n");

continue;

}

goods_num[i]=num;

}

}

//打印商品小票(不分页)

void print_goods_bill_no(char goods_name[ ][LEN],double goods_pr[],int goods_num[])

{

int i;

double total=0.0;

printf("\n\n\t商品编号 商品名称\t 商品单价 商品数量 商品小计\n");

printf("======================================================\n");

for(i=0;i<MAX;i++)

{

if(goods_num[i]!=0)

printf("\t%-9d%-16s %-8.2f%5d%13.2f\n",i,goods_name[i],goods_pr[i],goods_num[i],goods_pr[i]*goods_num[i]);

total+=(goods_pr[i]*goods_num[i]);

}

printf("======================================================\n");

printf("\t总计:%46.2f\n",total);

}

//打印商品小票(分页)

void print_goods_bill_yes(int count,char goods_name[ ][LEN],double goods_pr[],int goods_num[])

{

int i=1,j,k=0;

int order[MAX/5];

double total=0.0;


for(j=0;j<MAX;j++)

if(goods_num[j]!=0)

if(i++%5==1)

order[k++]=j;


if(count<=5)

{

printf("\n\n\t商品编号 商品名称\t 商品单价 商品数量 商品小计\n");

printf("\t======================================================\n");

if(count==0)

printf("\n\t\t\t无购物信息!\n\n");

else

{

for(i=0;i<MAX;i++)

{

if(goods_num[i]!=0)

printf("%-9d%-16s %-8.2f%5d%13.2f\n",i,goods_name[i],goods_pr[i],goods_num[i],goods_pr[i]*goods_num[i]);

total+=(goods_pr[i]*goods_num[i]);

}

}


printf("\t======================================================\n");

printf("\t总计:%46.2f\n",total);

}

else

{

i=1;

for(;;)

{

printf("\n\n\t商品编号 商品名称\t 商品单价 商品数量 商品小计\n");

printf("\t======================================================\n");


j=0;

for(k=order[i-1];k<MAX;k++)

{

if(goods_num[k]!=0)

{

printf("\t%-9d%-16s %-8.2f%5d%13.2f\n",k,goods_name[k],goods_pr[k],goods_num[k],goods_pr[k]*goods_num[k]);

if(++j==5)

break;

}

}

if((count%5==0&&i==count/5)||i==count/5+1)

{

for(j=0;j<MAX;j++)

{

if(goods_num[j]!=0)

total+=(goods_pr[j]*goods_num[j]);

}


printf("\t======================================================\n");

printf("\t总计:%46.2f\n",total);

}


printf("\n\t|< ");

if(count%5==0)

{

for(i=1;i<=count/5;i++)

printf("%d ",i);

printf(">|\n");

}

else

{

for(i=1;i<=count/5+1;i++)

printf("%d ",i);

printf(">|\n");

}


printf("\n\t请输入显示第几页商品信息(请不要超过最大页数,暂不检查异常)!");

scanf("%d",&i);

system("cls");

}

}

}

//统计购买的商品数量

int count_goods_num(int goods_num[ ])

{

int i,count=0;

for(i=0;i<MAX;i++)

{

if(goods_num[i]!=0)

++count;

}

return count;

}

void print_line_copyright( )

{

//下面固定输出版权信息

//个人根据情况不同,请修改成自己的信息

int split_num=24,split_i; //后面用,不可删除

char split_line='*'; //后面用,不可删除,可更改*为其他符号


printf("\n\n\t");

//我是分割线

for(split_i=1;split_i<=split_num;split_i++)

printf("%c",split_line);

printf("\n");

printf("\t 班级:XXXXXXX\n");

printf("\t 姓名:XXXXXXX\n");

printf("\t 学号:XXXXXXX\n");

printf("\t 系部:信息工程系\n\t");

//我是分割线

for(split_i=1;split_i<=split_num;split_i++)

printf("%c",split_line);

printf("\n");

getchar();

}

void main()

{

double goods_pr[MAX]={1.2,2.3,3.1,2.5,2.8,4.2,2.15,3.05,5.5,6.1,14.3,50.2,15.8,24.6,20.3,15.3,14.0,18.6,21.5,22.5,1.2,2.3,3.1,2.5,2.8,4.2,2.15,3.05,5.5,6.1,14.3,50.2,15.8,24.6,20.3,15.3,14.0,18.6,21.5,22.5,5.5,6.1,14.3,50.2,15.8,24.6,20.3,15.3,14.0,18.6};

char goods_name[MAX][LEN]={"火龙果","桃子","梨","苹果","猕猴桃","康师傅方便面","哇哈哈矿泉水","冰糖雪梨","辣条","榨菜","大葱","香菜","胡萝卜","大白菜","猪头肉","五香牛肉","手帕纸","旺旺雪饼","豆腐","烤红薯","商品1","商品2","商品3","商品4","商品5","商品6","商品7","商品8","商品9","商品10","商品11","商品12","商品13","商品14","商品15","商品16","商品17","商品18","商品19","商品20","商品21","商品22","商品23","商品24","商品25","商品26","商品27","商品28","商品29","商品30"};

int goods_num[MAX]={0};

int count;

//调用选购商品功能代码

init_goods_buy(goods_num);

count=count_goods_num(goods_num);

//清屏吧

system("cls");

//调用打印小票结账功能代码(不分页)

//print_goods_bill_no(goods_name,goods_pr,goods_num);

//调用打印小票结账功能代码(分页)

print_goods_bill_yes(count,goods_name,goods_pr,goods_num);

//调用打印分割线和版权信息功能代码

print_line_copyright( );


getchar();

}

举报
评论 0