文档库 最新最全的文档下载
当前位置:文档库 › 实验3 面向连接的网络点点通信套接字编程

实验3 面向连接的网络点点通信套接字编程

实验3  面向连接的网络点点通信套接字编程
实验3  面向连接的网络点点通信套接字编程

实验三、面向连接的网络点点通信套接字编程

实验目的及要求:掌握TCP/IP面向连接的网络点点通信套接字编程

工作原理,学会使用Winsock编制网络会话程序。实验方法:1. 阅读文档,熟悉TCP/IP网络套接字编程的工作原理;

2. 参考本实验后附录的客户与服务器程序简例,使用

Visual C++输入编辑、编译、运行与调试网络会话程序;

3. 在一台实验机上运行服务端程序,另一台实验机上运

行客户端程序,双方利用控制台进行通信;也可在同一

台机器上同时运行服务器进程、客户进程进行测试。

实验内容:(1)写出改编的 Visual C++ 网络会话源程序如下:

服务器端:

客户端:

(2)运行、测试网络会话程序,记录测试结果,分析遇到的问题与解决的办法。

编程背景材料:

1.基本概念

套接字是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。可以将套接

字看作不同主机间进程进行双向通信的端点。在Windows中使用的套接字叫Winsock。

根据网络通信的特征,套接字可分为两类:流套接字和数据报套接字。流套接字是面向连接的,它提供双向的、有序的、无重复并且无记录边界的数据流服务,适用于处理大量数据。数据报套接字是无连接的,它支持双向的数据流,但并不保证数据传输的可靠性、有序性和无重复性。

2.Winsock编程原理

Winsock分1.1版和2.x版,从Windows98开始都使用2.x版。Winsock 2网络应用程序运行时通过使用系统目录中的动态链接库ws2_32.dll访问TCP/IP协议栈,用VC++6.0开发时,Winsock 2中所用的函数声明、常数等等均是在头文件winsock2.h内定义的,若想使用Winsock 2,须连接的库是ws2_32.lib。应用程序中使用流套接字和数据报套接字的方法如下框图所示:

(1) Winsock的启动和中止

由于Winsock 2提供的API服务是以动态链接库ws2_32.dll实现的,所以必须先调用WSAStartup函数对ws2_32.dll进行加载初始化,协商Winsock的版本支持,并分配必要的资源。如果在调用Winsock函数前没有加载Winsock库,则会返回SOCKET_ERROR错误,错误信息是WSANOTINITIALISED.

在应用程序关闭套接字后,还应调用WSACleanup函数终止卸载ws2_32.dll,释放资源,

以备以后使用。

我们可用以下函数来实现Winsock的启动,若Winsock启动成功则返回true,否则返回false.

bool InitSocket()

{

WORD wV ersionRequested;

WSADATA wsaData;

int err;

wV ersionRequested = MAKEWORD( 2, 0 ); //询问Winsock 2.0版本

err = WSAStartup( wV ersionRequested, &wsaData ); //加载初始化Windows Sockets DLL

if ( err != 0 ) {

printf("没有Windows Socket动态库!\n");

getch();

return false;

}

if ( LOBYTE( wsaData.wV ersion ) != 2 || HIBYTE( wsaData.wV ersion ) != 0 ) {

printf("需要Windows Socket 2!\n");

getch();

WSACleanup( );

return false;

}

return true;

}

(2) 服务器进程创建套接字

流套接字的服务进程和客户进程在通信前必须创建各自的套接字并建立连接,然后才能用相应的套接字进行“读”“写”操作,实现数据的传输。服务进程总是先于客户进程启动,服务进程首先调用一个socket函数创建一个流套接字。Socket函数的原型如下:SOCKET socket(int af, int type, int protocol);

其中,af用于指定网络地址类型,一般取AF_INET,表示该套接字在internet域中进行通信。参数type用于指定套接字类型,若取SOCKET_STREAM表示要创建的套接字是流套接字,而取SOCK_DGRAM创建数据报套接字,这里取SOCKET_STREAM。参数protocol 用于指定网络协议,一般取0,表示默认为TCP/IP协议。若套接字创建成功则该函数返回所创建的套接字句柄SOCKET,否则产生INV ALID_SOCKET错误。

(3) 在服务器上将本地地址绑定到所创建的套接字上,即将本地地址赋予该套接字。

这个过程是通过调用bind函数来完成的,该函数原型如下:

int bind(SOCKET s, const struct sockaddr* name, int nameln);

其中,第一个参数s标识一未捆绑的套接字句柄,它用来等待客户机的连接。第二个参数name是赋予套接字的地址,它由struct sockaddr结构表示,但是一般情况下另一个与该地址结构大小相同的sockaddr_in结构更为常用,该结构用来标识TCP/IP协议下的地址,

可以方便的通过强制类型转换把sockaddr_in结构转换为sockaddr结构。socketaddr_in结

构格式如下:

struct sockaddr_in

{

short sin_family;

unsigned short sin_port;

struct in_addr sin_addr;

char sin_zero[8];

};

其中,sin_family字段必须为AF_INET, 表示该socket处于Internet域。sin_port字段用于指定服务器端口,这里用我们练习编程的服务器端口号,注意不要设为那些为固定服务保留的端口号。sin_addr字段用于把一个IP地址保存为一个4字节的数,它可以是无符号长整型。字段sin_zero充当填充职责,以使sockaddr_in结构和sockaddr结构长度一样。一旦出错,bind函数就会返回SOCKET_ERROR。这部分的实现代码如下:

((sockaddr_in*)&addr)->sin_family = AF_INET; //AF_INET:使用Internet 协议

((sockaddr_in*)&addr)->sin_port = htons(3000); //设练习用的服务器端口号3000

//htons():把短整数的主机字节顺序转化成网络字节顺序((sockaddr_in*)&addr)->sin_addr.s_addr = inet_addr("210.29.174.151"); //主机地址

// inet_addr(): 把点分十进制IP地址转换为无符号长整形数(网络字节顺序) bind(sock, &addr, sizeof(addr)); //把套接字与该地址绑定

(4) 将套接字置为监听模式,并准备接受连接请求

