C语言课程设计_第1页
C语言课程设计_第2页
C语言课程设计_第3页
C语言课程设计_第4页
C语言课程设计_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C语言程序设计课程设计1 基础题1.1 题目编写一个程序,求3×4数组的转置矩阵。要求在main函数里读数,在change函数里把矩阵转置。1.2 题目分析首先确定变量类型,必须定义一个N×M的二维数组来接收转置后的矩阵的各个元素,又为了使转置后的矩阵能在主函数中输出,选择了定义全局的二维数组。该程序在主函数中定义了一个二维数组用来输入数据,此时再执行change函数,将即该数组的首行的首地址作为实参传递给定义好的change函数的行指针变量(*p)4,使用行指针和两个嵌套的for循环来实现行列下标互换来完成矩阵转置,此时流程跳回到主函数中,主函数再输出转置矩阵。1.3 流

2、程图主函数的流程图如图1和如图2。调用函数change函数的流程图如图3。图1 基本题目主函数流程图图2 基本题目主函数流程图 图3 基本题目调用函数流程图1.4 源程序#include<stdio.h>#define M 3#define N 4int bNM;void change(int(*p)N) /*定义一个无返回值类型的change函数,其中形参为指向整型的含有4个元素的一位数组(行指针)*/int i,j; /*定义局部变量i,j,这两个变量的作用域,仅在change函数中有效,其与主函数中的i,j不矛盾*/for(i=0;i<M;i+) /for循环完成矩阵转

3、置for(j=0;j<N;j+)bji=pij; void main()int i,j,arrayMN; printf("Please input 12 integral numbers: n");for(i=0;i<M;i+) for(j=0;j<N;j+)scanf("%d",&arrayij); printf("The original array :n"); for(i=0;i<M;i+)for(j=0;j<N;j+)printf("%5d",arrayij); /*为

4、了保证数组中各个元素输出到屏幕上时数字无粘黏情况,按整数部分至少占5列输出*/printf("n");change(array); /*调用change函数,将二维数组的首行的地址作为实参传递给调用函数中的行指针*/printf("The changed array :n"); /输出转置后的矩阵for(i=0;i<N;i+)for(j=0;j<M;j+)printf("%5d",bij);printf("n");1.5 程序运行结果 上述程序的运行结果如图4所示。 图4 基本题目运行结果从图4可以看出

5、,输入12个整数,输出一个3×4的矩阵,并输出其转置后的矩阵。2 改错题2.1 题目#include <stdio.h>#include <conio.h>main() int i,j; int sum,k=0; for(i=0;i<5;i+);   printf("input a number:");   scanf("%d",k);   sum+=k;  printf(&q

6、uot;the sum is %d",sum);2.2 错误分析#include <stdio.h>#include <conio.h> /*这是将Console Input/Output(控制台输入/输出)的头文件包含在本源程序文件中,使该程序可以使用此头文件中的所有已定义好的函数,但是此程序不需要使用此头文件中的函数,则可以将其删除*/main() /该程序无返回值,将主函数定义为无返回值类型较好 int i,j; /*局部变量j在主函数体中没用使用,占用了动态存储区中的内存,建议不定义j变量,使本程序在空间上占用内存低*/int sum,k=0

7、; /*局部变量sum没有在操作之前对其进行初始化,其中存放值为随机数,不能实现预定的程序功能,应在定义时对sum立即赋值为0,或者先定义sum,再将其赋值为0。其中局部变量k可以不用赋予初值,因为局部变量k在程序的for循环中由键盘输入其值*/for(i=0;i<5;i+); /*for循环的末尾不能加上分号,否则不能完成预定的程序功能,应删除()末尾的分号*/ printf("input a number:"); scanf("%d",k); /*scanf函数的标准格式为scanf(“格式控制字符串”,地址表列);地址表列中给出各个

8、变量的地址,地址的表示应为地址运算符“&”&加上变量名,则k前应该加上地址运算符“&” */ sum+=k;  printf("the sum is %d",sum); /优化程序,在%d后加上换号符n2.3 流程图改错题流程图如图5所示。图5 改错题流程图2.4 改正后程序#include <stdio.h>void main()int i;int sum=0,k;for(i=0;i<5;i+) printf("input a number:"); scanf("%d",

