第一篇:C语言socket课程设计报告[小编推荐]
第1章 概述
TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议。其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。通俗说,它是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送;而UDP则不为IP提供可靠性、流控或差错恢复功能。一般来说,TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经济的应用。TCP支持的应用协议主要有:Telnet、FTP、SMTP等;UDP支持的应用层协议主要有:NFS(网络文件系统)、SNMP(简单网络管理协议)、DNS(主域名称系统)、TFTP(通用文件传输协议)等。
面向连接的TCP
“面向连接”就是在正式通信前必须要与对方建立起连接。比如你给别人打电话,必须等线路接通了、对方拿起话筒才能相互通话。
TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,我们这里只做简单、形象的介绍,你只要做到能够理解这个过程即可。我们来看看这三次对话的简单过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。
TCP协议能为应用程序提供可靠的通信连接,使一台计算机发出的字节流无差错地发往网络上的其他计算机,对可靠性要求高的数据通信系统往往使用TCP协议传输数据。
面向非连接的UDP协议
“面向非连接”就是在正式通信前不必与对方先建立连接,不管对方状态就直接发送。这与现在风行的手机短信非常相似:你在发短信的时候,只需要输入对方手机号就OK了。
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去。
UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。比如,我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。例如,在默认状态下,一次“ping”操作发送4个数据包(如图所示)。大家可以看到,发送的数据包数量是4包,收到的也是4包(因为对方主机收到后会发回一个确认收到的数据包)。这充分说明了UDP协议是面向非连接的协议,没有建立连接的过程。正因为UDP协议没有连接的过程,所以它的通信效率高;但也正因为如此,它的可靠性不如TCP协议高。QQ就使用UDP发消息,因此有时会出现收不到消息的情况。
第2章 程序设计部分
2.1 设计目的
通过本课程设计,在学习《计算机通信与网络C》课程的基础上,进一步深入理解计算机通信与网络的基本理论及其协议,进一步熟练掌握UDP、TCP Client/Server模式的数据通信原理,熟悉进程通信的所要解决的问题,掌握网络通信的程序编程技术。
2.2 设计要求
1)Java语言支持TCP/UDP及其上层的网络设计,所设计的网络通信应用系统建议采用Java语言利用Eclipse集成开发环境编程实现。课程设计按下述步骤进行:
①利用socket编程方法,编写一个TCP、UDP Client/Server模式的通信程序。②调试并运行自己编写的实现程序。
③了解TCP、UDP Client/Server模式的工作原理,比较二者的不同,如出现异常情况,在课程设计报告中写出原因分析。
④备份保留程序代码电子文档,以备教师随时检查。
2)Client/Server网络通信程序设计内容要具体详实,具有一定的编程工作量(程序代码一般应在100行以上)和技术难度。
3)在课程设计报告中,通过截屏图给出Client/Server网络通信或手机收发电子邮件的运行结果。
4)对课程设计进行总结,写出符合规范格式要求的课程设计报告。课程设计报告撰写要求如下:
①每个学生必须独立完成课程设计报告。
②课程设计报告书写规范、文字通顺、图表清晰、数据完整、结论明确。③课程设计报告后应附参考文献。
④提供电子文档资料。例如程序源代码、设计思路、功能结构图或程序流程图等。⑤附录:给出程序源代码(可附主要部分或代表自己编程特色的代码)。
⑥课程设计报告封面按照学校统一要求格式编写,并装订成册。要求书面工整、美观;如果条件许可,最好打印装订成册。
2.3 设计原理 TCP通信流程:
UDP通信流程:
2.4 设计方案
Socket连接:
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
第3章 程序设计实现部分
3.1 C语言的网络功能与编程简介
网络编程,一定离不开套接口;那什么是套接口呢?在Linux下,所有的I/O操作都是通过读写文件描述符而产生的,文件描述符是一个和打开的文件相关联的整数,这个文件并不只包括真正存储在磁盘上的文件,还包括一个网络连接、一个命名管道、一个终端等,而套接口就是系统进程和文件描述符通信的一种方法。目前最常用的套接口是字:字节流套接口(基于TCP)和数据报套接口(基于UDP),当然还有原始套接口(原始套接口提供TCP套接口和UDP套接口所不提供的功能,如构造自己的TCP或UDP分组)等。
3.2 系统原理框图
3.3 程序设计
服务器端:
#include
return;
} if(LOBYTE(wsaData.wVersion)!= 1 ||
HIBYTE(wsaData.wVersion)!= 1){
WSACleanup();
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
char sendbuffer[100];
sprintf(sendbuffer,“Welcome %s here”,inet_ntoa(addrClient.sin_addr));
send(sockConn,我是沈郁,strlen(我是沈郁)+1,0);
char recvchar[100];
recv(sockConn,recvchar,100,0);
printf(“%sn”,recvchar);
closesocket(sockConn);
} } 客户端:
#include
int err;wVersionRequested = MAKEWORD(1, 1);err = WSAStartup(wVersionRequested, &wsaData);if(err!= 0){ return;} if(LOBYTE(wsaData.wVersion)!= 1 || HIBYTE(wsaData.wVersion)!= 1){
WSACleanup();
return;
} SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr=inet_addr(“127.19.226.97”);addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(6000);connect(sockClient,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR));char recvBuffer[100];recv(sockClient,recvBuffer,100,0);printf(“%sn”,recvBuffer);send(sockClient,“This is Kary”,strlen(“This is Kary”)+1,0);closesocket(sockClient);WSACleanup();}
3.4 调试结果 服务器:
3.5 课程设计总结
通过本次计算机网络课程设计,我更加充分的理解了课本上的知识,并能够加以扩展,从而应用于实践当中,这几天的课程设计令我受益匪浅,很多平时模棱两可的知识点都认真复习并实践了。本次课程设计是运用Visual C++6.0作为开发平台以及进行编写程序, 在此设计过程中主要经过了审题、需求分析与可行性研究,然后形成设计思路,设计所要实现的功能,最后进行程序的编写与调试,这个过程是不断出现问题并不断的进行修改,深深的感受到亲自动手实践的重要性。在实验的过程中发现学好基础理论知识的重要性,在设计过程中,不断遇到问题,通过老师和同学的帮助,解决了过程中出现的各种问题。
通过本次课程设计,我发现了自己的不足,希望在以后的学习中能够加强学习,提高实际应用能力,和解决问题的能力。
附录:
参考文献
1.(美)Andrew S.Tanenbaum 著,熊桂喜 王小虎译。计算机网络。北京:清华大学出版社,1998年7月第1版。
2.计算机网络原理与技术。刘化君 编著,高电子工业出版社,2012年6月第2版。3.计算机网络与通信。刘化君等编著,高等教育出版社,2011年6月第2版。4.C程序设计。谭浩强著,清华大学出版社,2005年7月第3版。
5.C程序设计语言。Brian W.Kernighan / Dennis M.Ritchie 著,清华大学出版社。
第二篇:c语言简单socket通信
server:
#include
#include
#pragma comment(lib,“ws2_32.lib”)
int main(int argc, char* argv[]){
//³õʼ»¯WSA
WORD sockVersion = MAKEWORD(2,2);WSADATA wsaData;if(WSAStartup(sockVersion, &wsaData)!=0){return 0;} //´´½¨Ì×½Ó×Ö SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(slisten == INVALID_SOCKET){printf(“socket error!”);return 0;} //°ó¶¨IPºÍ¶Ë¿Ú sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(8888);sin.sin_addr.S_un.S_addr = INADDR_ANY;if(bind(slisten,(LPSOCKADDR)&sin, sizeof(sin))== SOCKET_ERROR){printf(“bind error!”);} //¿ªÊ¼¼àÌý if(listen(slisten, 5)== SOCKET_ERROR){} //Ñ-»·½ÓÊÕÊý¾Ý SOCKET sClient;sockaddr_in remoteAddr;printf(“listen error!”);return 0;
char revData[255];while(true){printf(“µÈ´ýÁ¬½Ó...n”);sClient = accept(slisten,(SOCKADDR *)&remoteAddr, &nAddrlen);if(sClient == INVALID_SOCKET)
{
printf(“accept error!”);
continue;
}
printf(“½ÓÊܵ½Ò»¸öÁ¬½Ó£º%s
inet_ntoa(remoteAddr.sin_addr));
//½ÓÊÕÊý¾Ý
int ret = recv(sClient, revData, 255, 0);
if(ret > 0)
{
revData[ret] = 0x00;
printf(revData);
}
//·¢ËÍÊý¾Ý
char * sendData = ”ÄãºÃ£¬TCP¿Í»§¶Ë£¡n“;
send(sClient, sendData, strlen(sendData), 0);
closesocket(sClient);
}
closesocket(slisten);
WSACleanup();
return 0;
}
client:
#include
#include
#pragmacomment(lib,”ws2_32.lib“)
rn”,int main(int argc, char* argv[])
{
WORD sockVersion = MAKEWORD(2,2);
WSADATA data;
if(WSAStartup(sockVersion, &data)!= 0)
{
return 0;
}
SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(sclient == INVALID_SOCKET)
{
printf(“invalid socket!”);
return 0;
}
sockaddr_in serAddr;
serAddr.sin_family = AF_INET;
serAddr.sin_port = htons(8888);
serAddr.sin_addr.S_un.S_addr = inet_addr(“127.0.0.1”);
if(connect(sclient,(sockaddr *)&serAddr, sizeof(serAddr))SOCKET_ERROR)
{
printf(“connect error!”);
closesocket(sclient);
return 0;
}
char * sendData = “ÄãºÃ£¬TCP·þÎñ¶Ë£¬ÎÒÊÇ¿Í»§¶Ë!n”;
send(sclient, sendData, strlen(sendData), 0);
char recData[255];
int ret = recv(sclient, recData, 255, 0);
if(ret > 0)
{
recData[ret] = 0x00;
printf(recData);
}
closesocket(sclient);
WSACleanup();
return 0;
} ==
第三篇:C语言课程设计报告
C语言课程设计报告
Experiment Designing reporter
课程名称 : C语言课程设计
英文名称 : C Program Experiment Designing
专 业 :
学 号 :
姓 名 :
指导教师 :
日 期: 2011年7月18日 至2011年7月22日
《C语言课程设计》报告
C Program Experiment Designing
课程编号:01200308005
学时: 40学时 适用专业:软件工程专业 授课单位:软件学院
一、C语言课程设计目的及要求
目的:
根据课堂讲授内容,学生做相应的自主练习,消化课堂所讲解的内容;通过调试典型例题或习题积累调试C程序的经验;通过完成辅导教材中的编程题,逐渐培养学生的编程能力、用计算机解决实际问题的能力。
要求:
1. 熟悉Turbo C 的编程环境、主要菜单功能。
2. 通过上机验证运算符、表达式、运算规则、函数使用。3. 熟练使用C语言的典型语句编写简单程序。4. 调试典型例题或习题。5. 提高上机编程能力
二、实验类型
设计类型
三、实验学时
40学时
四、实验设备
微型计算机、WINDOWS98以上版本的操作系统、Turbo C2.0 软件一套
五、C语言课程参考教材:
1.李瑞 C语言程序基础(第二版)清华大学出版社 2.梁旭 C语言课程设计.电子工业出版社
课程设计(报告)任务书
任务及要求:
1.设计(研究)内容和要求
研究内容:C语言课程设计题目相关内容 任务和要求:
(1).学习C语言基础知识,掌握C语言编程和程序调试的基本技能。(2).对指导教师下达的题目进行系统分析。(3).根据分析结果完成系统设计。
(4).编程:在计算机上实现题目的代码实现。(5).完成对该系统的测试和调试。(6).提交课程设计报告。(7).指标: 要求完成课程设计报告3千字以上(约二、三十页).完成若干综合性程序设计题目,每个综合设计题目的语句行数的和在300行语句以上.2.原始依据
了解C语言的基础知识,有一定的语言编程基础,能够熟练运用C语言进行程序设计。通过用C语言完成的题目,提高用C语言解决实际问题的能力。3.参考文献
[1] 黄明等.C语言程序设计辅导教材.大连理工大学出版社,2006 [2] 马靖善等.C语言程序设计.清华大学出版社,2005 [3] 谭浩强.C语言程序设计(第二版).北京:高等教育出版社,2002
目录
C语言课程设计报告................................................................................错误!未定义书签。
1. 输出杨辉三角.............................................................................................................1 1.1 系统分析..............................................................................................................1 1.2 设计说明..............................................................................................................1 1.3 程序运行截图......................................................................................................2 1.4 源程序代码..........................................................................................................2 2 汉诺塔求解方法.............................................................................................................3 2.1 系统分析..............................................................................................................3 2.2 设计说明..............................................................................................................3 2.3 程序运行截图......................................................................................................4 2.4 源程序代码..........................................................................................................4 3 输出200以内的素数.....................................................................................................5 3.1功能说明...............................................................................................................5 3.2 设计说明..............................................................................................................5 3.3 程序运行截图......................................................................................................5 3.4 源程序代码..........................................................................................................6 4 进制转换计算器.............................................................................................................6 4.1功能说明...............................................................................................................6 4.2 设计说明..............................................................................................................6 4.3程序运行截图.......................................................................................................7 4.4 源程序代码..........................................................................................................7 5 一元稀疏多项式.............................................................................................................8 5.1 功能说明..............................................................................................................8 5.2 设计说明..............................................................................................................8 5.3 程序运行截图....................................................................................................10 5.4 源程序代码........................................................................................................11
1. 输出杨辉三角
1.1 系统分析
以等腰直角三角形输出杨辉三角
1.2 设计说明
1、包含头文件
#include
#include
其中,头文件
2、子函数
函数名:int num(i,j)
函数功能:以递归的方式进行计算,用函数代替二维数组
函数参数:int i;int j;
含义:相当于二维数组的a[i][j] 函数流程
Step1:输出最外行,即三角形两直角边的结果都为 1 ;
Step2:讨论其余情况,相当于数组中的
a[i][j] = a[i-1][j-1] + a[i-1][j]。
3、main()函数
1为保证结果完整输出,先进行清屏; ○2输入要打印的行数,由于一行只能显示80个字符,建议不要超过13行; ○3用循环调用函数int num(int i , int j)○
其中循环为三重循环:i 循环控制行打印
j 循环控制列打印
k 循环控制空格打印
每执行一次i 循环输出一个换行符,直角三角形定点放在第36个字符的位置上。
每个数字占6个字符的格。
1.3 程序运行截图
1.4 源程序代码
#include
int num(i,j){
int i,j;
if(I == j ||j == 0)return(1);
else return(num(i-1 , j-1)+num(i-1 , j));}
int main(void){
int n,k,i,j;
clrscr();
puts(“input row n:”);
scanf(“%d”,&n);
for(i = 0;i < n;i++)
{
{
for(k = 0;k < 36-3*i;k++)
putchar(' ');
}
{
for(j = 0;j <= i;j++)
printf(“%6d”,num(i , j));
}
puts(“");
}
getch();
return 0; } 汉诺塔求解方法
2.1 系统分析
汉诺塔求解方法
2.2 设计说明
1、包含头文件:
#include
其中,#include
2、子函数
函数名:void move(int n , char a , char b)
函数功能:打印移动的主子编号
函数参数:int n , char a , char b;
含义:n为移动的序数,a为源柱号,b目的柱号 函数流程
Step1:输出盘子移动情况;
Step2:打印换行。
函数名:void hanoi(int n,char a,char b,char c)
函数功能:以游戏规则求解移动盘子的方法
函数参数:int n,char a,char b,char c;
含义:n移动的序数,a为源柱号,b为目的柱号,c为中间柱号
函数流程
Step1:递归调用函数 hanoi(n-1,a,c,b);
Step2:调用函数move(n-1,a,b);
Step3:继续递归调用函数hanoi(n-1,c,b,a);
3、主函数main()1为了使程序可以重复运行,定义了变量ch,当ch == N 时,退出游戏; ○2使用while()循环使游戏重复运行; ○3输入盘子的数目以调整游戏的难度; ○3调用函数hanoi()○
2.3 程序运行截图
2.4 源程序代码
#include ”stdio.h“ #include ”ctype.h“
//应用函数toupper void move(int n,char a,char b)
//n为移动的序数,a为源柱号,b目的柱号*/ {
printf(”Disc%d move from %c to %c;“,(n+1),a,b);
printf(”n“);}
void hanoi(int n,char a,char b,char c){
//n移动的序数,a为源柱号,b为目的柱号,c为中间柱号
if(n>0)
{
hanoi(n-1,a,c,b);
//递归调用
move(n-1,a,b);
hanoi(n-1,c,b,a);
} } main(){
int n;
char ch ='Y';
printf(”Now let us play the game of hanoitowern“);
while(ch == 'Y')
//通用性设计
{
printf(”n Input the number of disc[2-15]:“);
scanf(”%d“,&n);getchar();
printf(”n The orders of moving %d discs from A to B are:n“,n);
hanoi(n,'A','B','C');
//调用函数
printf(”n Continue(Y/N):“);
ch=getchar();
getchar();
ch=toupper(ch);}
return 0;} 3 输出200以内的素数
3.1功能说明
输出200以内的素数
3.2 设计说明
1、宏定义
#define M 200
//范围,表示输出200以内的素数 #define N((M+1)/2)
//奇数的个数
处理流程:
Step1:第一步筛选掉所有的偶数,将剩余的奇数存放在a[N]中; Step2:第二部筛选掉多有可以被整除的数 Step3:将得到的素数10个一行打印。
3.3 程序运行截图
3.4 源程序代码
#include ”stdio.h“ #define M 200
//范围
#define N((M+1)/2)
//奇数的个数 main(){
int i,j,a[N];
a[0]=2;
for(i=1;i //初始数组实现第一步筛选 a[i]=2*i+1; for(i=1;i<(N-1);i++) //第二步筛选 if(a[i]!=0) for(j=i+1;j if((a[j]%a[i]==0)) //倍数时置零筛去 a[j]=0; printf(”n The primer are[2-%d]:n“,M); for(i=0,j=0;i //显示得到素数 { if(a[i]!=0) { printf(”%5d“,a[i]); if((++j)%10==0) //十个数换行 printf(”n“); } } return 0;} 进制转换计算器 4.1功能说明 进行进制转换。 4.2 设计说明 1、处理流程: Step1:输入原始数值xa,原始权a,已经希望转换的进制b;Step2:逐位取值,将原始数值转换成10进制 Step3:逐位取值,将原始数值转换成b 进制 4.3程序运行截图 4.4 源程序代码 void main()#include ”stdio.h“ main() { int a=0,/*原始进制*/ b=8,/*转换进制,默认为八*/ k=1; /*位权*/ long xa=0,/*原始数值*/ xb=0,/*转换数值*/ x1=0,x2=0; /*十进制数值*/ printf(”n Input the number and weight a->b:“); scanf(”%ld%d%d“,&xa,&a,&b); x1=xa; while(x1!=0) /*转换为十进制数*/ { x2+=(x1%10)*k; /*逐位取值*/ x1/=10;k*=a; } k=1; x1=x2; while(x1!=0) /*转换为b进制数*/ { xb+=(x1%b)*k;x1/=b;k*=10; } printf(”n %ld(%d)=%ld(%d)=%ld(%d)“,xa,a,x2,10,xb,b); return;} 一元稀疏多项式 5.1 功能说明 求一元稀疏多项式的运算: 1、求两多项式加法; 2、求两多项式减法; 3、求两多项式乘法; 4、求两多项式导数; 5、求两多项式在x=m处的值。 5.2 设计说明 1、链表结点的定义: typedef struct polyn { float coef; //多项式系数 int expn; //多项式指数 struct polyn * prior,* next;} polyn, *linkpolyn; 2、子函数,多项式的基本运算。函数名:linkpolyn CREATEPOLYN()函数功能:创建多项式链表,在输入的时候进行升序排列 返回值:return head,即建立的多项式头结点 参数:linkpolyn head,含义:链表头结点 处理流程: Step1:输入第一个结点,且第一个结点自然有序; Step2:循环输入其余结点,当输入0 0是表示输入结束; Step3:输入过程中进行升幂排序,用二分法,找到新结点插入点; Step4:插入新结点;继续循环,直到输入0 0,循环结束,链表建立成功。Step5:返回建立链表头结点,函数结束。 函数名:linkpolyn DERIVATIONPOLYN(linkpolyn L)函数功能:多项式求导 返回值:return(head),即求导多项式的链表头结点 参数:linkpolyn L,含义:把建立好的链表A和B传递给L 处理流程: Step1:分别用指针指向L的头结点和求导多项式的头结点head; Step2:用循环逐个对L链表中的结点求导,一次存放在求导多项式中的新结点中; Step3:循环中考虑,当L链表中的结点仅存放一个常数,则跳过该结点,继续遍历下一结点; Step4:当循环结束,即L中的各项以被求导,返回求导多项式头结点head。 函数名:linkpolyn INITPOLYN()函数功能:链表初始化 返回值:return(head),即求导多项式生成的链表头结点 参数:无参数 处理流程: Step1:生成一个新的空间作为新结点; Step2:将新节点的coef域赋0,expn域赋-1,以区分其他节点; Step3:将头结点的前去指针和后即指针置空,并返回头结点。 函数名:void PRINTLIST(linkpolyn head)函数功能:以类数学表达式的形式打印 返回值:无返回值 参数:linkpolyn head,含义:处理过的链表头结点 处理流程: Step1:讨论是否链表为空,若为空,则输出0; Step2:若链表不为空,则输出第一个值,第一个值不用输出符号; Step3:用循环依次输出其余各项,附加符号输出; 函数名:linkpolyn ADDPOLYN(linkpolyn A , linkpolyn B)函数功能:加法运算 返回值:return ptr,即和多项式的头结点 参数:linkpolyn A , linkpolyn B,含义:创建的链表A和B 处理流程: Step1:分别以两个指针pa和pb遍历链表A和B; Step2:当A和B两链表都为遍历完毕时,进行加法运算,分配新的空间存放和多项式,并用二分法进行升幂排序; Step3:当A遍历完毕而B未遍历完毕,将B其余各项拷贝到 和多项式链表中; Step4:当B遍历完毕而A未遍历完毕,将A其余各项拷贝到 和多项式链表中; 函数名:linkpolyn SUBTRACTPOLYN(linkpolyn A , linkpolyn B)函数功能:计算A-B的值 返回值:return ptr,即差多项式的头结点 参数:linkpolyn A , linkpolyn B,含义:创建的链表A和B 处理流程: Step1:分别以两个指针pa和pb遍历链表A和B; Step2:当A和B两链表都为遍历完毕时,进行减法运算,分配新的空间存放和多项式,并用二分法进行升幂排序; Step3:当A遍历完毕而B未遍历完毕,将B其余各项拷贝到 和多项式链表中; Step4:当B遍历完毕而A未遍历完毕,将A其余各项拷贝到 差多项式链表中; Step5:返回多项式头结点 函数名:float WORK(float x,int e)函数功能:求x的幂 返回值:return t,即计算幂结果 参数:float x,int e,含义:x为输入的x的值,e为x的指数 处理流程: Step1:分别讨论正指数与负指数的的情况; Step2:若e>0,则累乘e次x; Step3:若e<0,则累除e次x;; Step4:将所求结果返回; 3、主函数main()Step1:依次调用函数进行运算操作; Step2:调用函数创建链表; Step3:调用函数进行运算; 5.3 程序运行截图 5.4 源程序代码 #include ”stdio.h“ #include typedef struct polyn { float coef;//多项式系数 int expn;//多项式指数 struct polyn * prior,* next;} polyn, *linkpolyn; void DESTROYPOLYN(linkpolyn head){ //销毁链表 linkpolyn s,p;p=head; while(p->next!= NULL){ s = p; p = p->next; free(s);} } //DESTROYPOLYN linkpolyn INITPOLYN(){ //链表初始化 struct polyn * head;head=(linkpolyn)malloc(sizeof(polyn));head->coef=0.0;//假设头结点系数为0 head->expn=-1;//假设头结点指数为-1 head->next=NULL;head->prior=NULL;return head;} //INITPOLYN void INSERTPOLYN(linkpolyn p,linkpolyn s){ //将结点s插入到p之后 if(NULL!= p->next){ s->next = p->next; s->next->prior = s;} s->prior = p;p->next = s; } //INSERPOLYN linkpolyn CREATEPOLYN(){ //创建多项式链表,在输入的时候进行升序排列 linkpolyn head,s,p,m,r; int num = 1;//计数器 head = INITPOLYN();//初始化链表 head r = head;//设置为指针 s=(linkpolyn)malloc(sizeof(polyn)); /******************************************/ printf(”请输入第%d项系数和指数:“,num);/**输入第一个结点,并且第一个结点自然有序**/ scanf(”%f%d“,&s->coef,&s->expn);/******************************************/ r->next = s;s->prior = r;r = r->next;//r指向尾结点 r->next = NULL;p = r;//p为s的插入点前一个结点 m = r;//m为拍完结点中间的节点,二分法排序 while(++num)//while # 当将 s->coef 与 s->expn 都赋值为0的时候,认为输入结束 { s =(linkpolyn)malloc(sizeof(polyn));printf(”请输入第%d项系数和指数:“,num);scanf(”%f%d“,&s->coef,&s->expn); if((fabs(s->coef)<= FZ)&&(s->expn == 0))//if @ { free(s); break; } //else @ else //else @ { if(s->expn <= p->expn)//if # { while(p->prior!= NULL && p->expn > s->expn) p = p->prior;//p向前遍历链表,找到插入点 if(s->expn == p->expn) { p->coef += s->coef; free(s); r=r; } else { INSERTPOLYN(p,s);//在p后面插入结点s m = m->prior; p = m; } } // if # else //else # { while(p->next!= NULL && p->next->expn < s->expn) p = p->next;//p向后遍历链表,找到插入点 if(s->expn == p->expn) { p->coef += s->coef; free(s); } else { INSERTPOLYN(p,s); if(s->expn > r->expn) { r = r->next; r->next = NULL; } } } //else # } //else @ } //while # return head;} //CREATEPOLYN void PRINTPOLYN(linkpolyn head){ //以类数学表达式的形式打印 linkpolyn p; p = head->next;if(p == NULL)//链表为空 puts(”0“);else //else @ { //链表不为空,输出第一个结点的值 if(p->expn == 0)printf(”%f“,p->coef);//指数为0时不输出x else { if(p->coef==1)printf(”x^%d“,p->expn);/**************************/ else if(p->coef ==-1)printf(”-x^%d“,p->expn);/**第一项前不需要输出符号**/ else printf(”%gx^%d“,p->coef,p->expn);/**************************/ } p = p->next;while(p!= NULL) { //依次输出以后各节点 if(p->coef>0) { //当系数为正时,讨论输出符号问题 if(p->expn == 0)printf(”+%g“,p->coef);else if(p->coef == 1)printf(”+x^%d“,p->expn);else printf(”+%gx^%d“,p->coef,p->expn); } else { //当系数为负时,讨论输出符号问题 if(p->expn == 0)printf(”%g“,p->coef);else if(p->coef ==-1)printf(”-x^%d“,p->expn);else printf(”%gx^%d“,p->coef,p->expn); } p = p->next; } } //else @ } //PRINTPOLYN linkpolyn ADDPOLYN(linkpolyn A , linkpolyn B){ //加法 linkpolyn qa,qb,q,ptr;float x;qa = A->next;qb = B->next;q = INITPOLYN();//和多项式头结点初始化 ptr = q;//ptr指向和多项式头结点 while((qa!= NULL)&&(qb!= NULL)){ //升幂求和 if(qa->expn == qb->expn)//指数相同的项 { x = qa->coef + qb->coef;//系数相加 if(x!= 0)//求得系数非0 { q->next =(linkpolyn)malloc(sizeof(polyn));// q = q->next; q->coef = x; q->expn = qa->expn; } 生成和多项式的节结点 qa = qa->next; qb = qb->next; } else //指数不同 { q->next =(linkpolyn)malloc(sizeof(polyn)); q = q->next; if(qa->expn > qb->expn)//A多项式当前指数大于B { q->coef = qb->coef;//B多项式当前的值复制到和多项式中 q->expn = qb->expn; qb = qb->next; } else //B多项式当前指数大于A { q->coef = qa->coef;//A多项式当前的值复制到和多项式中 q->expn = qa->expn; qa = qa->next; } } } //A或B中有一个多项式已经处理完毕 while(qa!= NULL)//A未处理完毕,将其余各项复制到和多项式中 { q->next =(linkpolyn)malloc(sizeof(polyn));q = q->next; q->coef = qa->coef; q->expn = qa->expn; qa = qa->next;} while(qb!= NULL)//B未处理完毕,将其余各项复制到和多项式中 { q->next =(linkpolyn)malloc(sizeof(polyn));q = q->next; q->coef = qb->coef; q->expn = qb->expn; qb = qb->next;} q->next = NULL;//令和多项式最末的节点指向头结点 return ptr;//返回多项式头指针 } //LINKPOLYN linkpolyn SUBTRACTPOLYN(linkpolyn A , linkpolyn B){ //减法 linkpolyn qa,qb,q,ptr;float x;qa = A->next;qb = B->next;q = INITPOLYN();//和多项式头结点初始化 ptr = q;//ptr指向和多项式头结点 while((qa!= NULL)&&(qb!= NULL)){ //升幂求差 if(qa->expn == qb->expn)//指数相同的项 { x = qa->coef-qb->coef;//多项式A的系数减去B的系数 if(x!= 0)//求得系数非0 { q->next =(linkpolyn)malloc(sizeof(polyn));//生成和多项式的节结点 q = q->next; q->coef = x; q->expn = qa->expn; } qa = qa->next; qb = qb->next; } else //指数不同 { q->next =(linkpolyn)malloc(sizeof(polyn)); q=q->next; if(qa->expn > qb->expn)//A多项式当前指数大于B { q->coef =-(qb->coef);//B多项式当前的值复制到和多项式中 q->expn = qb->expn; qb = qb->next; } else //B多项式当前指数大于A { q->coef = qa->coef;//A多项式当前的值复制到和多项式中 q->expn = qa->expn; qa = qa->next; } } } //A或B中有一个多项式已经处理完毕 while(qa!= NULL)//A未处理完毕,将其余各项复制到和多项式中 { q->next =(linkpolyn)malloc(sizeof(polyn));q = q->next; q->coef = qa->coef; q->expn = qa->expn; qa = qa->next;} while(qb!= NULL)//B未处理完毕,将其余各项复制到和多项式中 { q->next =(linkpolyn)malloc(sizeof(polyn));q = q->next; q->coef =-(qb->coef); q->expn = qb->expn; qb = qb->next;} q->next = NULL;//令和多项式最末的节点指向头结点 return ptr;//返回多项式头指针 } //SUBTRACTPOLYN linkpolyn MULTIPLYPOLYN(linkpolyn A,linkpolyn B){ //乘法 linkpolyn pa,pb,s,head,m,r,p;pa = A->next;pb = B->next;head = INITPOLYN();r = head; s=(linkpolyn)malloc(sizeof(polyn));s->coef = pa->coef * pb->coef;//计算第一个结点,并且第一个结点自然有序 s->expn = pa->expn + pb->expn;r->next = s;s->prior = r;r =r->next;r->next = NULL;p=r;//p为插入点前一结点 m=r;//m指向排完结点中间节点 pb=pb->next;// 第一个乘积处理完毕 for(pa= A->next;pa!= NULL;pa=pa->next)//for pa 处理其余乘积 { //用A的第一个结点分别与B的其余结点相乘 if(pa == A->next) pb = B->next->next; else pb = B->next; for(;pb!= NULL;pb = pb->next)//for pb { s =(linkpolyn)malloc(sizeof(polyn));s->coef = pa->coef * pb->coef; s->expn = pa->expn + pb->expn;if(s->expn <= p->expn)//if # { while(p->prior!=NULL && p->expn > s->expn)p=p->prior;//p向前遍历链表,找到插入点 if(s->expn==p->expn) { p->coef+=s->coef; free(s); } else { INSERTPOLYN(p,s);//在p后面插入结点s m=m->prior; p=m; } } // if # else //else # { while(p->next!=NULL && p->next->expn < s->expn) p=p->next;//p向前遍历链表,找到插入点 if(s->expn==p->expn) { p->coef+=s->coef; free(s); } else { INSERTPOLYN(p,s); if(s->expn > r->expn) { r=r->next; r->next=NULL; } } } //else # } //for pb } //for pa return head;} //MULTIPLYPOLYN linkpolyn DERIVATIONPOLYN(linkpolyn L){ //多项式求导 linkpolyn head,p,s,r;head = INITPOLYN();//head为求导多项式头结点 r = head;p = L->next;while(p!= NULL){ if(p->expn == 0) { p = p->next;continue;} s =(linkpolyn)malloc(sizeof(polyn));s->coef = p->coef * p->expn;s->expn = p->expn-1;s->prior = r; r->next = s; r = r->next; r->next = NULL; p = p->next;} return(head);} //DERIVATIONPOLYN float WORK(float x,int e){ //求x的幂 float t = 1;if(e>0){ while(e) { t *= x;e--;} } if(e<0){ while(e) { t *= 1/x;e++;} } return(t);} //WORK float CALCULATEPOLYN(linkpolyn head,float x){ //计算多项式在x处的值 float t = 0;linkpolyn p;p = head->next;while(p){ t = t +((p->coef)*(WORK(x,p->expn)));p = p->next;} return(t);} //CALCULATEPOLYN int main(void){ linkpolyn A, B,addp,decp,mulp,derp1,derp2;int i;float x;start: system(”cls“);printf(”一元稀疏多项式计算nn“);printf(”1.建立多项式n“);printf(”2.多项式加法n“);printf(”3.多项式减法n“);printf(”4.多项式乘法n“);printf(”5.计算多项式在x处的值n“);printf(”6.对多项式求导n“);printf(”7.清空数据n“);printf(”8.关闭计算器n“);printf(”请输入选项(1~7):“);scanf(”%d“,&i);switch(i){ case(1): system(”cls“);printf(”建立多项式nn“);printf(”建立多项式A,当输入0 0 时表示出入完毕n“);A = CREATEPOLYN();printf(”建立多项式成功n“);printf(”建立多项式B,当输入0 0 时表示出入完毕n“);B = CREATEPOLYN();printf(”建立多项式成功n“);printf(”多项式A:“);PRINTPOLYN(A);printf(”n“);printf(”多项式B:“);PRINTPOLYN(B); printf(”nn输入回车返回上一级“);getchar();getchar();goto start;case(2): system(”cls“);printf(”多项式加法nn“);printf(”多项式A:“);PRINTPOLYN(A);printf(”n“);printf(”多项式B:“);PRINTPOLYN(B);printf(”n“);addp = ADDPOLYN(A,B);printf(”多项式A+B:“);PRINTPOLYN(addp);printf(”n“);printf(”nn输入回车返回上一级“);getchar();getchar();goto start;case(3): system(”cls“);printf(”多项式减法nn“);printf(”多项式B:“);PRINTPOLYN(A);printf(”n“);printf(”多项式B:“);PRINTPOLYN(B);printf(”n“);decp = SUBTRACTPOLYN(A,B);printf(”多项式A-B:“);PRINTPOLYN(decp);printf(”n“);printf(”nn输入回车返回上一级“);getchar();getchar();goto start;case(4): system(”cls“);printf(”多项式乘法nn“);printf(”多项式A:“);PRINTPOLYN(A);printf(”n“);printf(”多项式B:“);PRINTPOLYN(B);printf(”n“);mulp = MULTIPLYPOLYN(A,B);printf(”多项式AB:“);PRINTPOLYN(mulp);printf(”n“);printf(”nn输入回车返回上一级“); getchar();getchar();goto start;case(5): system(”cls“);printf(”计算多项式在x处的值n“);printf(”请输入x的值:“);scanf(”%f“,&x);printf(”n多项式A:“);PRINTPOLYN(A);printf(”n值为:%f“,CALCULATEPOLYN(A,x));printf(”n“);printf(”多项式B:“);PRINTPOLYN(B);printf(”n值为:%f“,CALCULATEPOLYN(B,x));printf(”nn输入回车返回上一级“);getchar();getchar();goto start;case(6): system(”cls“);printf(”多项式求导n“);printf(”多项式A:“);PRINTPOLYN(A);printf(”n“);printf(”多项式B:“);PRINTPOLYN(B);printf(”n“);derp1 = DERIVATIONPOLYN(A);printf(”求导后A':“);PRINTPOLYN(derp1);printf(”n“);derp2 = DERIVATIONPOLYN(B);puts(”求导后B':“);PRINTPOLYN(derp2);printf(”nn输入回车返回上一级“);getchar();getchar();goto start;case(7): system(”cls“);DESTROYPOLYN(A);DESTROYPOLYN(B);DESTROYPOLYN(addp);DESTROYPOLYN(decp);DESTROYPOLYN(mulp);DESTROYPOLYN(derp1);DESTROYPOLYN(derp2);printf(”已清空所有数据n“);printf(”nn输入回车返回上一级“);getchar();getchar(); goto start;case(8): printf(”退出");} return(0);} 目录 1前言..............................................................1 2正文..............................................................1 2.1设计目的........................................................1 2.2设计意义........................................................1 2.3设计方案与内容..................................................2 2.3.1设计内容......................................................2 2.3.2程序调试......................................................4 3致谢..............................................................7 4参考文献..........................................................7 5附录..............................................................8 塔里木大学信息工程学院课程设计 前言 17世纪初,西方国家的计算工具有了较大的发展,英国数学家纳皮尔发明的“纳皮尔算筹”,英国牧师奥却德发明了圆柱型对数计算尺,这种计算尺不仅能做加减乘除、乘方、开方运算,甚至可以计算三角函数,指数函数和对数函数,这些计算工具不仅带动了计算器的发展,也为现代计算器发展奠定了良好的基础,成为现代社会应用广泛的计算工具. 1642年,年仅19岁的法国伟大科学家帕斯卡引用算盘的原理,发明了 塔里木大学信息工程学院课程设计 其自身的优势,仍然是一种重要的语言,而且它还是通往c++的必由之路。它是融合了控制特性的的现代语言,其设计使得用户可以自然的采用自顶向下的规划、结构化的编程,以及模块化的设计。这种做法使得编写出的程序更可靠、更易懂。它是一种高级语言,在设计上它充分利用了当前计算机在能力上的优点。C程序往往很紧凑且运行速度快,其还表现出通常只有汇编语言才具有的精细控制能力,可以用于电脑cpu的编程控制语言,如果愿意,可以细调程序以获得最大速度或最大内存使用率。其可移植性的特点,可以使其在不经过太大的修改,便可在其它系统上运行,同时,它也是很多大型系统的编程语言,(比如说UNIX的操作系统就是建立在c之上的)。 2.3设计方案与内容 我此次设计的是一个计算器,主要是利用我们所学的知识,做到进一步掌握c语言的奥秘,使这种功能强大的高级语言走近我们的生活。本计算系统主要是作加减乘除运算。 该计算系统程序包括:main()函数、加函数、减函数、乘函数、除函数和显示函数。2.3.1设计内容 1、加运算: int jia(int a,int b){int c;c=a+b;printf(“c=%d n”,c);} 2、减运算: int jian(int a,int b){int c;c=a-b;printf(“ c=%d n”,c);} 3、乘运算: int cheng(int a,int b){int c;c=a*b;printf(“ c=%d n”,c);} 4、除运算: int chu(int a,int b){int c;c=a/b;printf(“ c=%d n”,c);} 5、显示函数程序: 塔里木大学信息工程学院课程设计 void xian(){ printf(“n”);printf(“n”);printf(“please choose lower level operation sign n”);/*选择提示*/ printf(“***************************n”);/*分隔号*/ printf(“0:apply overn”);/*输入0选项则提示结束,输出0*/ printf(“1:apply is additionn”);/*选择加号*/ printf(“2:apply is subtractionn”);/*选择减号*/ printf(“3: apply is multiplicationn”);/*选择乘号*/ printf(“4:apply is divisionn”);/*选择除号*/ } 显示界面程序图如图2-1所示 图2-1显示界面 程序分析: 1)printf(“please choose lower level operation sign n”);/*选择提示*/这句可以根据需要写成时间,一句鼓励自己的话,或者别的什么,都将不影响改程序的正常运行,只要在规定的“n”里,用户可以根据自己的需要把它用一句英文表达出来。 2)printf(“***************************n”);/*分隔号*/此句无关紧要,可以去掉也可以保留,看个人心情,不过个人建议,还是保留的比较好,它能保持计算器界面的美观特点,还能作为分隔运算程序的作用,让使用者能最快的对运算区进行划区。3)printf(“0:apply overn”);/*输入0选项则提示结束,输出0*/此句在运算界面里出现,当用户使用时,不小心输入了一个字符,非1~4以内,则会提示错误,按‘enter’结束该片段,然后根据提示,选择自己所希望使用的运算符号进行运算。 4)printf(“1:apply is additionn”);/*选择加号*/此句是加法运算提示,当输入‘1’后按‘enter’会得到可以使用加法的提示,然后就可以使用加法运算了,使用空格将数字与要加的数字分开,按‘enter’将得到你要的答案。5)printf(“2:apply is subtractionn”);/*选择减号*/这是加法运算提示。它的使用方法和 塔里木大学信息工程学院课程设计 相同。 2.3.2程序调试 1、加法运算 加法运算运行结果如图2-2所示。 图2-2加法运算运行结果 2、减法运算 减法运算结果如图2-3所示。 图2-3减法运算 3、乘法运算 乘法运算如图2-4所示。 塔里木大学信息工程学院课程设计 图2-4乘法运算 4、除法运算 除法运算如图2-5所示 图2-5除法运算 6、主函数程序: int main(){ int a, b; 塔里木大学信息工程学院课程设计 for(;;){ xian();switch(getchar()){ case '0':printf(“ tui chu: ”);getchar();return 0;case '1': printf(“ apply is '+': n ”);scanf(“%d”,&a);getchar();scanf(“%d”,&b);getchar();jia(a,b);break;case '2':printf(“ apply is '-':n ”);scanf(“%d”,&a);getchar();scanf(“%d”,&b);getchar();jian(a,b);break;case '3':printf(“apply is '*':n ”);scanf(“%d”,&a);getchar();scanf(“%d”,&b);getchar();cheng(a,b);break;case '4':printf(“ apply is '/':n ”);scanf(“%d”,&a);getchar();scanf(“%d”,&b);getchar();chu(a,b);break;default:printf(“wrong!please push down'enter' go on with ”);/*提示错误*/ getchar();break; 塔里木大学信息工程学院课程设计 } } return 0;/*一轮运算结束后返回符号选择功能选项*/ } 该主函数程序中使用了xian()函数、switch(getchar())语句、getchar()、for、break、return。xian()函数的功能是在程序运行中,具有显示界面的功能。switch(getchar())语句具有多分支选择功能。getchar()是库函数。for循环语句。是break语句是实现跳出循环的功能的语句。Return语句是返回语句,是程序最后一个语句,在int main(void)中int表示main()函数的返回值应该是一个整数。该程序具备的选择功能: (1)选择提示:该计算器编辑界面有5个提示,它们分别是‘0’、‘1’,‘2’、‘3’、‘4’,当使用者在该界面上输入它们其中一个数字,会得到相对应的提示,其中1~4分别表示加、减、乘、除运算。‘0’表示结束工作框结束。 (2)使用方法:进入选择界面后,要选择加法运算,请输入‘1’,然后按下‘enter’键。会得到提示 致谢 在本次课程设计中,首先我要感谢张老师。是他至始至终的教导让我能够在编程方面迅速的入门。在我们对程序语言的学习过程中,是他不断的给我们讲解语句内容并且纠正我们存在的错误。不断的给我们提供帮助并且给我们分析遇到的问题。老师认真负责的工作态度,严谨治学的精神和深厚的理论水平都使我受益匪浅。他们无论在理论上还是实践中都给了我很大的帮助,使我整体水平得到了提高,对于我以后的学习和工作都有一定的帮助,感谢张兵老师的耐心辅导! 参考文献 [1]孙雄勇.Visual C++ 6.0 实用教程.北京:中国铁道出版社,2004.[2]新电脑课堂编委会.Visual C++ 编程篇.北京:电子工业出版社,2004.[3]陈清华.Visual C++课程设计案例精选与编程指导.北京:北京大学出版社,2005.[4]李东玉.Visual C++.NET实用编程100例.北京:中国铁道出版社,2003.[6]张志清.管理信息系统.南京:东南大学出版社,2003. 塔里木大学信息工程学院课程设计 附录 #include int chu(int a,int b){int c;c=a/b;printf(“ c=%d n”,c);} void xian(){ printf(“n”);printf(“n”);printf(“please choose lower level operation sign n”);/*选择提示*/ printf(“***************************n”);/*分隔号*/ printf(“0:apply overn”);/*输入0选项则提示结束,输出0*/ printf(“1:apply is additionn”);/*选择加号*/ printf(“2:apply is subtractionn”);/*选择减号*/ printf(“3: apply is multiplicationn”);/*选择乘号*/ printf(“4:apply is divisionn”);/*选择除号*/ } int main(){ 塔里木大学信息工程学院课程设计 int a, b; for(;;){ xian(); switch(getchar()) { case '0':printf(“ tui chu: ”); getchar(); return 0; case '1': printf(“ apply is '+': n ”); scanf(“%d”,&a); getchar(); scanf(“%d”,&b); getchar(); jia(a,b); break; case '2':printf(“ apply is '-':n ”); scanf(“%d”,&a); getchar(); scanf(“%d”,&b); getchar(); jian(a,b); break; case '3':printf(“apply is '*':n ”); scanf(“%d”,&a); getchar(); scanf(“%d”,&b); getchar(); cheng(a,b); break; case '4':printf(“ apply is '/':n ”); scanf(“%d”,&a); getchar(); scanf(“%d”,&b); getchar(); chu(a,b); break; 塔里木大学信息工程学院课程设计 default:printf(“wrong!please push down'enter' go on with ”);/*提示错误*/ getchar(); break; } } return 0;/*一轮运算结束后返回符号选择功能选项*/ } C语言课程设计报告 班 级: 10电子本1 学 号: 10303033122 姓 名: 指导老师: 方文森 完成日期: 温州大学城市学院课程设计 目 录 1、课程设计目的和要求.....................................................................................................2 2、课程设计任务内容.........................................................................................................2 3、详细设计说明.................................................................................................................3 3.1分析.........................................................................................................................3 3.2软件设计.................................................................................................................3 3.3软件调试(对编程中的错误进行记录,并给出你的解决办法).....................3 4、软件使用说明.................................................................................................................4 5、课程设计心得与体会.....................................................................................................4 附录1:参考文献................................................................................................................5 附录2:部分程序清单(带有较详细的注释)................................................................5 温州大学城市学院课程设计 C语言课程设计报告 1、课程设计目的和要求 目的:(1)巩固和加深学生对C语言课程的基本知识的理解和掌握(2)掌握C语言编程和程序调试的基本技能(3)利用C语言进行基本的软件设计(4)掌握书写程序设计说明文档的能力(5)提高运用C语言解决实际问题的能力 要求:(1)分析课程设计题目的要求(2)写出详细设计说明 (3)编写程序代码,调试程序使其能正确运行(4)设计完成的软件要便于操作和使用(5)设计完成后提交课程设计报告 2、课程设计任务内容 1)一个班级有4个学生,共学习5门课程(大学英语、高等数学、C语言程序设计、VB程序设计、大学语文)。要求编写程序完成相应功能。2) 输入并保存]5门课程名称; 3) 输入并保存]4个学生的学号及其[个人相关信息]; 4) 输入并保存]每个学生对应的每门课程成绩; 5)求出每门功课的平均分; 6)找出有两门以上功课不及格的学生,输出他们的学号和全部课程成绩及该学生5门课程的平均成绩; 7)找出平均成绩在90分以上或者全部课程成绩在85分以上的学生,输出他们的学号和全部课程成绩及该学生5门课程的平均成绩; 8)计算每位学生的总分,并按总分进行排名,按由高到低输出他们的学号及总成绩; 9)对前面问题进行优化,即在一维数驵的基础上,考虑采用二维数组、函数及其参数传递的方式来解决相关问题; 10)对前面问题进行优化,在学号的基础上,增加学生的其它个人信息,包括:学号、姓名、年龄、性别,并采用结构体形式加以表示; 11)利用文件实现对输入及分析输出数据的存取操作。 12)参照教材P27页,3-11题引入选择功能,输入功能编号可以实现以上功能(考虑清屏函数,自查)。 温州大学城市学院课程设计 3、详细设计说明 3.1分析 3.2软件设计 开始菜单(功能选择)Key=?Key=1Key=2Key=3Key=4Key=5Key=0Key=99Key=6Key=7Key=8Key=9Key=10写入课程名读取课程名输入学生信息读取学生信息建立了学生信息及课程名称?退出程序读取课程、学生、成绩读取课程成绩输出功课的平均分两门以上功课不及格的学生输出高分的学生总分由高到低排序No保存保存Yes输入课程成绩(提示)必须输入课程名称、学生信息才能建立成绩保存清屏 3.3软件调试(对编程中的错误进行记录,并给出你的解决办法) 取地址。 温州大学城市学院课程设计 4、软件使用说明 1.2.3.4.5.6.7.8.9.10.11.12.[99]读取课程、学生、成绩 [1]输入课程名称.[2]读取课程名称.[3]输入学生信息.[4]读取学生信息.[5]输入课程成绩.[6]读取课程成绩.[7]功课的平均分.[8]两门以上功课不及格的学生 [9]-高分的学生-.[10]学生总分排序.[0]退出应用程序.5、课程设计心得与体会 在大家的共同努力下,忙碌了两个星期,我们顺利完成了对此程序的编译及试运行。在设计程序的过程中,我们了解到要设计一个完整的程序,其中最难的可能就属设计整个程序的框架,其中可能会需要经过很多次的修改与调试,所以必须要有耐心,直至最后设计出自己想要的程序。 另外平时学习c语言的基础也很关键,因为如果平时学得就不怎么样,那么你面对这么一个比较有难度的程序,可能会望而却步,看懂他人的程序都是个难点,更别说让自己去设计。为了解决此类问题,最好就是多向同学,老师请教,查找资料。 设计一个程序的过程就是解决一个实际问题的过程,从解决实际问题的角度,我们可以这样来看:首先要了解这个问题的基本要求,即输入、输出、完成从输入到输出的要求是什么;在次我们必须捋清思路,逐一的解决问题的各个方面,即从输入开始入手,着重考虑如何从输入导出输出,在这个过程中,可确定所需的变量、数组、函数,然后确定处理过程--算法。 感谢这次的课程设计,它使我更加深刻地体会到c语言程序编写过程的严谨与细致,还有就是无论做任何事都要有耐心。当然团队合作也是非常重要的一个环节,这会使你在学习过程中倍感轻松 总的来说,这次程序设计让我获益匪浅,对C语言也有了进一步的认识:C语言功能高、表达能力强、使用灵活方便、目标程序效率高等等。C语言是在国内外广泛使用的一种计算机语言,相信除了以上优点,还有许多我们还未发现,希望能在以后的学习中有更深入的认 温州大学城市学院课程设计 识。 附录1:参考文献 《C语言程序设计与实践教程》 附录2:部分程序清单(带有较详细的注释) #include #define N 4 #define M 5 #define Debug 1 typedef struct { char SNo[5];char SName[10];}Student; void ScoreRead(float Score[][M],char FileName[],char FileType[]){ int i,j;FILE *fp;fp=fopen(FileName,FileType);if(fp==NULL){ printf(“Errorn”);exit(0);} else { for(i=0;i 温州大学城市学院课程设计 void ScoreWrite(float Score[][M],char FileName[],char FileType[]){ int i,j;FILE *fp;fp=fopen(FileName,FileType);if(fp==NULL){ printf(“Errorn”);exit(0);} else { for(i=0;i void CoureseRead(char Cname[][20],char FileName[],char FileType[]){ FILE *fp;int i,j;char ch;fp=fopen(FileName,FileType);if(fp==NULL){ printf(“Errorn”);exit(0);} i=0;j=0;while(1){ ch = fgetc(fp);if(ch==EOF)break;if(ch=='n'){ Cname[i][j]=' ';i++;j=0;6 温州大学城市学院课程设计 } else { Cname[i][j]=ch;j++;} } #if(Debug==1)for(i=0;i void CoureseWrite(char Cname[][20],char FileName[],char FileType[]){ FILE *fp;int i,j;fp=fopen(FileName,FileType);if(fp==NULL){ printf(“Errorn”);exit(0);} for(i=0;i第四篇:C语言课程设计报告
第五篇:C语言课程设计报告