我们接下来要做的是将套接字设置为监听模式。前面bind函数的作用只是将一个套接字和一个指定的IP地址关联在一起。指示服务器上的套接字进行监听方式工作的API函数则是listen,其定义如下:

int listen(SOCKET s, int backlog);

第一个参数同样是限定套接字。backlog参数指定了正在等待连接的最大队列长度。这个参数非常重要,因为完全可能同时出现几个服务器连接请求。例如,假定backlog参数为2,如果三个客户机同时发出请求,那么头两个会被放在一个等待处理的队列中,以便应用程序依次为它们提供服务。而第三个连接会造成一个WSAECONNREFUSED错误。

若无错误发生,listen函数返回0,若失败则返回SOCKET_ERROR错误。

设置监听工作方式后,通过调用accept函数使套接字等待接受客户连接,accept函数的原型为:

SOCKET accept(SOCKET s, struct sockaddr* addr, int* addrlen);

其中,参数s是一限定套接字,它处在监听模式。第二个参数应该是一个有效的SOCKADDR结构的地址,而addrlen应该是SOCKADDR结构的长度, 通过对accept函数的调用,可为等待连接队列中的第一个进入的连接请求提供服务。accept函数返回后,addr结构中会包含发出连接请求的那个客户机的IP地址信息,而addrlen参数则指出该结构的长度。此外,accept会返回一个新的套接字描述符,它对应于已经接受的那个客户机连接。对于该客户机后续的所有操作,都应使用这个新套接字。至于原来那个监听套接字,它仍然用于接受其他客户机连接,而且仍处于监听模式。

这部分实现代码如下:

//设置监听工作方式

listen(sock,1); //监听连接:1--允许等待队列的长度

//阻塞、等待客户连接,接受网络连接,生成新的套接字sersock标识这一连接

printf("等待客户连接!\n");

len = sizeof(addr);

sersock = accept( sock, &addr, &len ); //阻塞,等待客户连接进来,从等待队列中检取客户//接受连接,生成新Socket对应该连接;而原监听Socket继续等待其它客户连接请求if(sersock==INV ALID_SOCKET){

DWORD err = WSAGetLastError();

char txt[100];

sprintf(txt,"error when accept!---errno:%d",err);

printf(txt);

getch();

WSACleanup( );

return 0;

}

printf("有客户连接!\n输入bye通信结束\n");

over = false; //over设为结束标志,true:结束,false:点点通信中

(5) 客户进程调用socket函数创建客户端套接字

该部分代码如下:

if( !InitSocket() ) return 0; //初始化Window Sockets DLL

type = SOCK_STREAM; //面向连接

sock = socket( AF_INET, type, 0 ); //创建支持Internet协议的流式Socket

if( sock==INV ALID_SOCKET ){ //不能创建,返回

printf("不能创建Socket!");

getch();

WSACleanup( );

return 0;

}

//输入想连接到的服务器IP地址

((sockaddr_in*)&addr)->sin_family = AF_INET; //AF_INET:使用Internet 协议

printf("输入服务器地址:");

gets(msg);

((sockaddr_in*)&addr)->sin_addr.s_addr = inet_addr(msg); //服务器地址

//输入想连接到的服务器端口号

printf("输入服务器端口号(3000):");

gets(msg);

if(msg[0]=='\0') portno=3000; //如果直接回车,就采用默认端口号3000

else portno=atoi(msg);

((sockaddr_in*)&addr)->sin_port = htons( portno ); //服务器端口号

(6) 客户向服务进程发出连接请求

通过connect函数可以建立一个端到端的连接。connect函数原型为:

int connect(SOCKET s, const struct sockaddr FAR* name, int namelen);

其中,参数s是即将在其上面建立连接的本方有效TCP套接字;name是对方服务器的地址(以SOCKADDR结构);namelen则是地址参数的长度。如果你想连接的服务器没有监听

指定端口,connect调用就会失败发生错误WSAECONNREFUSED。

该部分代码如下:

len = sizeof(addr);

printf("与服务器连接...!");

err = connect( sock, (sockaddr*)&addr, len );

//在使用面向连接协议时(TCP),必须与服务器连接成功后,才可通信

//在无连接协议(UDP)中,可以直接向对方发数据,而无需连接if( err==SOCKET_ERROR ){

printf("连接失败!");

getch();

WSACleanup( );

return 0;

}

printf("成功连接到服务器!\n输入bye通信结束\n");

over = false;

(7) 当连接请求到来后,被阻塞服务进程的accept函数如(4)所述生成一个新的套接字与客户套接字建立连接,并向客户返回接受信号;

(8) 进行数据传输

一旦客户机的套接字收到来自服务器的接受信号,则表示客户机与服务器已实现连接,则可以进行数据传输了。send、recv函数是在已建连接上进行数据收发的函数。

send函数的原型为:

int send(SOCKET s, const char* buf, int len, int flags);

其中,参数s是已建立连接的套接字,将在这个套接字上发送数据。第二个参数buf,则是字符缓冲区,区内包含即将发送的数据。第三个参数len,指定即将发送的缓冲区内的字符数。最后,flags一般可设为0。对返回数据而言,send返回发送的字节数;若发生错误,就返回SOCKET_ERROR。

所以,客户端这部分代码可为:

do{

用户输入信息在msg中…

if( strcmp(msg, "bye")==0 ) over = true; //输入"bye"则结束通信

send ( sock, msg, strlen(msg)+1, 0); //发送输入信息

if(over) break;

printf("\n等待服务器响应......");

len = recv ( sock, msg, 200, 0 ); //接受信息在msg中

msg[len]=0; //接受信息末尾添串结束符null

if( strcmp(msg,"bye")==0 ) over = true; //收到"bye"则结束通信

显示接受信息…

}while( !over );

recv函数的原型为:

int recv(SOCKET s, char* buf, int len, int flags);

其中,参数s是准备接收数据的那个套接字。第二个参数buf,是即将收到数据的字符缓冲,而len则是准备接收的字节数或buf缓冲的长度。最后,flags参数一般可设为0。该函数返

回读入数据的字节数。

相应,服务器端的代码可以是:

do{

printf("\n等待用户输入信息......");

len = recv ( sersock, msg, 200, 0 ); //接收用户信息

显示收到的用户信息…

if( strcmp(msg,"bye")==0 ){ //若收到bye就结束通信

printf(msg);

break;

}

输入准备响应的信息在msg中…

if( strcmp(msg,"bye")==0 ) over = true; //若发出bye就结束通信

send ( sersock, msg, strlen(msg)+1, 0 ); //发出输入信息

}while( !over );

(9) 关闭套接字

一旦任务完成,就必须释放套接字占用的所有资源。通常调用closesocket函数即可以达到目的。Closesocket()函数的原型为:

int closesocket(SOCKET s );

其中,参数s使要关闭的套接字描述字,此后若再使用该套接字,调用就会失败,并出现WSAEOTSOCK错误。

服务器端须关闭接受连接的套接字以及监听套接字,然后以WSACleanup函数卸载退出使用Winsock。客户端也须关闭相应的套接字及卸载Winsock后退出。

C程序设计实验三实验报告

实验报告 工学院土木工程专业09级2011至2012学年度第1学期学号:xxxxxx姓名:xxxxxx 2011 年10月08日第3~4节综合楼325教室 实验目的:

a的字节数为sizeof (a)或sizeof (int ),用printf 函数语句输出各类型变 量的长度(字节数)。 ①输入程序如下 in clude int mai n() {int a,b,i,j,k,r,s,t,u,v,w,x,y,z; float d,e; char c1,c2; double f,g; long m, n; un sig ned int p,q; a=61;b=62; c1='a';c2='b'; d=3.56;e=-6.78; m=50000;n=-60000; p=32768;q=40000; i=sizeof(a);j=sizeof(b); k=sizeof(d);r=sizeof(e); s=sizeof(c1);t=sizeof(c2); u=sizeof(f);v=sizeof(g); w=sizeof(m);x=sizeof( n); y=sizeof(p);z=sizeof(q); prin tf("a=%d,b=%d\nd=%d,e=%d\nc 1= %d,c2=%d\n",i,j,k,r,s,t); prin tf("f=%d,g=%d\nm=%d, n=%d\nmp=%d,q=%d\n",u,v,w,x,y,z); } 结 果如 下: (2)设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体 积。编程序,用scanf输入数据,输出计算结果。输出时要有文字说明,去小数点后两位数字。 ①编写程序如下: #i nclude int mai n() {float h,r,l,s,sq,vq,vz; float pi=3.141526; prin tf("Please in put r,h:"); sca nf("%f,%f",&r,&h); l=2*pi*r; s=r*r*pi; sq=4*pi*r*r; vq=3.0/4.0*pi*r*r*r; vz=pi*r*r*h; prin tf("The circumfere nce:l=%6.2f\n",l); prin tf("The area of thee circle:s=%6.2f\n ",s); prin tf("The superficial area of the ball:sq=%6.2f\n ",sq); prin tf("The volume of the ball:v=%6.2f\n",vq); prin tf("The volume of the cyli nder:vz=%6.2f\n ",vz); return 0; L

C语言程序设计实验3

一、实验目的 1. 掌握简单的程序设计,能正确写出顺序结构的源程序。 2. 掌握数据的输入输出方法,能正确使用各种格式转换符。 二、实验内容(程序清单及运行结果) (一)阅读程序 1.先读下列程序,写出程序运算结果,再将该程序输入并运行,观察运行结果 与你所写的结果是否相同。 ①int main() { int x,y,z; x=y=2;z=3; y=x++-1; printf("%d\t%d\t",x,y); y=++x-1; printf("%d\t%d\t",x,y); y=z--+1; printf("%d\t%d\t",z,y); y=--z+1; printf("%d\t%d\n",z,y); return 0; } ②int main() { char c1='a',c2='b',c3='c',c4='\101',c5='\116'; printf("a%cb%c\tc%c\tabc\n",c1,c2,c3); printf("\tb%c%c",c4,c5); return 0; } 2.以下各程序需要输入数据,请写出输入数据的格式和变量的值并上机验证。

①#include int main() { int a,b,c; printf("input a,b,c\n"); scanf("%d%d%d",&a,&b,&c); printf("a=%d,b=%d,c=%d",a,b,c); return 0; } ②main() { int i, j; printf("i, j=?\n"); scanf("%d, %d", &i, &j); } ③scanf(“%d,%*d,%d”,&a,&b); 若输入:3,4,5 a=? b=? ④scanf(“%3d%2d”,&a,&b); 若输入:12345 a=?b=?

简单的C语言程序设计实验报告完美版

本科实验报告专用纸 课程名称C语言程序设计成绩评定 实验项目名称简单的C语言程序设计 实验项目编号实验项目类型验证型 实验地点指导教师 学生姓名学号 学院专业 一、实验目的 1.掌握各种类型数据的输入输出的方法,能正确使用各种格式转换符。 2.学会正确使用逻辑运算符和逻辑表达式。 3.熟练掌握if语句和switch语句。 4.结合程序掌握一些简单的算法。 二、实验内容和实验要求 实验内容1::试编写程序,用getchar函数读入两个字符给c1,c2,然后分别用putchar函数和printf函数 输出这个字符。 实验要求:(1) 输入事先已编好的程序,并运行该程序。分析运行结果是否正确。 (2)比较用Printf函数和putchar函数输出字符的特点。 实验内容2:给出一百分制成绩,要求输出成绩等 级’A’,’B’,’C’,’D,’E’。90分以上为’A’,80-89分 为’B’,70-79分为’C’,60-69分为’D’,60分以下 为’E’。 第1页(共11页)

实验要求:(1)事先编写好程序,要求分别用if语句和switch 语句来实现。 (2)输入程序,并运行该程序。分析运行结果是 否正确。 (3)再运行一次程序,输入分数为负值(如-70), 这显然是输入是出错,不应该给出等级,修改程序, 使之能正确处理任何数据,当输入数据大于100和 小于0时,通知用户“输入数据错”,程序结束。 三、主要仪器设备 仪器:计算机 实验环境:windowsXP+visual c++6.0 四、实验过程 实验内容1: 原理:1)用getchar函数输入两个字符赋给c1,c2; 2) 用putchar函数输出这两个字符; 3) 用printf函数输 出这两个字符。 (1)源程序

实验一简单程序设计实验