9、&k); sum+=k;printf("the sum is %dn",sum);2.5 程序运行结果上述程序的运行结果如图6所示。图6 改错题目运行结果从图6可以看出,输入5个整数,输出它们的累加和。3 综合题3.1 题目一、问题描述:该游戏可以由程序随机产生或由用户输入四个0到9之间的数字,且不重复。玩游戏者通过游戏提示输入八次来匹配上面所输入的数字。A表示位置正确且数字正确,B表示数字正确而位置不正确。二、功能要求:1. 本游戏显示这样的菜单:(1) 随机产生数据(2) 用户输入数据(3) 退出游戏2. 游戏成功与否都能返回主菜单三、算法提示:1. 数据结构:

10、数组2. 用简单的程序设计方法四、测试数据:测试数据:3792第一次输入:12340A2B第二次输入:56780A1B第三次输入:08670A1B第四次输入:97861A1B第五次输入:17940A2B第六次输入:27932A2B第七次输入:37924A0B游戏成功!五、其它:对该系统有兴趣的同学可以在实现系统基本功能后,完善系统的其它功能,如:破记录功能,若你所匹配的次数小于纪录保持者,则为破纪录。3.2 设计思路本程序运用模块化思想,使用了10个源程序文件,12个函数来完成猜数字游戏。力争做到各个模块之间的“高内聚,低耦合,完备性,独立性”。main()函数主函数能调用基本函数,做到输出主

11、菜单(开始游戏、查看帮助菜单、查看游戏用户记录、清除游戏用户记录和退出游戏),并且为了保证游戏成功与否都能返回主菜单,在主函数中运用int k=1;while(k)保证一直执行循环体,除非选择退出游戏,运用exit(0)函数退出游戏。Menu_display1()主菜单函数,Menu_display2()游戏模式选择菜单函数和Printf_Help()帮助菜单函数,作用是用来输出提示性信息,函数中用美化程序的一些语句符号来美化程序,给用户留下好印象。Randnum随机数产生函数的作用是利用srand()函数、time.h头文件中的time()函数和rand()函数来产生各个不同的0-9的随机数

12、存放在数组中。Input_number自定义函数(人工输入数据函数)的作用是要求用户输入自定义数据,并调用Judge()函数来判断用户输入的数据是否满足都是数字且各不相同。Handle()函数的作用是要求用户有8次机会猜数字。在其运行初,调用system(“cls”);用来清除该语句前输出的所有内容。在刚开始要求用户猜数字时,调用time.h头文件中的clock()函数,其用来记录用户开始猜数字时的时刻,在用户猜数字的过程中,运用while()循环并调用Judge()函数来判断用户输入的数据是否满足要求,在猜数字游戏结束时刻,调用clock()函数来记录用户游戏结束时刻,并调用Compare(

13、)函数来比较用户此时所用次数、时间与当前最高分的大小关系,若用户的综合分数高于此时的最高纪录,则问用户是否保存纪录,若保存,则调用Store()函数,不保存或猜数字未成功时,则返回主菜单。用户记录初始化函数Record_Initialization(),分数比较函数Compare(),输出用户当前最高分函数Printf_record()和存储最高分函数Store()都是运用文件的知识,均定义了文件类型指针变量运用fopen()函数和fclose()函数分别来建立文件的信息区、文件缓冲器和撤销文件的信息区、文件缓冲器,运用文件的二进制读写方式向文件读入读出信息来完成所预定功能。本游戏程序中运用到

14、了time.h头文件中的两种时间函数time()函数和clock()函数分别用来做随机数函数的种子和获取程序运行开始到此时的时刻。运用到了conio.h头文件中的getch()函数来获得回车符,以防止回车符被输送到内存中干扰而导致程序功能出错。程序运用到颜色函数system(“color F1”);来美化程序。3.3 流程图综合题流程图如图7所示。图7 综合题主函数流程图Record_Initialization()函数流程图如图8所示。图8 Record_Initialization()函数流程图Printf_record()函数流程图如图9所示。图9 Printf_record()函数流程