实验一:简单程序设计实验 (1)编写一个 32 位无符号数除法的程序,要求将存放在 NUM1 中的 32 位无符号数与存放 在 NUM2 中的 16 位无符号数相除,结果存放在 NUM3 和 NUM4 中。 程序流程图略。 参考源程序: DATA SEGMENT NUM1 DD 2A8B7654H NUM2 DW 5ABCH NUM3 DW ? NUM4 DW ? DATA ENDS CODE SEGMENT ASSUME DS:DATA, CS:CODE START: MOV AX,DATA ;数据段寄存器初始化 MOV DS,AX MOV AX, WORD PTR NUM1 MOV DX, WORD PTR NUM1+2 DIV NUM2 MOV NUM3,AX MOV NUM4,DX MOV AH,4CH ;正常返回DOS 系统 INT 21H CODE ENDS END START (2)编写一个拆字程序。要求将存放在 ARY 单元的 2 位十六进制数 X 1X 2 拆为 X 1 和 X 2 两 部分,并以 0X 1 和 0X 2 的形式分别存入 ARY+1 和 ARY+2 单元中。 程序流程图略。 参考源程序: DATA SEGMENT ARY DB 2AH,?,? DATA ENDS CODE SEGMENT ASSUME DS:DATA, CS:CODE START: MOV AX,DATA MOV DS,AX MOV SI,OFFSET ARY ;取ARY 的偏移地址 MOV AL,[SI] ;取16进制数至AL

MOV BL,AL AND AL,0F0H ;取16进制数的高四位,即X1 SHR AL,4 MOV [SI+1],AL ;存0X1 MOV AL,BL AND AL,0FH ;取16进制数的低四位,即X2 MOV [SI+2],AL ;存0X2 MOV AH,4CH INT 21H CODE ENDS END START

实验3简单的程序设计

实验3简单的程序设计 实验目的: 1.掌握表达式、赋值语句的正确书写规则。 2.掌握VB变量的定义和使用,表达式和常用函数的使用。 3.掌握InputBox与MsgBox的使用。 实验3.1函数考察 实验任务: 考察下列函数的值。 Round(-3.5) Round(3.5) Chr(66) Asc ("c") Asc(Chr(99)) Chr(Asc("K")) Ucase$("abcdefg") Lcase(“ABC”) Str(123.45) Val(“123AB”) Len(“123程序设计ABC”) LenB(“123程序设计ABC”) Ltrim(“ ABC”) String(3, “ABC”) Instr(“EFABCDEFG”, “ef”) Instr(2,“EFABCDEFG”, “ef”,1) Date() Now() Time() 实验步骤: 先自己分析以上函数的功能和可能的结果,然后在立即窗口用Print方法求出相应函数的值,对照比较自己的判断。 22

实验3.2表达式考察 实验任务: 考察下列表达式的值。 Dateadd(“m”,1,#1/30/2000#) Datediff(“y”,#12/03/1999#,#1/03/2000#) ‘计算时间间隔多少日 123 + Mid(“123456”,3,2) 123 & Mid(“123456”,3,2) Ucase(Mid(“abcdefgh”,3,4)) 16 / 4 – 2 ^ 5 * 8 / 4 MOD 5 \ 2 实验步骤: 先自己分析表达式的功能和可能的结果,然后在立即窗口用Print方法求出相应表达式的值,对照比较自己的判断。 实验3.3简单打印图形 实验任务: 使用Print方法、Tab函数和String函数设计一个过程,显示如图3-1所示的图形,并将结果保存到文件中。 图3-1 实验3.2运行界面 参考代码如下: Private Sub Form_Load() Print Tab(15); String(1, "1") Print Tab(14); String(3, "2") Print Tab(13); String(5, "3") Print Tab(12); String(7, "4") End Sub 操作提示: 应先将Form窗体的AutoRedraw属性值设为True。

试验项目试验一最简单的C程序设计

试验项目试验一最简单的C程序设计

实验项目:实验一最简单的C程序设计 (所属课程:《C语言程序设计》学时:2) 一、实验目的 1.掌握:使用标准输入/输出函数进行常见数据类型的数据的输入/输出方法。 2.初步培养编制程序框图和源程序、准备测试数据以及实际调试程序的独立编程能力。 3.掌握顺序结构程序设计的基本思路。 二、实验条件 Pc和vc++编程环境 三、实验内容 1.熟悉编程环境。 2.输入并运行一个C程序 3.掌握各种格式转换符的正确使用方法。 4.编程序:设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。要求用scanf函数从键盘上输入数据(半径和高),输出各计算结果,输出时要求有文字说明,取小数点后2位数字。5.编程序:用getchar函数输入两个字符给C1、C2,然后分别用putchar函数和printf函数输出这两个字符。 四、实验步骤 编写程序,输入数据,观察结果。

五、实验结果 观察结果和预期是否一致。 实验项目:实验二选择结构程序设计 (所属课程:《C语言程序设计》学时:2) 一、实验目的 1.了解C语言表示逻辑量的方法(以0代表“假”,以非0代表“真”)。 2.学会正确使用逻辑运算符和逻辑表示式。 3.熟练掌握if语句和switch语句 二、实验条件 Pc和vc++编程环境 三、实验内容

1.有一函数: ?????≥-<≤-<=)10x (113x ) 10x 1(12x )1x (x y 用scanf 函数输入x 的值,求y 值。 运行程序,输入x 的值(分别为x<1、1≤x <10、x ≥10三种情况),检查输出的y 值是否正确。 2.给出一个百分制成绩,要求输出成绩等级A 、B 、C 、D 、E 。90分以上为A ,81~89分为B ,71~79分为C ,61~69分为D ,60分以下为E 。 3.输入4个整数,要求按由小到大顺序输出。 四、实验步骤 编写程序,输入数据,观察结果。 五、实验结果 观察结果和预期是否一致。 实验项目:实验三 循环结构程序设计

最简单的C程序设计—顺序程序设计实验报告

嘉应学院计算机学院 实验报告 课程名称程序设计基础实验名称实验地点 指导老师实验时间提交时间 班级姓名座号 一、实验目的和要求 (1)掌握C语言中使用最多的一种语句——赋值语句的使用方法。 (2)掌握各种类型数据的输入输出的方法,能正确使用各种格式装换符。 (3)进一步掌握编写程序的和调试程序的方法。 二、实验环境和方法 实验方法: (一)综合运用课本所学的知识,用不同的算法实现在不同的程序功能。 (二)结合指导老师的指导,解决程序中的问题,正确解决实际中存在的异常情况,逐步改善功能。 (三)根据实验内容,编译程序。 实验环境:Windows xp Visual C++6.0 三、实验内容及过程描述 实验步骤: ①进入Visual C++ 6.0集成环境。 ②输入自己编好的程序。 ③检查一遍已输入的程序是否有错(包括输入时输错的和编程中的错误),如发现有错,及时改正。 ④进行编译和连接。如果在编译和连接过程中发现错误,频幕上会出现“报错信息”,根据提示找到出错位置和原因,加以改正。再进行编译,如此反复直到不出错为止。 ⑤运行程序并分析运行结果是否合理。在运行是要注意当输入不同的数据时所得结果是否正确,应运行多次,分别检查在不同情况下结果是否正确。 实验内容:编译以下题目的程序并调试运行。 实验① (1)通过下面的程序掌握各种格式装换符的正确使用方法。 ①输入以下程序:

②运行程序并分析结果如图: ③在此基础上,将程序第10~14行改为 c1=a;c2=b; f=3157.;g=0.; d=f;e=g; P=a=m=50000;q=b=n=-60000; 运行程序,分析结果如: (二)设圆半径r=1.5,圆柱高h=3,求圆周长﹑圆面积﹑圆球表面积﹑圆球体积﹑圆柱体积。 用scanf 输入数据,输出计算结果,输出时要求有文字说明,取小数点后两位数字。 程序代码为: #include int main() {int a,b; float d,e; char c1,c2; double f,g; long m,n; unsigned int p,q; a=61,b=62; c1='a';c2='b'; d=3.56;e=-6.87; f=3157.;g=0.; m=50000;n=-60000; p=32768;q=40000; printf("a=%d,b=%d\nc1=%c,c2=%c\nd=%6.2f,e=%6.2f\n",a,b,c1,c2,d,e); printf("f=%15.6f,g=%15.12f\nm=%1d,n=%1d\np=%u,q=%u\n",f,g,q,m,n,p,q); } #include int main() {float h,r,l,s,sq,vq,vz; float pi=3.; printf("请输入圆半径r ,圆柱高h :"); scanf("%f,%f",&r,&h); l=2*pi*r; s=r*r*pi; sq=4*pi*r*r; vq=3.0/4.0*pi*r*r*r; vz=pi*r*r*h;

实验三简单程序设计(2)

实验三简单程序设计 【实验目的】 1、掌握scanf、printf函数语句的使用 2、掌握算术表达式和赋值表达式的使用 3、能够编程实现简单的数据处理 【实验性质】验证性 【实验要求】 1、认真阅读本次实验的目的,了解本次实验要求掌握的内容 2、在上机前,需要预习,在程序改错题旁将程序中存在的错误修改过来,将编程题的 代码和流程图写在预习报告中 3、在实验时,将实验要求的基本题(程序改错和编程题)根据预习报告中编写的代码, 在VC环境中编写出来 4、在VC中将编写的程序编译、调试,能正确运行结果,各题目的具体要求请看题目下 的要求 5、将正确程序上传FTP服务器(ftp://172.17.9.253) 6、争取完成选作题 【实验内容】 1、程序改错 1) 下面程序需要从键盘输入三个数,计算其平均值在屏幕上显示输出。要求平均值 需要保留两位小数。源代码如下,程序中存在错误,请将其改正写在旁边,并注明为什么错误。 include int Main(){ int x,y,z,float ave; /*定义变量*/ printf("请输入三个数:\n);/*输入提示*/ scanf("%d,%d,%d",x,y,z);/*从键盘输入*/ ave=x+y+z/3;/*计算*/ printf("平均值是:ave=%f",AVE); return 0; }

2、编程题 1)编写程序,在计算机屏幕上显示如下信息。 【要求】 (1)使用printf 函数输出字符 2) 设一个正圆台的上底半径r1,下底半径r2,高h 。请设计一程序,从键盘输入r1,r2,r3;计算并在显示器上输出该圆台的上底面积s 1,下底面积s 2,圆台的体积V 。 【要求】 (1)r1,r2,h 用scanf 函数输入,且在输入前要有提示; (2)在输出结果时要有文字说明,每个输出值占一行,且小数点后取2位数字。 【思路点拔】 (1)圆面积计算公式为 s=πr 2。其中r 为圆半径。 (2)圆台体积计算公式为 V=3 /)r1r2r2r1(h 22++π 3) 鸡兔同笼,已知鸡兔总头数为h ,总脚数为f ,求鸡兔各有多少只? 【要求】

实验项目:实验一 最简单的C程序设计

实验项目:实验一最简单的C程序设计 (所属课程:《C语言程序设计》学时:2) 一、实验目的 1.掌握:使用标准输入/输出函数进行常见数据类型的数据的输入/输出方法。 2.初步培养编制程序框图和源程序、准备测试数据以及实际调试程序的独立编程能力。 3.掌握顺序结构程序设计的基本思路。 二、实验条件 Pc和vc++编程环境 三、实验内容 1.熟悉编程环境。 2.输入并运行一个C程序 3.掌握各种格式转换符的正确使用方法。 4.编程序:设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。要求用scanf函数从键盘上输入数据(半径和高),输出各计算结果,输出时要求有文字说明,取小数点后2位数字。5.编程序:用getchar函数输入两个字符给C1、C2,然后分别用putchar 函数和printf函数输出这两个字符。 四、实验步骤 编写程序,输入数据,观察结果。 五、实验结果 观察结果和预期是否一致。 实验项目:实验二选择结构程序设计