15、图Compare()函数流程图如图10所示。Handle()函数流程图如图11.1和11.2所示。Store()函数流程图如图12所示。图10 Compare()函数流程图图11.1 Handle()函数流程图图11.2 Handle()函数流程图图12 Store()函数流程图3.4 源程序(见附录)3.5 程序运行结果猜数字游戏主菜单如图13所示。图13 猜数字游戏主菜单猜数字游戏帮助菜单如图14所示。图14 猜数字游戏帮助菜单猜数字游戏模式选择菜单如图15所示。图15 猜数字游戏模式选择菜单猜数字游戏随机模式如图16.1和16.2所示。图16.1 猜数字游戏随机模式图16.2 猜数字游戏

16、随机模式。猜数字游戏自定义模式如图17.1,17.2,17.3和17.4。图17.1 猜数字游戏自定义模式图17.2 猜数字游戏自定义模式图17.3 猜数字游戏自定义模式图17.4 猜数字游戏自定义模式猜数字游戏破纪录输出用户信息如图18所示。图18 猜数字游戏破纪录输出用户信息猜数字游戏查询最高分记录如图19所示。图19 猜数字游戏查询最高分记录猜数字游戏清除最高分记录如图20所示。图20 猜数字游戏清除最高分记录猜数字游戏退出游戏如图21所示。图21 猜数字游戏退出游戏4 总结程序中遇到的主要问题:各个模块在调用函数之间产生了未预想到的运行结果。解决方案:在运行的过程中观察程序是如何调用函

17、数来判断程序的源代码不恰当的地方,再进行修改。一般地,在程序中运用开关变量flag来判断程序是否跳出主函数中的while()循环来完善预想的程序功能。对设计和编码调试过程的经验:要多多进行思考,为什么程序在运行过程中不是完成了预想要的结果,是什么样子的源代码才可能才生这样的情况,再比对自己的源代码看看是否是出现了这种情况,再思考什么样子的源代码能实现预想功能再进行改进。在程序的运行过程中,while()循环一定要注意每次循环时某些变量是否要初始化。比如在Handle()函数中的计数变量a,b在每次重新运行循环体时都要进行初始化值为0。改进设想:力争完美的做到程序的设计思想“高内聚,低耦合”,再

18、使用一些窗口函数和颜色函数来创造开始、暂停、结束窗口和颜色的更一步美化。在存储用户记录,实现排名系统,来进一步完善程序。附录:综合题源程序1.main.c文件#include<stdio.h>#include<stdlib.h> /本源程序文件中使用到system("cls")和exit()函数#include<conio.h> /本源程序文件中使用到getch()函数#define N 4 /宏代换,指定用字符常量N代表数值常量4,N是4的宏名typedef struct User_information char name20; /记

19、录用户名字double score; /记录用户分数double time; /记录用户所用时间URIN;void main()void Menu_display1(); void Menu_display2(char*,int*);void Printf_Help();void Handle(char*,int*,URIN*);void Record_Initialization(URIN*);void Printf_record();char numN;int choice,m_flag=1,k=1;URIN user2=" ",0,6e5," ",

20、0,6e5;Record_Initialization(&user0); system("color F1"); /颜色函数,F表示亮白色背景,1表示蓝色前景while(k) /*由于要求程游戏成功与否都能返回主菜单,while循环必须放在此位置,而且括号内为真*/while(m_flag) /控制流程每次在执行一个模块后能返回主菜单system("cls"); /清屏Menu_display1(); scanf("%d",&choice);fflush(stdin); /清除标准输入流(缓冲区)switch(choi

21、ce)case 1:Menu_display2(num,&m_flag);break;case 2:Printf_Help();break;case 3:Printf_record();break;case 4:Record_Initialization(&user0);break;case 0:system("cls");printf("Thanks for using it!n");printf("You can send an e-mail with your precious suggestionsn");pr

22、intf("to n");exit(0); /正常退出,关闭所有文件,终止正在执行的程序default:printf("Error choice.nPlease press any key to return to the main menu.n");getch();Handle(num,&m_flag,&user1);2. Menu display.c#include<stdio.h>#include<stdlib.h> /本源程序文件中使用到system("cls")函数void Menu_

23、display1() /输出主菜单system("cls");printf("3t3t3t3t3t3t3t3n");printf("3ttttttt3n");printf("3tWelcome To The Game Of Guessing The Numberst3n");printf("3ttttttt3n");printf("3t1. to star the gametttt3n");printf("3t2. to view the helptttt3n&qu

24、ot;);printf("3t3. to view the recordtttt3n");printf("3t4. to clear the recordtttt3n");printf("3t0. to exit the gametttt3n");printf("3ttttttt3n");printf("3t3t3t3t3t3t3t3n");printf("Please input your choice : n");3. Menu displaycm.c#include&l