(所属课程:《C 语言程序设计》学时:2) 一、实验目的 1.了解C 语言表示逻辑量的方法(以0代表“假”,以非0代表“真”)。 2.学会正确使用逻辑运算符和逻辑表达式。 3.熟练掌握if 语句和switch 语句 二、实验条件 Pc 和vc++编程环境 三、实验内容 1.有一函数: ?? ???≥-<≤-<=)10x (113x )10x 1(12x )1x (x y 用scanf 函数输入x 的值,求y 值。 运行程序,输入x 的值(分别为x<1、1≤x <10、x ≥10三种情况),检查输出的y 值是否正确。 2.给出一个百分制成绩,要求输出成绩等级A 、B 、C 、D 、E 。90分以上为A ,81~89分为B ,71~79分为C ,61~69分为D ,60分以下为E 。 3.输入4个整数,要求按由小到大顺序输出。 四、实验步骤 编写程序,输入数据,观察结果。 五、实验结果 观察结果和预期是否一致。 实验项目:实验三 循环结构程序设计

C程序设计上机实验报告完整版

C语言程序设计上机实验报告 学院:机械工程学院 班级:机自161213 姓名:刘昊 学号: 实验时间:2017年3月6号 任课老师:张锐 C语言程序设计上机实验报告 实验一 一、实验名称: C程序的运行环境和运行C程序的方法 二、实验目的:了解在C编译系统上如何编辑、编译、连接和运行一个C程序 三、实验内容: (1). 输入并运行一个简单的C程序。 (2). 设计程序,对给定的两个数求和。 (3). 设计程序,对给定的两个数进行比较,然后输出其中较大的数。 四、源程序代码: ??代码1: 运行结果1: ??程序分析1: 该程序用来判断所输入的整数是否为一个素数,如果一个数能被除了1和它本身整除,还能被其它数整除,那么它就不是一个素数,因此,用for循环来进行整除过程的简写。 代码2: ? 运行结果2: ? 程序分析2: 简单的使用printf()和scanf()函数进行简单的数据运算。 代码3: 运行结果3: 程序分析3: 使用if语句进行判断。 五.实验总结 C语言程序设计上机实验报告 实验二 一、实验名称:顺序结构程序设计 二、实验目的:正确使用常用运算符(算术运算符、赋值运算符)的用法,熟练掌握算 术运算符及其表达式,逻辑运算符和逻辑表达式。

三、实验内容: (1). 编写程序,实现小写字母转大写。 (2). 编写程序,实现输入两个不同类型数据后,经过适当的运算(加、减、乘、除)后输出。 (3). 编写程序,计算三角形面积、立方体的体积和表面积、圆的面积和周长。 (4). 编写程序,实现单字符getchar和putchar输入输出。 (5). 编写程序,实现十进制、八进制、十六进制不同数制的输出。 四、源程序代码 代码1: 运行结果1: ??程序分析1: 所有的字符都有一个对应的数字与之对应,每一个小写字母对应的数与大写字母对应的数之间总是相差32,所以只需要对所输入的字符进行减法运算就可以转换为与之对应的大写字母。 代码2: ?运行结果2: ??程序分析2: 简单的数据运算和格式字符的输出。 代码3: 运行结果3: ??? ?程序分析3: 简单的数据运算实现相应的功能。 代码4: ??运行结果4: ?程序分析4: getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕. ?代码5: ??运行结果5: 程序分析5: 重要的是格式字符的使用,%d(输出十进制整型数)%o(以八进制格式输出整形数)%x(以十六进制格式输出整型数)%f(以带小数点的形式输出浮点数)%c(输出一个字符)%s(输出字符串,直到遇到\0) 五、实验总结 C语言程序设计上机实验报告 实验三 一、实验名称:选择结构程序设计 二、实验目的:正确使用逻辑运算符和逻辑表达式,熟练掌握if 语句和switch 语句, 学习调试程序。 三、实验内容: (1). 编写程序,用if 语句编程实现一分段函数的求解。 (2).用if 语句编写程序,求一元二次方程的根。

程序设计基础实验报告

实验一 用C 语言编写简单程序 一、实验目的 1. 熟悉VC6.0的编程环境,掌握运行C 程序的基本步骤。 2. 了解C 程序的基本框架,模仿例题编写简单的C 语言程序。 3. 正确书写算术表达式、赋值表达式和关系表达式。 4. 掌握基本输入输出函数的使用,正确调用C 语言提供的数学库函数。 5. 掌握简单的单步调试方法。 二、实验环境 Windows XP ;Visual C++ 6.0。 三、实验内容 1.在屏幕上显示一个句子“What is a computer?”。 2.求华氏温度150F 对应的摄氏温度。计算公式如下: 其中,c 表示摄氏温度;f 表示华氏温度。 3.输入x ,计算下列分段函数的值(保留2位小数),请调用sqrt 函数求平方根,调用pow 函数求幂。 4. 输入一个正整数m (0100)m ≤≤,求100i m i =∑。 四、实验要求 1. 将上机验证正确的源代码写到实验报告上。 2.根据自己的真实感受,认真填写实验分析和实验心得以及问题和建议。 3.按时提交实验报告。 553299 c f =?- ?21(1)2 x<02()0x x f x ?+++?=≥

一、实验目的 1.熟练掌握关系表达式的使用。 2.熟练掌握使用else-if 语句实现多分支结构程序设计。 二、实验环境 Windows XP ;Visual C++ 6.0。 三、实验内容 1.输入x ,计算并输出下列分段函数sign(x)的值。 2.输入月薪salary ,输出应交的个人所得税tax (保留2位小数)。按照2011年开始实行的新的个人所得税法,计算公式为:tax = rate*(salary-3500)-deduction 。 当salary≤3500时,rate=0、deduction=0 当35000y sign x -??==???

安徽大学计算机实验平台答案:实验1——C简单程序设计

实验一:C简单程序设计 1、略。 2、编程:要求程序运行后在屏幕上输出如下信息: My Program Is Running! Good,and I'm very glad now! #include #include main() { printf("My Program Is Running!\nGood,and I'm very glad now!"); system("pause"); } 3、编程:输入圆的半径,计算圆的面积并输出。 #include #include #define PI 3.14 main() { float r,S=0; printf("请输入圆的半径r:"); scanf("%f",&r); S=PI*r*r; printf("输出圆的面积S:%.2f\n",S); system("pause"); } 4、编程:输出一个形如“▲”的三角图形(要求:第1行输出一个“*”,第2行输出三个“*”,......,最后一行输出9个“*”)。(此题为选做)。= #include #include main() { char star='*',space=' '; int i,j,num1,num2; for(i=1;i<=5;i++) { for(j=5;j>=i;j--) { printf(" "); } for(j=1;j<=2*i-1;j++) { printf("*"); }

printf("\n"); } system("pause"); } 5、编程:输出一个形如“◣”的三角图形(要求:共5行,第1行一个“*”,第2行二个“*”,......,最后一行5个“*”)。(此题为选做)。 #include #include main() { char star='*',space=' '; int i,j,num1,num2; for(i=1;i<=5;i++) { num1=5-i; num2=i; for(j=0;j

C#程序设计实验报告

实验报告二姓名 专业软件工程 课程名 C#程序设计 称 一、实验名称: 实验2 二、实验目的: 掌握使用命令行开发简单的C#应用程序 掌握使用Visual Studio编写控制台应用程序 掌握Visual Studio环境下程序的跟踪调试 了解Visual Studio在线帮助的使用 掌握应用程序命令行参数的使用 三、实验内容及要求 利用https://www.wendangku.net/doc/a010815791.html,完成数据的增、删、改、查 四、实验材料、工具、或软件 Windows XP Professional SP3 Visual Studio 2005 五、实验步骤、结果(或记录) 实验二:程序流程控制 2-1输入半径,求对应的圆的周长、面积、对应球体的体积。运行结果: 实验代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _2_1 {

{ static void Main(string[] args) { const double PI = 3.14159; double r, perimeter, area, volume; Console.Write ("请输入半径:"); String s = Console.ReadLine(); r = double.Parse(s); Console.WriteLine("圆的半径为={0}",r); perimeter = 2 * PI * r; area = PI * r * r; volume = 4 / 3 * PI * Math.Pow(r, 3); Console.WriteLine("圆的周长为={0},面积为={1}",perimeter ,area ); Console.WriteLine("球体的体积={0}",volume ); Console.ReadLine(); } } } 2-2求三角形的周长和面积 运行结果: 实验代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _2_2 {

C语言 实验五 最简单的C语言程序设计

实验5:最简单的C语言程序设计 一、实验目的: (1)掌握C语言中使用最多的一种语句——赋值语句的使用方法。(2)掌握各种类型数据的输入输出的方法,能正确使用各种格式转换符。(3)进一步掌握编写程序和调试程序的方法。 二、实验内容和步骤: 1、通过下面的程序掌握各种格式转换符的正确使用方法。 (1)输入以下程序: /* Note:Your choice is C IDE */ # include int main( ) {int a,b; float d,e; char c1,c2; double f,g; long m,n; unsigned int p,q; a=61,b=62; c1='a';c2='b'; d=3.56;e=-6.87; f=3157.890121;g=0.123456789; m=50000;n=-60000; p=32768;q=40000; printf("a=%d,b=%d\nc1=%c,c2=%c\nd=%6.2f,e=%6.2f\n",a,b,c1,c2,d,e); printf("f=%15.6f,g=%15.12f\nm=%1d\np=%u,q=%u\n",f,g,m,n,p,q); 显示结果: (2)运行此程序并分析结果。 (3)在此基础上,将程序第10~14行改为c1=a,c2=b; f=3157.890121;g=0.123456789; d=f;e=g;运行程序,分析结果。 /* Note:Your choice is C IDE */ #include"stdio.h"

int main() {int a,b; float d,e; char c1,c2; double f,g; long m,n; unsigned int p,q; a=61;b=62; c1=a;c2=b; f=3157.890121;g=0.123456789; d=f;e=g; p=a=m=50000;q=b=n=-60000; printf("a=%d,b=%d\nc1=%c,c2=%c\nd=%6.2f,e=%6.2f\n",a,b,c1,c2,d,e); printf("f=%15.6f,g=%15.12f\nm=%1d,n=%1d\np=%u,q=%u\n",f,g,m,n,p,q); } 显示结果: (4)用sizeof运算符分别检测程序中各类型的数据占多少字节。例如,int型变量a的字节数为sizeof(a)或sizeof(int),用printf函数语句输出各类型变量的长度(字节数)。 程序如下: # include int main( ) {printf("int:%d\n",sizeof(int)); return 0; } 显示结果: #include int main( ) {printf("float:%d\n",sizeof(float)); return 0; }

c面向对象程序设计MFC简单计算器实验报告

计算机与信息工程学院 《程序设计基础》课程设计报告 题目名称:60.编写一个能实现简单功能的计算器学生姓名:刘沛东 学生学号:54 专业班级:电子信息工程(1)班 指导教师:高攀

1 课程设计的题目 编写一个能实现简单功能的计算器 2 题目要求 1. 有一个计算器图形。 2. 能实现加、减、乘、除及乘方的运算。 3. 当输入题目时,屏幕上要在指定位置上显示出相应的题目内容,且相应的数字键要改变颜色 例如:输入数字1 时,在计算器图形上的1键变为红色。 4. 屏幕、图形颜色、形状自定 3 总体设计 总体框架 图1 系统框架

系统功能说明 在VC++中绘制计算器界面,各控件的设置 对0~9控件设定相应的ID和其他属性: 图2 “1”控件设置 对“+、-、*、\”控件设定相应的ID和其他属性: 图2 “+”控件设置 对其它控件设定相应的ID和其他属性: 图3 其它控件设置

主要使用到Layout菜单中的Align功能对各个按钮进行对其,使界面更加整洁。拖出的控件有上面的一个Edit控件用于显示数字,Button控件用于处理鼠标的消息。 4 程序详细设计 系统主调模块 图5 程序流程图

各模块详细设计 建立的变量,控件的命名,对应的消息处理函数对应表 double poz; 按钮的处理函数 void CCalcDlg::OnPt() { point_flag=TRUE; && buffer[i+1]==0)之前那位 }

m_Dis=strtod(buffer,NULL);整个大的程序的实现分8个功能,每个功能都通过一个相应的函数来实现.在调试时分别进行调试,使得调试更方便些.在编写各个函数只是按着题目要求的去完成,后来经指导老师指导后,发现了很多自己欠缺的地方,又一次将程序整体进行调试.最后把程序完善了许多。 本次MFC计算器的制作,学习到了MFC基本的编程方法。对OOP编程的理解进一步加深。但是程序仍然存在一定的问题,比如除数不能为0的Exception handle,符号键多次点击结果混乱。通过这次课程设计,以后Windows 应用程序势必会轻车熟路。 参考书目: [1]谭浩强,《C++程序设计》,北京,清华大学出版社,2006年。[2]孙鑫《深入浅出MFC》,视频教程。 [3]《Visual_C++MFC入门教程》,电子版。