25、t;stdio.h>#include<stdlib.h> void Menu_display2(char*num,int*p_m_flag)void Randnum(char*,int*);void Input_number(char*,int*);int rechoice,flag=1;system("cls");printf("3t3t3t3t3t3t3n");printf("3tttttt3n");printf("3t1. The random patternttt3n");printf(&

26、quot;3t2. The user-defined patterntt3n");printf("3t3. To return to the main menu.n");printf("3tttttt3n");printf("3t3t3t3t3t3t3n");printf("Please chioce the model:n");while(flag)scanf("%d",&rechoice);fflush(stdin);switch(rechoice)case 1:flag=

27、0;Randnum(num,p_m_flag);break;case 2:flag=0;Input_number(num,p_m_flag);break;case 3:flag=0;*p_m_flag=1;break;default:flag=1;printf("Eorror choice.nPlease choice again.n");4.Help.c#include<stdio.h>#include<stdlib.h> /*本源程序文件中使用到清屏函数system("cls"),cls时clearscreen的缩写*/#in

28、clude<conio.h> /本源程序文件中使用到getch()函数void Printf_Help() /输出帮助菜单 system("cls"); /清楚屏幕printf("4t4t4t4t4t4t4t4t4t4t");printf("4ttttttttt4n");printf("4tThe game can be generated by a program or by the player tot4n");printf("4tenter the four numbers betwee

29、n 0 to 9,not repeating.tt4n");printf("4tPlays need to match the numbers to compare the initial numberst4n");printf("4tabove game prompts for eight times. tttt4n");printf("4tA suggests are composed right numbers and position,tt4n");printf("4tB represents number

30、s are composed right numbers, wrong position.4n");printf("4tFor exmaple:ttttttt4n");printf("4tThe initial numbers are 3792.ttttt4n");printf("4tPlease input the first numbers: 1234tttt4n");printf("4ttt0A2Btttttt4n");printf("4tPlease input the second n

31、umbers: 9786tttt4n");printf("4ttt1A1Btttttt4n");printf("4tPlease input the third numbers: 3792tttt4n");printf("4ttt4A0Btttttt4n");printf("4tYou Win!ttttttt4n");printf("4ttttttttt4n");printf("4t4t4t4t4t4t4t4t4t4t");fflush(stdin); /*清空输入

32、缓冲区,通常是为了确保不影响后面的数据读取,其中stdin为standard input的缩写。例如在读完一个字符串后紧接着又要读取一个字符,此时应该先执行fflush(stdin);*/printf("Please press any key to return the main menu.n");getch(); /*从控制台读取一个字符,但不显示在屏幕上,用getch()会等待你按下任意键,再继续执行下面的语句。所在头文件:conio.h.函数原型:int getch(void),返回值:读取的字符*/5.File.c#include<stdio.h>#i

33、nclude<conio.h>#define SUM 8typedef struct User_information /*声明结构体类型,并用typedef为该结构体类型声明新类型名URIN*/char name20; /记录用户名字double score; /记录用户分数double time; /记录用户所用时间URIN;void Record_Initialization(URIN*p_user) /游戏记录初始化FILE *fp;fp=fopen("storescores.dat","wb"); /*为了输出数据,打开一个二进制文

34、件(只写方式)*/fwrite(p_user,sizeof(URIN),1,fp); /*fwrite(buffer,size,count,fp);用二进制方式向文件写一组数据*/fclose(fp); /*撤销文件信息区和文件缓冲区,使文件指针变量不再指向storescores.dat文件*/ int Compare(int*count,double*duration) /比较游戏所用猜数字的次数和时间来判断是否破纪录FILE*fp;URIN t;double score=(SUM-*count)*10+(300-*duration)*0.1;fp=fopen("storescor

35、es.dat","rb"); /*fopen()函数的返回值的文件storescores.dat信息区的起始地址*/fread(&t,sizeof(URIN),1,fp); /*fread(buffer,size,count,fp);用二进制方式从文件中读一组数据*/if(score>t.score)return 1; /判断本次游戏是否打破记录if(score=t.score&&*duration<t.time)return 1;if(score<t.score)return 0;return 0;void Printf

36、_record() /输出记录FILE*fp;URIN t;if(fp=fopen("storescores.dat","rb")=NULL) /*若未成功打开文件,则fopen()函数的返回值为空地址NULL*/printf("Cannot open file.n");return; /*返回主函数,由于该函数是无返回值类型,用return;表示返回调用此函数处*/fread(&t,sizeof(URIN),1,fp);printf("Name:%stScore:%5.1ftTime:%5.1fsn",t

37、.name,t.score,t.time);printf("Press any key to return to the main menu.n");getch(); 6.Randnum generation.c#include<stdio.h>#include<stdlib.h> /*本源程序文件中使用到system("cls")函数,srand函数和rand函数*/#include<time.h> /本源程序文件中使用到time()函数#define N 4void Randnum(char*p_num,int*p

38、_m_flag) int i,j;system("cls");for(i=0;i<N;i+)srand(unsigned)time(NULL); /*srand()函数是随机数发生器的初始化函数.用当前时间作为随机数种子产生一个随机数序列。time函数返回从格林威治时间1970年1月1日0点0分0秒到现在的秒数,如果参数不是空值(NULL指针)而是&t,返回值会存到t中*/p_numi=rand()%10+'0' /产生0-9的随机数分别赋给num4的各个元素for(j=0;j<i;j+)while(p_numi=p_numj)p_num

39、i=rand()%10+'0'j=-1; /保证产生的随机数互不相同*p_m_flag=0;7.Input number.c/本源程序文件用于将用户自定义数据存入数组中#include<stdio.h>#include<stdlib.h> /本源程序文件中使用到system("cls");#include<conio.h> /本源程序文件中使用到getch();#define N 4void Input_number(char*num,int*p_m_flag) int Judge(char*);int i,n=0,fla

40、g=1;system("cls");printf("Please input four integral numbers between 0-9 which differ :n");while(flag)if(n)printf("Error data.nPlease input four integral numbers between 0-9 which differ again :n");for(i=0;i<N;i+)scanf("%c",&numi);fflush(stdin);flag=Jud

41、ge(num);if(flag)n=1;if(!flag)system("cls");printf("The computer has been received data.n");printf("Please press any key to start!.n");getch();*p_m_flag=0;8.Judge.c/本源程序文件用于判断用户输入的数据是否满足条件(均是数字,且各不相同)#include<stdio.h>#define N 4int Judge(char *p)int i,j;int flag1=1

42、,flag2=1;for(i=0;i<N;i+)if(pi>='0'&&pi<='9') flag1=0;else flag1=1;break;for(i=0;i<N;i+)for(j=i+1;j<N;j+)if(pi!=pj) flag2=0;elseflag2=1;break;if(flag2)break;return flag1|flag2;9.Handle.c#include<stdio.h>#include<stdlib.h> /为system("cls")函数提

43、供函数原型#include<conio.h> /为getch()函数提供函数原型#include<time.h>#define N 4 /宏代换,指定用字符常量N代表数值常量4,N是4的宏名#define SUM 8typedef struct User_information /*声明结构体类型struct User_information,并用typedef为其声明新类型名URIN*/char name20;double score;double time;URIN;void Handle(char*p_num,int*p_m_flag,URIN*p_user)vo

44、id Store(URIN*,int*,double*);int Compare(int*,double*);int Judge(char*);int i,j,flag,a,b,count=0;char guessN;double duration;clock_t start,end; /在time.h头文件中有typedef long clock_t;system("cls");printf("Please guess the four integeral numbers between 0-9 which differ:n");printf(&quo

45、t;Now begin to record the time your takes.n");start=clock(); /记录游戏开始时刻while(a!=4&&(count+1)<=SUM)a=b=0;flag=1;count+;while(flag)printf("This is the %dth time.You only have 8 chances in all.n",count);printf("Please input your answer here :n");for(i=0;i<N;i+)scanf("%c",&guessi);fflush(stdin);flag=Judge(guess);if(flag)printf("Error!tPlease input again.n");for(i=0;i<N;i+)for(j=0;j<N;j+)if(p_numi=guessj)if(i=j)a+;else b+;printf("%dA%dBn",a,b);end=clock(); /记录游戏结束时刻duration=(double)(end-start)/CLK_TCK; /*在time.h

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论