实验3--最简单的C程序设计——顺序程序设计

①输入以下程序: #include int main() {int a,b; //定义整形a,b float d,e; //定义单精度浮点d,e char c1,c2; //定义字符c1,c2 double f,g; //定义双精度字符f,g long m,n; //定义长整形字符m,n unsigned int p,q; //定义无符号整形p,q a=61;b=62; //对a,b赋值61,62 c1='a';c2='b'; //对c1,c2赋值a,b d=3.56;e=-6.87; //对d,e赋值 f=3157.890121;g=0.123456789; //对f,g赋值 m=50000;n=-60000; //对m,n赋值 p=32768;q=40000; //对p,q赋值 printf("a=%d,b=%d\nc1=%c,c2=%c\nd=%6.2f,e=%6.2f\n",a,b,c1,c2,d,e); //输出a,b,c1,c2,d,e printf("f=%1.56f,g=%15.12f\nm=%ld,n=%ld\np=%u,q=%u\n",f,g,m,n,p,q); //按格式化输出f,g,m,n,使f小数点后保留56位,g的有效字符位15且保留12位小数 } ②运行此程序并分析结果。 ③在此基础上,将程序第10—14行改为: c1=a;c2=b; f=3157.890121;g=0.123456789; d=f;e=g; p=a=m=50000;q=b=n=-60000; 运行程序,分析结果。

④用sizeof运算符分别检测程序中各类型的数据占多少字节。例如,int型 变量a的字节数为sizeof(a)或sizeof(int),用printf函数语句输出各类型变量的长度(字节数)。 sizeof(int) = 4 sizeof(float) = 4; sizeof(double) = 8; sizeof(char) = 1; char *p; sizeof(p) = 4; sizeof(long) = 4; sizeof(unsigned int) = 4; ⑵设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。编程序,用scanf输入数据,输出计算结果。输出时要有文字说明,取小数点后面两位数。 解:程序如下: #include int main() {float h,r,l,s,sq,vq,vz; //定义h,r,l,s,sq,vq,vz float pi=3.1415926; // 设pi=3.1415926 printf("请输入圆半径r,圆柱高h:"); //输出:请输入圆半径r,圆柱高h:scanf("%f,%f",&r,&h); //输入r,h l=2*r*pi; //给l赋值为2*r*pi s=r*r*pi; //给s赋值为r*r*pi sq=4*pi*r*r; //给sq赋值为4*pi*r*r vq=4.0/3.0*pi*r*r*r; //给vq赋值为4.0/3.0*pi*r*r*r vz=pi*r*r*h; //给vz赋值为pi*r*r*h

实验3 最简单的C程序设计——顺序程序设计(实验指导书)

实验3 最简单的C程序设计——顺序程序设计 1、实验目的 (1)掌握C语言中使用最多的一种语句——赋值语句的使用方法; (2)掌握各种类型数据的输入输出的方法,能正确使用各种格式转换符; (3)进一步掌握编写程序和调试程序的方法。 2、实验内容和步骤 (1)通过下面的程序掌握各种格式转换符的正确使用方法。 ①输入以下程序: ②运行此程序并分析结果。 ③在此基础上,将程序第9~14行改为 运行程序,并分析结果。 ④用sizeof运算符分别检测程序中各类型的数据占多少字节。例如:int型变量a的字节数为sizeof(a)或sizeof(int),用printf函数语句输出各类型变量的长度(字节数)。 (2)设圆半径为r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积。用scanf 函数输入数据,输出计算结果,输出时要求有文字说明,取小数点后2位数字。请编写程序。(教材P.84第3章习题第7题) (3)计算存款利息。(教材P.82第3章习题第2题) 有1000元,想存5年,可按以下5种办法存: (1)一次存5年期。 (2)先存2年期,到期后将本息再存3年期。

(3)先存3年期,到期后将本息再存2年期。 (4)存1年期,到期后将本息再存1年期,连续存5次。 (5)存活期存款。活期利息每一季度结算一次。 假如2007年12月的银行存款利息如下: 1年期定期存款利息为4.41%; 2年期定期存款利息为4.68%; 3年期定期存款利息为5.4%; 5年期定期存款利息为5.85%; 活期存款利息为0.72%(活期存款每一季度结算一次利息)。 注:计算利息的公式参见教材P.83第3章习题第2题。 (4)编程序将“China”译成密码,密码规律为:用原来的字母后面的四个字母代替原来的字母。例如:字母“A”后面第四个字母是“E”,用“E”代替“A”。因此“China”应译为“Glmre”。请编一程序,用赋初值的方法使c1,c2,c3,c4,c5这5个字符型变量的值分别为’C’,’h’,’i’,’n’,’a’,经过运算,使得c1,c2,c3,c4,c5分别变为’G’,’l’,’m’, ’r’,’e’。分别用putchar函数和printf函数输出这5个字符。(教材P.84第3章习题第6题) ①输入事先已编好的程序,并运行该程序。分析是否符合要求。 ②改变c1,c2,c3,c4,c5的初值分别为:’T’,’o’,’d’,’a’,’y’,并对译码规律做如下补充:’W’用’A’代替,’X’用’B’代替,’Y’用’C’代替,’Z’用’D’代替。修改程序并运行。 ③将译码规律修改为:将一个字母被它前面第4个字母代替,例如’E’用’A’代替, ’Z’用’U’代替,’D’用’Z’代替,’C’用’Y’代替,’B’用’X’代替,’A’用’V’代替。修改程序并运行。 3、撰写实验报告 实验后,应整理出实验报告。实验报告应包括以下内容: (1)实验目的。 (2)实验题目。 (3)程序清单(计算机打印出的程序清单)。 (4)运行结果(必须是上面程序清单所对应打印输出的结果)。 (5)对运行情况所做的分析以及本次调试程序所取得的经验。如果程序未能通过,应分析其原因。

相关文档
相关文档 最新文档