实验9 多线程程序设计

实验9 多线程程序设计
实验9 多线程程序设计

实验九多线程程序设计

一、实验目的

1、工作线程的创建;

2、多线程的创建;

3、主程序与线程间数据交换;

4、线程工作状态设置及修改。

二、实验要求

2.1 创建一个窗口,建立子菜单(创建线程(BEGIN_THREAD)、线程关闭(CLOSE)),利用创建线程BEGIN_THREAD,创建许多工作线程,利用线程关闭(CLOSE)所有线程。每个工作线程都对全局变量int gl_i加100,然后在线程中判别全局变量BOOL gl_bclose,当判别为线程结束时,将当前线程获得的gl_i在对话中显示(即中间对话中显示的值)。

注意,由于线程是一个简单的延时后累加的过程,所有随着控制线程是否结束的时间不同,得到的值是不相同的。

控制线程结束,利用线程关闭(CLOSE)实现对gl_bclose的修改。

2.2 同1,要求利用子菜单选择同时启动两个线程,在这两个线程中分别有各自的累加值并在线程中对其进行累加,不过要求两个线程有不同的优先级别,当线程关闭后,显示两线程当前的累计值。

2.3 编写一个线程,功能是将主程序通过利用参数传递方法传递给线程的一个整型数(或一个类)定时累加。建立一个对话窗口,有线程的‘启动’、‘挂起’/‘运行’和‘停止’三个按钮,‘启动按钮’实现启动一个线程,‘挂起’/‘运行’是一个按钮,是根据当前线程的状态设置,显然当线程在‘运行’状况,该按钮应该显示‘挂起’,反之,显示‘运行’,当按该按钮后,使线程处于挂起状态或运行状态,‘停止’按钮显然是停止该线程的运行。另有一个‘MOVE’按钮和一个编辑控件,按‘MOVE’按钮将当前线程中的整型值在编辑控件上显示。

目的:了解线程与主程序间的参数传递。

三、实验过程

3.1首先创建单文档工程,如下图:

3.2 第一部分──线程的创建与结束:

3.2.1添加全局变量:

int gl_i; //计数

BOOL gl_bclose;

//线程控制:true-结束所有线程;false-线程继续执行

3.2.2线程的创建:

线程靠一个CWinThread类的对象来管理,启动一个新线程的方法很简单,用到API函数的AfxBeginThread,定义如下:

CWinThread * AFXAPI AfxBeginThread

(AFX_THREADPROC pfnThreadProc, // 线程函数的地址

LPVOID pParam,//传送到线程函数的参数

int nPriority,// (可选的)线程的优先级,默认的是平常的优先级,

UINT nStackSize,// (可选的)线程的堆栈大小

DWORD dwCreateFlags, // (可选的)如果用户创建的线程在开始的时候在挂起态,而不在运行态,可以设置为

CREATE_SUSPENDED

LPSECURITY_ATTRIBUTES lpSecurityAttrs

// (可选的)线程的安全属性,默认的是和父线程的访问权限一样

);

函数AfxBeginThread 启动新线程并返回一个线程对象指针,然后,新线程和启动新线程的线程同时运行。函数的第一个参数指定线程函数。新线程首先执行这个函数,在这个函数中可以再调用其他函数完成新线程的工作,这个函数执行完毕返回时,新线程结束。线程函数不能是任意定义,必须定义如下:UINT ThreadFunction(LPVOID pParam);

这个函数必须被定义成全局函数,函数的返回类型必须是UINT,必须有一个LPVOID类型的参数,这个参数一般使用AfxBeginThread 函数的第二个参数pParam。函数的返回值在函数中任意定义(但不能返回特殊值

STILL_AVTIVE,它被定义成0X00000l03L,表示线程仍在运行,引起混淆)。

AfxBeginThread函数的具体用法可查阅MSDN。

3.2.3线程函数:

线程函数定义了线程要做什么,在进入这个函数的时候线程开始,退出的时候线程结束。这个函数称为线程函数,定义如下:

UINT ThreadFunction( LPVOID pParam );

这里:ThreadFunction 是线程函数名,就是启动线程函数的第一个参数pfnThreadProc。

参数LPVOID pParam 是启动线程函数的第二个参数,该参数是一个32位数,是在线程对象创建时传送给对象的构造函数。线程函数根据需要进行对参数进行处理,实际上,线程和主程序之间可以利用这个参数实现数据传递。

3.2.4终止线程:

线程终止由两种方法,一种是等待线程函数执行完毕后自动退出,线程退出后创建的线程对象是否自动删除,是由CWinThread 对象的一个成员变量

m_bAutoDelete决定,为TRUE时,线程执行后自动删除创建的CWinThread 对象,否则,在线程结束后,该对象并不删除,需要外部来删除。

可以在线程创建后对m_bAutoDelete 设置。

如:m_pDrawThread -> m_bAutoDelete = FALSE ;

这样,在线程执行结束后并不删除,需要外部去删除:

delete m_pDrawThread;

另一个终止线程的方法是调用MFC函数AfxEndThread:

void AFXAPI AfxEndThread( UINT nExitCode, BOOL bDelete );

延时计数可利用函数:

VOID Sleep(

DWORD dwMilliseconds// 延时长度(单位:毫秒)

);

实验九第一部分最终结果如下图:

第一部分程序如下:

class Ctest9 // 定义一个类

{

public:

Ctest9(){ m_i = 0 ;};

void Set( int i ) { m_i = i ;};

void SetId( int i ) { id = i; };

int Get() { return m_i ;} ;

int GetId() { return id ;} ;

void Inc() { m_i += 1 ;};

private:

int m_i; //累计值

int id; //线程编号} ;

UINT testThread1(LPVOID pParam) { //线程主函数//接收一个窗口类指针,然后设置窗口标题

HWND hWnd = (HWND)pParam; // 将传入的线程函数参数转换为窗口句柄

while(!gl_bclose) { // 判别gl_bclose是否为TRUE,否则线程继续运行Sleep(1000); //1s

gl_i += 100; //延时累加

}

char str[81] ;

wsprintf(str,"全局变量值:%d", gl_i);

AfxMessageBox( str ); // 显示gl_i 值

return 0; // 返回并退出线程

//或者调用void AfxEndThread( UINT nExitCode );来退出

}

void OnThreadCreate()

{

gl_bclose = FALSE;

HWND hWnd = GetSafeHwnd();

AfxBeginThread(testThread1, hWnd); // 创建工作线程

}

3.3 第二部分──创建优先级不同的双线程:

3.3.1 创建双线程:

虽然是创建双线程,但其实两个线程的内部工作方式相同,只是传递的参数不同,因此只需一个线程函数即可:

UINT testDoubleThread(LPVOID pParam);

然后利用3.2.2中提到的AfxBeginThread()来创建线程:

AfxBeginThread(testDoubleThread, pParam1,

THREAD_PRIORITY_ABOVE_NORMAL);

//创建第一个线程,优先级高于默认

AfxBeginThread(testDoubleThread, pParam2,

THREAD_PRIORITY_BELOW_NORMAL);

//创建第二个线程,优先级低于默认

3.3.2 终止双线程:

同样可以利用3.2中的全局变量gl_bclose来控制线程的结束。

最终结果如下图:

第二部分程序如下:

UINT testDoubleThread(LPVOID pParam) { //线程主函数Ctest9* pCtest9;

pCtest9 = (Ctest9*)pParam;

while (!gl_bclose)

{

Sleep(500);

pCtest9->Inc();

}

char str[81];

wsprintf(str, "线程%d累计值:%d",

pCtest9->GetId(),pCtest9->Get());

AfxMessageBox(str);

if( pCtest9 != NULL) { delete pCtest9 ;}

return 0;

}

void CMainFrame::OnDoublethreadCreate()

{

gl_bclose = FALSE;

Ctest9* pCtest9_1;

pCtest9_1 = new Ctest9;

pCtest9_1->SetId(1);

LPVOID pParam1 = (LPVOID)pCtest9_1;

AfxBeginThread(testDoubleThread, pParam1,

THREAD_PRIORITY_ABOVE_NORMAL);

//创建第一个线程,优先级高于默认

Ctest9* pCtest9_2;

pCtest9_2 = new Ctest9;

pCtest9_2->SetId(2);

LPVOID pParam2 = (LPVOID)pCtest9_2;

AfxBeginThread(testDoubleThread, pParam2,

THREAD_PRIORITY_BELOW_NORMAL);

//创建第二个线程,优先级低于默认

}

3.4 第三部分──线程的控制:

3.4.1 插入对话框,如下图:

3.4.1 为工程添加变量:

为3个EditBox分别添加成员变量:

int m_Value1; //计数初始值

int m_Value2; //计数增量

int m_Value3; //计数结果

四个按钮分别用来创建线程,暂停/运行,终止线程,显示最终结果。按钮的状态可由下面两个函数控制:

CButton::EnableWindow(BOOL bEnable);

//TRUE——可用;FALSE——不可用(变灰)

CButton::SetWindowText( LPCTSTR pszString);

//实现将按钮上的字符改变

添加全局变量:

bool pause_flag = FALSE; //线程结束标志

bool end_flag = FALSE; //线程挂起标志

int gl_last = 0; //全局变量,存放累加值最终结果如下图:

图1:创建线程

图2:线程挂起

图3:线程结束并显示结果

第三部分程序如下:

bool pause_flag = FALSE; //线程结束标志

bool end_flag = FALSE; //线程挂起标志

int gl_last = 0; //全局变量,存放累加值

class CTest9_3

{

public:

CTest9_3() {m_InitValue = m_Step = 0;}

void Inc() {m_InitValue += m_Step;}

int GetValue() {return m_InitValue;}

void SetValue(int v1,int v2) {m_InitValue = v1;m_Step = v2;} protected:

private:

int m_InitValue;

int m_Step;

}; //主程序与线程传递的参数

UINT testThread3(LPVOID pParam) {

CTest9_3* lpc = (CTest9_3*)pParam;

while (!end_flag) //线程是否结束?

{

while (pause_flag) //线程是否挂起?

{

Sleep(50); //线程休眠

}

Sleep(1000);

lpc->Inc(); //延时累加,1s

}

gl_last = lpc->GetValue(); //线程结束,保存累加值

if( lpc != NULL) { delete lpc ;}

return 0;

}

void OnThreadBegin()

{

end_flag = FALSE;

pause_flag = FALSE;

gl_last = 0; //初始化

UpdateData(TRUE); //获取输入的初始值以及步长值

CTest9_3* lpc;

lpc = new CTest9_3;

lpc->SetValue(m_InitValue, m_Step);

LPVOID pParam = (LPVOID)lpc; //定义线程操作的数据

CButton* button=(CButton*)GetDlgItem(IDC_THREAD_BEGIN);

button->EnableWindow(FALSE); //“启动”按钮失效(变灰)AfxBeginThread(testThread3,pParam); //启动线程

}

void OnThreadRunpause()

{

CButton*

button=(CButton*)GetDlgItem(IDC_THREAD_RUNPAUSE);

if (!pause_flag)

{

pause_flag = TRUE;

button->SetWindowText("运行"); //线程运行时显示“挂起”

}

else

{

pause_flag = FALSE;

button->SetWindowText("挂起"); //线程挂起时显示“运行”

}

}

void OnThreadEnd()

{

end_flag = TRUE; //通知线程结束

CButton* button=(CButton*)GetDlgItem(IDC_THREAD_BEGIN);

button->EnableWindow(TRUE); //使“启动”按钮恢复作用

}

void OnValueMove()

{

// TODO: Add your control notification handler code here

m_LastValue = gl_last;

UpdateData(FALSE); //将累加值传递给EditBox变量并在EditBox 中显示

}

实验二结构化程序设计题目及答案

C语言实验二题目及答案 第一次课(2学时): 必作实验: 1.编写程序,输入一个正整数,计算并显示该整数的各位数字之和,例如,整型数1987 的各位数字之和是1+9+8+7,等于25。 2.编写一个程序,找出被2,3,5整除时余数均为1的最小的10个自然数。 选作实验: 3. 编写一个程序,它打印出个位数是6、且能被3整除的所有三位正整数及其个数。要求一行打印8个数据。 4. 求N内的勾股数(A2+B2=C2)A、B、C。 参考答案: 1、答: #include void main( ) { int i,sum; int k; printf("\nEnter a integer:"); scanf("%d",&i); sum=0; while(i!=0) { k=i%10; /*取数字的最后一位*/ sum=sum+k; /*累加到计数器中*/ i=i/10; /*去掉数字的最后一位*/ } printf("sum is %d\n",sum); } 2、答: 程序如下: #include void main ( ) { int i=1; int count=0; printf ("\n能被2,3,5整除时余数为1的最小10个自然数是:\n"); while (count<=10) { if ((i%2==1)&&(i%3==1)&&(i%5==1)) { count++;

printf ("%d\n",i); } i++; } } 3、【解】题目中要求打印的是三位数,且个位数必须是6。因此可以for循环,它的循环控制变量从106开始,直到996为止,增量为10(因此要保证个位数是6)。由于还要打印这种数据的总个数,因此需要设置一个用于计数的变量,比如是count。发现一个这样的数,它就加1。为了满足一行打印8个数据要求,可以利用计数器count,让这样的数一个个地打印下去。如果count %8= =0,就打印一个回车换行。具体程序如下: #inc lud e void ma in( ) { int cou nt=0,j; for(j=106;j<=996;j+=10) { if(j%3!=0) cont inu e; else { coun t++; prin tf("%d\t",j); if(c oun t%8==0) prin tf("\n"); } } prin tf("\n The co unt is %d\n",co unt); } 运行此程序,输出结果如下图所示。 4、【解析】 (1)分析题意,建立数据模型,设计算法。 该问题可用枚举法实现,直接用C语言描述:

c语言实验报告4 循环结构程序设计

《C程序设计》课程实验报告 学院:班级:姓名:学号: 实验设备:计算机1台实验日期:2011年3月1日 实验项目名称循环结构程序设计 实验目的 掌握使用三种循环语句实现循环结构的方法。 实验要求:能用while~ do~while for 三种循环语句实现循环结构,编写简单的程序,掌握这三种循环语句。 实验内容(包括步骤):1.猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半另一个,以后每天早晨都吃剩下的一半另一个,到第十天早晨再想吃时,就剩一个桃子。问第一天共摘了多少桃子。 要求:分别用三种语句编写程序。 2.编写程序验证下列结论:任何一个自然数n的立方都等于n个连续奇数之和。例如:13=1;23=3+5;33=7+9+11;43=13+15+17+19。 要求:程序对每个输入的自然数计算并输出相应的连续奇数,直到输入的自然数为0时止。 3.编写程序,求1-3+5-7+…-99+101的值。 4.编写程序,求e的值。e ≈ 1+1/1!+1/2!+1/3!+1/4!+…+1/n! (1)用for循环,计算前50项。 (2)用while循环,要求直至最后一项的值小于10-6。 5.编写程序,输出从公元1600年至2000年所有闰年的年号。每输出5个年号换一行。判断公元年是否为闰年的条件是:

(1)公元年数如能被4整除,而不能被100整除,则是闰年。 (2)公元年数如能被400整除也是闰年。 6.编写程序,打印以下图形: * *** ***** ******* ***** *** * 7.输入一行字符,统计输入的字符中字母‘a’出现的次数(包括大小写)。 8.我国1991年有11.6亿人口,要求根据人口平均年增长率,计算从1991年算起经过多少年后我国的人口增加到15亿。 9.有一个四位数F=BBAA,前二位数相同,后二位数相同,此数又是某个自然数T的平方,求此数。 10.分解一个正整数的所有质因数 调试与结果测试:部分程序出现错误经过调整后调试正常,达到题目要求的结果,运行正常。

实验四分支和循环程序设计实验(精)

实验四分支和循环程序设计实验 一、实验要求和目的 1.熟悉汇编语言程序设计结构; 2.熟悉汇编语言分支程序基本指令的使用方法; 3.掌握利用汇编语言实现单分支、双分支、多分支的程序设计方法; 4.了解汇编语言循环程序设计的基本流程; 5.熟悉汇编语言循环基本指令的使用方法; 6.掌握利用汇编语言的循环指令完成循环程序设计方法。 二、软硬件环境 1、硬件环境:计算机系统 windows; 2、软件环境:装有 MASM、DEBUG、LINK、等应用程序。 三、实验涉及的主要知识 在实际应用中,经常根据一些条件来选择一条分支执行。汇编语言的条件判断主要是通过状态寄存器中的状态位、无符号数相减或有符号相减而导致的结果来进行。 1.无条件转移指令 JMP 无条件转移指令 JMP是使程序无条件转移至目标处,又分为段内转移、段间转移。 2.条件转移指令 JXX 条件转移指令可分为三大类: 1).简单条件转移指令指令。根据单个标志位的状态判断转移条件。标志位指令转移条件意义 CF JC CF=1 有进位/借位 JNC CF=0 无进位/借位 ZF JE/JZ ZF=1 相等/等于 0 JNE/JNZ ZF=0 不相等/不等于 0 SF JS SF=1 是负数 JNS SF=0 是正数 OF JO OF=1 有溢出 JNO OF=0 无溢出 PF

JP/JPE PF=1 有偶数个 1 JNP/JPO PF=0 有奇数个 1 2).无符号数条件转移指令。 假设在条件转移指令前使用比较指令,比较两个无符号数A,B,指令进行的的操作是 A-B,其转移指令如下: 指令转移条件意义 JA/JNBE CF=0 AND ZF=0 A>B JAE/JNB CF=0 OR ZF=1 A>=B JB/JNAE CF=1 AND ZF=0 AB JGE/JNL SF=OF OR ZF=1 A>=B JL/JNGE SF OF AND ZF=0 A

实验3 子程序设计

实验3子程序设计实验 [实验目的] 1.掌握利用堆栈传递参数的子程序调用方法。 2.掌握子程序递归调用方法。 3.过程调用伪指令: PROC,ENDP,NEAR和FAR。 4.8088指令: CALL,RET,RET n。 5.利用RET指令退出EXE文件的方法。 [实验重点和难点] 1.利用堆栈传递参数的子程序调用方法; [实验课时] 2学时 [实验仪器] 联想启天2400微型计算机。 [实验原理] 1.参考教材的汇编语言程序设计 2. [实验内容与步骤] 1.利用堆栈传递参数的子程序调用(求累加和) 程序内容: STACK SEGMENT STACK DB 256 DUP(0) STACK ENDS DATA SEGMENT ARY1 DB 1,2,3,4,5,6,7,8,9,10 COUNT1 EQU $-ARY1 SUM1 DW ? ARY2 DB 10,11,12,13,14,15,16,17,18 COUNT2 EQU $-ARY2 SUM2 DW ? DATA ENDS MAIN SEGMENT ASSUME CS:MAIN,DS:DATA,SS:STACK START PROC FAR PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV AX,COUNT1 PUSH AX LEA AX,ARY1 PUSH AX CALL FAR PTR SUM MOV AX,COUNT2 PUSH AX LEA AX,ARY2 PUSH AX CALL FAR PTR SUM RET START ENDP MAIN ENDS PROCE SEGMENT ASSUME CS: PROCE SUM PROC FAR MOV BP,SP MOV CX,[BP+6] MOV BX,[BP+4] XOR AX,AX ADN: ADD AL,[BX] ADC AH,0 INC BX LOOP ADN MOV [BX],AX RET 4 SUM ENDP PROCE ENDS END START 操作步骤: (1)输入,汇编并将此程序连接成EXE文件。

实验项目四结构化程序设计_循环结构

《程序设计基础I》实验报告实验项目四:结构化程序设计_循环结构

一、实验目的及要求 (1)熟悉掌握用while语句,do-while语句和for语句实现循环的方法。 (2)掌握在程序设计中用循环的方法实现一些常用算法(如穷举、迭代、递推等)。 (3)掌握多重循环的选择时机和使用方法; (4)掌握使用break和continue语句的方法。 二、实验设备(环境)及要求 使用Visual C++ 6.0;windows系列操作系统的环境。 三、实验内容与步骤(要求以“学号_姓名_题号”为名建立项目; 例项目名为:2013050201_***_01) 1.分别用while、do-while、for语句编程,求数列前20项之和:2/1,3/2,5/3,8/5,13/8······算法提示: 1)定义实变量sum、term、a、b、c,整变量i 2)初始化:sum=0,分子a=2,分母b=1 3)初始化:i(计数器)=1 4)计算第i项term =a/b 5)累加sum=sum+term 6)计算c=a+b,更新b= a,更新a=c 7)计数器加1,i++ 8)重复4、5、6、7,直到i>20 9)输出2位精度的结果

把每一次迭代结果输出,程序应做怎样的修改? 3输入正数n ,要求输出Fibonacci 数列的前n 项。1,1,2,3,5,8…… #include 开始 结束 term=0 sum=0 i=1 i ≤20? i=i+1 sum=sum+term term=term *i 输出sum 是 否 #include int main() {float term,sum;int i; term=1,i=1,sum=0; while(i<=20) {term=term*i; sum=sum+term; printf("sum=%.1f\n",sum); i++; } printf("sum=%f\n",sum); return 0; }

实验二顺序程序设计

实验二简单C程序设计—顺序结构 一、实验目的 1.掌握C语言中使用最多的一种语句――赋值语句的使用方法。 2.掌握各种类型数据的输入输出方法,能正确使用各种格式输出符。 二、实验内容和步骤 1.掌握各种格式输出符的使用方法。 #include int main() {int a,b; float d,e; char c1,c2; double f,g; long n,m; unsigned p,q; a=61;b=62; c1='a';c2='b'; d=3.56; e=-6.87; f=3156.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=%ld,n=%ld\np=%u,q=%u\n",f,g,m,n,p,q); return 0; } (1)运行此程序并分析运行结果。 a,b都是以整型输出。C1c2以字符型输出。d,e以浮点型输出,数据长度都为6位,所以前面都有空格占位,加上小数点,数字或负号一共6位。 f以浮点型输出,数据长度为15位,小数位有6位,故前面有四个空格;g以浮点型输出,数据长度为15位,小数位有12位,故前面有一个空格;m,n都以长整型输出;p,q都以无字符型输出。 (2)在此基础上,修改程序的第9-14行: a=61;b=62; c1=a;c2=b; f=3156,890121;g=0.123456789; d=f;e=g; p=a=m=50000;q=b=n=-60000; 运行程序,分析运行结果。 把a,b的值依次赋给c1,c2,c1,c2的数据类型为字符型,根Ascll代码可知61对应=,62对应>;将f,g的值赋给d,e,d,e的数据类型为浮点型,且数据长度为6位,小数位有2位,故得出此结果;按照运算符的结合顺序可知程序把50000依次赋给了m,p,a,把-60000

循环结构程序设计实验报告

嘉应学院计算机学院 实验报告 课程名称程序设计基础实验名称实验地点 指导老师实验时间提交时间 班级姓名座号 一、实验目的和要求 (1)熟悉掌握用while语句、do…while语句和for语句实现循环的方法。 (2)掌握在程序设计中用循环的方法实现一些常用算法(如穷举、迭代、递推等)。 (3)进一步学习调试程序。 二、实验环境和方法 实验方法: (一)综合运用课本所学的知识,用不同的算法实现在不同的程序功能。 (二)结合指导老师的指导,解决程序中的问题,正确解决实际中存在的异常情况,逐步改善功能。 (三)根据实验内容,编译程序。 实验环境:Windows xp Visual C++6.0 三、实验内容及过程描述 实验步骤: ①进入Visual C++ 6.0集成环境。 ②输入自己编好的程序。 ③检查一遍已输入的程序是否有错(包括输入时输错的和编程中的错误),如发现有错, 及时改正。 ④进行编译和连接。如果在编译和连接过程中发现错误,频幕上会出现“报错信息”, 根据提示找到出错位置和原因,加以改正。再进行编译,如此反复直到不出错为止。 ⑤运行程序并分析运行结果是否合理。在运行是要注意当输入不同的数据时所得结果 是否正确,应运行多次,分别检查在不同情况下结果是否正确。 实验内容:编译以下题目的程序并调试运行。 (1)输入一行字符,分别统计出其中的英文字母、空格、数字和其它字符的个数。 编写程序如下: #include int main() { char c; int letters=0,space=0,digit=0,other=0; printf("请输入一行字符:\n"); while((c=getchar())!='\n')

实验项目三:结构化程序设计(选择结构)

实验项目三:结构化程序设计(选择结构)

《程序设计基础I》实验报告实验项目三:结构化程序设计_选择结构 学号1605120308 姓 名 何峰 专业、班 级 计算机 类03 实验时间2016年11月 30日星期三 实验 地点 机房6 指导教师孙爱蓉 一、实验目的及要求 (1)了解C语言表示逻辑量的方法(以0代表” 假”,以非0代表”真”)。 (2)学会正确使用逻辑运算符和逻辑表达式。 (3)熟练掌握if语句和switch语句。 (4)结合程序掌握一些简单的算法。 (5)学习调试程序。 二、实验设备(环境)及要求 使用Visual C++ 6.0;windows系列操作系统的环境。 三、实验内容与步骤(要求以“学号_姓名_题号”为名建立项目;例项目名为:2013050201_***_01) 1.输入一个华氏温度f,要求输出摄氏温度c。公

式为c=5/9(f-32)。 输出要求有文字说明,取2位小数。 【算法提示】 华氏温度f 摄氏温度c 100.25 37.92 0.5 -17.50 23.78 -4.57 1) 定义实变量 c,f 2) 提示输入"Please enter f:" 3) 读入f 4) 根据公式 计算c 5) 打印两位精度的结果

2. 有一函数 用scanf 函输入x 的值,求y 值。 【算法提示】 1) 定义实变量x,y 2) 提示输入"Please enter x:" 3) 读入x 4) 判断x 所在的区间,对应出y 的计算公式并 求值(进一步细化) 5) 打印结果。 要求:每道题目分别画出程序流程图,书写程 结 开输输c=5/ #include int main() {float c,f ; printf(“plea se enter

实验2顺序结构程序设计

《C语言程序设计》实验报告 ---------------------------------------------------------------------------------------------- 实验2顺序结构程序设计 一、实验目的 (1)掌握C语言中赋值语句的使用方法。 (2)掌握各种类型数据的输入与输出方法,能正确使用各种格式转换符。(3)掌握C语言的顺序结构程序设计。 二、实验内容与步骤 1.输入程序,观察程序运行结果 (1)输入并运行下面的程序,掌握用scanf()函数输入多个整型数据时,格式说明中无分隔符的正确使用。 /*c2-1.c*/ #include int main() { int i,j; printf("Enter i,j\n"); scanf("%d%d",&i,&j); printf("i=%d,j=%d\n",i,j); return 0; } 总结与反思: 1.printf("Enter i,j\n");语句是对下面的输入语句起提示作用;2. 本题在scanf()语句中,输入两个整数之间可用空格、Tab或回车键分隔,但用其他的分隔符不能得到正确的值。 (2)输入并运行下面的程序,掌握用scanf()函数输入多个整型数据时,格式说明中逗号分隔符的正确使用。 /*c2-2.c*/ #include int main() { int i,j; printf("Enter i,j\n");

scanf("%d,%d",&i,&j); printf("i=%d,j=%d\n",i,j); return 0; } 总结与反思:本题在scanf()语句中,输入两个整数之间必须用逗号分割,用 其他的分隔符时第一个变量能得到正确的值,第二个变量不能得到正确的值。(3)输入并运行下面的程序,掌握格式scanf()函数中普通字符按原样输入的使用方法。 /*c2-3.c*/ #include int main() { float i,j; scanf("i=%f,j=%f",&i,&j); printf("i=%.3f,j=%.3f\n",i,j); return 0; } 总结与反思:用scanf()函数输入内容,必须严格按照格式说明部分进行键入。 (4)输入并运行下面的程序,如果scanf()函数中格式与变量类型的对应关系错误,将不能得到正确的结果。 /*c2-4.c*/ #include int main() { int i,j; scanf("%f,%f",&i,&j); printf("i=%d,j=%d\n",i,j); return 0; } 总结与反思:1.与int(基本整型)对应的应是%d,与float(浮点型)对应的是%f。 2.scanf()函数格式说明应与定义的变量类型一致! (5)输入一个大写字母A,将它转换为小写字母a,输出小写字母a及对应的ASCII码值97,要求输出格式为“j=a,j=97”,完善下面程序中的输出语句。 /*c2-5.c*/ #include int main() { int j;char i; scanf("%c",&i); j=i+32; printf("j=%c,j=%d\n",j,j);

C语言循环结构程序设计实验报告

甘肃政法学院 本科生实验报告 ( 五) 姓名:赵明翔 学院:公安技术学院 专业:安全防范工程 班级: 2015级安全防范工程班 实验课程名称:程序设计 实验日期:2016年月日 开课时间:2015学年第二学期

(2)输出所有的水仙花数,所谓水仙花数是指一个3位数,其各位数字李方和等于该数本身。例如,153是水仙花数,因为153=12+53+33程序如下: #include int main() { int i,j,k,n; printf("paicissus numbers are"); for (n=100;n<1000;n++) { i=n/100; j=n/10-i*10; k=n%10; if(n==i*i*i+j*j*j+k*k*k) printf("%d",n); } printf("\n"); return 0; } 运行结果: (3)猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又

多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下了1个桃子了。求第一天共摘了多少桃子。 程序如下: #include int main() { int day,x1,x2; day=9; x2=1; while(day>0) {x1=(x2+1)*2; x2=x1; day--; } printf("total=%d\n",x1); return 0; } 运行结果: (4)①用牛顿迭代法求方程0634223=-+-x x x 在1.5附近的根. #include #include int main() {double x1,x0,f,f1; x1=1.5; do {x0=x1; f=((2*x0-4)*x0+3)*x0-6; f1=(6*x0-8)*x0+3; x1=x0-f/f1;

宏指令及子程序设计实验

实验五:宏指令及子程序设计实验 院系名称:电子工程学院 学生姓名:李倩(33) 专业名称:电子信息工程 班级:电子0808

宏指令及子程序设计实验 5.5.1 实验目的 1、熟悉宏指令、宏定义、宏调用以及宏展开的概念;掌握宏指令的定义与调用的方法。 2、掌握子程序的定义、调用以及调用程序与子程序之间参数的传递方法。 3、了解宏指令与子程序的异同以及各自的适用场合。 5.5.2 实验预习要求 1、复习宏指令的定义与调用方法。 2、复习过子程序的定义与调用方法。 3、根据“2.5.3 实验内容”中给出的流程图和程序框架编写源程序,以便上机调试。 4、从“2.5.4 实验习题”中任选一道题目,编写源程序,以便上机调试。 5.5.3 实验内容 从键盘输入10个无符号十进制数(小于256),将其转换为二进制数并存放在NUM字节型变量中,找出其中的最大数,并将找出的最大数在 屏幕上显示出来。 要求: ①在屏幕上显示字符串提示信息的 功能由宏指令DSTRING实现; ②将键盘输入的十进制数转换成二 进制数由子程序DTOB实现; ③在N个无符号字节型二进制数中 找出最大数的功能由子程序FMAX实现; ④将一个无符号字节型二进制数转 换为十进制数并在屏幕上显示的功能由子 程序BTOAD实现。 程序运行结果如右图所示。 1、编程指导 (1)显示提示信息的宏指令DSTRING的编写 宏指令通常用于在程序中需要反复使用但所需指令条数又不是很多的情形;而对于需要经常使用且需要较多指令才能完成的功能通常通过子程序调用来实现。这是因为,从执行速度上看,由于子程序调用涉及到保护断点的操作,因此,子程序调用比宏调用执行时间相对要稍长一些;但从生成的可执行文件的大小方面考虑,子程序调用生成的文件要小一些。读者在进行汇编语言程序设计时,应综合考虑两者的利弊,以便进行合理选择。 下面给出实现提示信息显示的宏指令的定义: DSTRING MACRO STRING PUSH DX PUSH AX MOV DX,OFFSET STRING MOV AH,09H INT 21H POP AX POP DX ENDM 请读者注意,宏指令应该先定义,后调用。因此,宏定义通常紧跟在代码段中段寄存器赋值指令之

实验二+顺序结构程序设计

实验二顺序结构程序设计 一、实验学时 2学时 二、实验目的 (一)掌握简单结构的C语言程序设计; (二)掌握输入、输出函数的正确使用。 三、预习要求 熟悉并掌握scanf()函数,printf()函数,getchar()函数和putchar()函数的语法格式,比较它们在使用时的异同。 四、实验内容 (一)输入并运行下面的程序,掌握scanf()函数输入多个整型数据时,格式说明中无分隔符的正确使用。 main ( ) { int i,j; scanf("%d%d",&i,&j); printf("i=%d,j=%d\n",i,j); } 注意:运行程序时,当调用格式输入函数scanf()时,首先返回用户屏幕,等待用户从键盘上输入两个整数并回车,程序才能继续向下执行。 从键盘上为变量i,j赋值32和18时,两个整数之间可用空格、Tab或回车键分隔。试一试,用其它的分隔符输入时各个变量,能否得到正确值。 (二)输入并运行下面的程序,观察与上一程序的区别。注意:printf("Enter i,j\n");语句对下面的输入语句起提示作用。 main ( ) { int i,j; printf("Enter i,j\n"); scanf("%d%d",&i,&j); printf("i=%d,j=%d\n",i,j); } 注意:运行程序时,先执行printf("Enter i,j\n");,当调用格式输入函数scanf()时,返回用户屏幕,屏幕上会有提示Enter i,j,等待用户从键盘上输入两个整数。 (三)输入并运行下面的程序,掌握scanf()函数输入多个整型数据时,格式说明中逗号分隔符的正确使用。 main ( ) { int i,j; printf("Enter i,j\n"); scanf("%d,%d",&i,&j); printf("i=%d,j=%d\n",i,j); }

循环程序设计实验

循环程序设计实验 实验目的 1、掌握循环程序的设计方法。 2、掌握比较指令、转移指令和循环指令的使用方法。 3、进一步掌握调试工具的使用方法。 实验预习要求 复习比较指令、条件转移指令和循环指令。 复习循环程序的结构、循环控制方法等知识。 读懂“实验内容”中给出的将十进制数转换为二进制数以及将二进制数转换为十进制数的程序。 根据“实验内容”中给出的流程图和程序框架编写源程序,以便上机调试。 从“实验习题”中任选一道题目,编写源程序,以便上机调试。 实验内容 计算1+2+……n=,其中n通过键盘输入。要求在屏幕上提供如下信息: Please input a number(1627): ;出现此信息后通过键盘输入一个小于628的无符号整数 1+2+…..n=sum;其中n为用户输入的数,sum为所求的累加和 程序运行情况如下图所示(说明:图中所运行程序允许累加和不大于一个32位二进制数所能表示的范围)。编程指导 键盘输入的十进制数如 368在计算机中是以 33H,36H,38H形式存 放的,如何将它们转换 为一个二进制数0B,以 便对累加循环的循环次 数进行控制是本程序首 先要解决的问题。将键 盘输入的十进制数转换为二进制数的程序清单如下: DATA SEGMENT INF1 DB "Please input a number (0-65535):$" IBUF DB 7,0,6 DUP() DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS:DATA START: MOV A X, DATA MOV DS, AX MOV DX, OFFSET INF1 MOV AH, 09H INT 21H MOV DX, OFFSET IBUF ;键入一个十进制数(<65535) MOV AH, 0AH INT 21H MOV CL, IBUF+1 ;十进制数的位数送CX MOV CH, 0 MOV SI, OFFSET IBUF+2 ;指向输入的第一个字符(最高位)

Java结构化程序设计

. 昆明理工大学信息工程与自动化学院学生实验报告 ( 2012—2013学年 第 一 学期 ) 课程名称:Java 程序设计 开课实验室:442 2012年 11月 7 日 一、实验目的及内容 目的:掌握和巩固Java 结构化程序设计的概念、方法。 内容: 1. (使用&&、||、^运算符)编写一个程序,该程序让用户输入一个整数,然后判断该整数是否能 同时被5和6整除;是否能被5或6整除;是否能被5或6整除,但不能同时被5和6整除。 例如:在命令行模式下该程序运行可呈现如下结果(注,也可以图形界面方式实现) Enter an integer: 10 Is 10 divisible by 5 and 6? false Is 10 divisible by 5 or 6? true Is 10 divisible by 5 or 6, but not both? true 2. 编写一个程序(利用循环)计算下面式子: 3. 写一个函数,该函数返回一个数组中值最小的元素的索引值,若该数组中值最小的元素多于一 个,则返回索引最小的那个,该函数的声明如下所示,在main 函数中调用并测该函数。 public static int indexOfSmallestElement(int[] list) 二、要求 1. 给出上述程序的流程图、代码和测试结果。 100 999998...433221+++++

内容一: 流程图: .

实验代码 import java.util.Scanner; public class Class1 { public static void main(String[] args) { Scanner input=new Scanner(System.in); System.out.print("Enter an integer:"); int numble=input.nextInt(); boolean numble1=(numble%5==0)&&(numble%6==0); boolean numble2=(numble%5==0)||(numble%6==0); boolean numble3=(numble%5==0)^(numble%6==0); System.out.println("is "+numble+" divisible by 5 and 6?"+numble1); System.out.println("is "+numble+" divisible by 5 or 6?"+numble2); System.out.println("is "+numble+" divisible by 5 or 6,but not both?"+numble3); } } 运行结果: .

循环程序设计实验

2.4 循环程序设计实验 2.4.1 实验目的 1、掌握循环程序的设计方法。 2、掌握比较指令、转移指令和循环指令的使用方法。 3、进一步掌握调试工具的使用方法。 2.4.2 实验预习要求 1、复习比较指令、条件转移指令和循环指令。 2、复习循环程序的结构、循环控制方法等知识。 3、读懂“2.4.3 实验内容”中给出的将十进制数转换为二进制数以及将二进制数转换为十进制数的程序。 4、根据“2.4.3 实验内容”中给出的流程图和程序框架编写源程序,以便上机调试。 5、从“2.4.4 实验习题”中任选一道题目,编写源程序,以便上机调试。 2.4.3 实验内容 计算1+2+……n=?,其中n通过键盘输入。要求在屏幕上提供如下信息: Please input a number(1 627): ;出现此信息后通过键盘输入一个小于628的无符号整数 1+2+…..n=sum;其中n为用户输入的数,sum为所求的累加和 程序运行情况如下图所示(说明:图中所运行程序允许累加和不大于一个32位二进制数所能表示 的范围)。 1、编程指导 (1)键盘输入的十进 制数如368在计 算机中是以 33H,36H,38H 形式存放的,如 何将它们转换为 一个二进制数 101110000B,以便对累加循环的循环次数进行控制是本程序首先要解决的问题。将键盘输入的十进制数转换为二进制数的程序清单如下: DA TA SEGMENT INF1 DB "Please input a number (0-65535):$" IBUF DB 7,0,6 DUP(?) DA TA ENDS CODE SEGMENT ASSUME CS: CODE, DS:DATA START: MOV AX, DATA MOV DS, AX MOV DX, OFFSET INF1 MOV AH, 09H INT 21H MOV DX, OFFSET IBUF ;键入一个十进制数(<65535) MOV AH, 0AH INT 21H MOV CL, IBUF+1 ;十进制数的位数送CX MOV CH, 0

实验一简单程序设计实验

实验一:简单程序设计实验 (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

程序的设计基础(VB)综合性实验1

实验一小学生四则运算测试器 一、实验目的 1.掌握面向对象程序设计语言的开发思想; 2.掌握结构化程序设计方法; 3.掌握标签、文本框、按钮的属性、事件和方法; 4.掌握常用的运算符、函数和表达式。 二、实验环境 Windows XP 操作系统 Visual Basic 6.0 编程环境 三、实验容 参考如下图所示,编制一个适合小学生练习的四则运算测试题程序。 具体要求如下: (1)窗体的标题为“小学生四则运算测试器”。

(3)窗体的从上到下,从左到右分别为标签1,文本框1,按钮1,按钮2,标签2。其中标签1,标签2默认标题容为空,文本框文本容为空,按钮1,按钮2默认标题容分别为“统计”和“结束”。 (4)标签2设置有边框线,背景颜色为白色。 (5)程序运行时,标签1自动产生小学生四则运算题目,其中操作数为1~9之间的随机整数,运算符为+、-、*、/四种符号之一。 (6)文本框1接受用户输入答案,输完答案后按键盘中的回车键,系统将题目和用户回答答案显示在标签2中,并在后面给出对或错的评判标志(注意:评判标志对齐在同一列输出)。同时产生新的题目,清空文本框1,以便用户继续回答新题目。 (7)单击按钮1,结束回答,标签1和文本框1变为灰色不可用状态,同时标签2显示“一共做了几题,作对几题,得分为多少”的提示;单击按钮2,结束程序。 (8)提高与拓展:每次运行程序,让产生的题目是真正的随机数据;为适合小学生练习,避免产生两数相减结果为负数的题目。 (9)运行效果如下图所示: 提示: 1.产生题目的算法思路: Private Sub Form_Load()

Randomize n1 = Int(Rnd * 10 + 1)‘产生操作数1,为1~10之间的随机整数 n2 =…‘产生操作数2,为1~10之间的随机整数 fhn = Int(Rnd * 4 + 1)‘产生一个1~4之间的随机整数,分别表示4种运 算符号 …‘多分支选择结构,根据fhn变量为1~4的值不同,分别表示四种运算符 Select Case fh Case "+" zq = n1 + n2 …‘根据运算符的不同,计算出正确答案,放在zq变量中 End Select ?Label1.Caption = n1 & fh & n2 & "="‘产生题目 End sub× 2.文本框输入答案后按回车键 Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then‘当用户按了回车键是触发该事件 …‘当用户回答正确,显示题目和正确标注,回答错误,显示题目和错误标注,并给正 确或错误个数分别加1 Form_Load‘调用产生题目的事件代码,产生新的题目 … End If 四、实验过程 编写程序代码,进行上机验证和调试,得出正确结果。 五、知识点梳理: 1.运算符 算术运算符:+、-、*、/ 字符串连接运算符:& 2.函数 Int(N):产生一个不大于N的最大整数 Rnd:产生一个[0,1)之间的随机小数

实验一 顺序结构程序设计

实验一顺序结构程序设计 一、实验目的 1. 掌握C语言数据类型,熟悉如何定义一个整型、字符型、实型变量,以及对它们赋值的方法,了解以上类型数据输出时所用的格式转换符。2 2. 学会使用有关算术运算符,以及包含这些运算符的表达式。 3. 掌握数据的输入输出方法,能正确使用各种格式转换符。 二、实验学时数 4学时 三、实验内容和步骤 1..启动TC 2.0编译系统,进入编辑界面,建立一个新文件。文件名自定。(要求每个学生建立一个自己的文件夹,每个同学的练习和作业的源程序命名形成系列,便于检查、查找和考核)。 利用一个小程序验证常量、变量的使用方法与特点,验证数据类型和表达式值的计算规则及其输出格式。 参考程序: main( ) { char c1,c2; c1=97;c2=98; printf(″%c,%c\n″,c1,c2); } (1)在此基础上加入以下printf语句,并运行。 printf(″%d,%d\n″,c1,c2); (2)将第二行改为以下语句,并运行。 int c1,c2; (3)将第三行改为以下语句,并运行。 c1=300;c2=400; 分别写出三次运行结果。 2.编程并调试运行 (1)编程序,用getchar函数读入两个字符给c1、c2,然后分别用putchar函数和printf 函数输出这两个字符。上机运行此程序,比较putchar和printf函数输出字符的特点。 (2)试编写程序,从键盘输入一个大写字母,要求改用小写字母输出。 3.写出下面程序的运行结果: 1)main() { int x=1,y=1,z=1; y=y+x; x=x+y; printf(″%d\n″,x); printf(″%d\n″,y); } 2) main()

微机原理与汇编语言_实验3_循环程序设计实验汇总

微机原理与汇编语言 实验报告 姓名x x x学号xxxxxx 专业班级计科x班 课程名称微机原理与汇编语言实验日期2014.10.22 实验名称循环程序设计实验成绩 一、实验目的 1、掌握循环程序的设计方法。 2、掌握比较指令、转移指令和循环指令的使用方法。 3、进一步掌握调试工具的使用方法。 二、实验内容 1、实验原理 (1)键盘输入的十进制数如368在计算机中是以33H,36H,38H形式存放的,如何将它们转换为一个二进制数101110000B,以便对累加循环的循环次数进行控制是本程序首先要解决的问题 (2)累加结果为一个16位的二进制数,为了显示结果,必需把它们转换为十进制数 2、实验步骤 (1)流程图 (2)实验源码 .model small .stack ;定义堆栈段 .data ;定义数据段 inf1 db "Please input a number(1-627):$" inf2 db 0ah, 0dh, "1+2+......+$" ibuf db 7, 0, 6 dup(0) obuf db 6 dup(0) .code start: mov ax, @data mov ds, ax mov dx, offset inf1 ;将屏幕输入的十进制数(存放于ibuf)转化为二进制数存储于ax 中 mov ah, 09h int 21h mov dx, offset ibuf mov ah, 0Ah int 21h mov cl, ibuf+1 mov ch, 0 mov si, offset ibuf+2 mov ax, 0 loop1: mov dx, 10 mul dx and byte ptr [si], 0Fh add al, [si] 从键盘输入一个十进制数,并将其转换为二进制数,存放在AX中 开始 结束 素、、 (CX)-1=0 累加循环次数送CX(MOV CX,AX)AX清0(AX中存放累加和) BX送1(BX存放每次循环累加的数,每循环一次,BX值加1) ADD AX,BX INC BX 累加和(在AX中)转换为十进制数并 显示 Y N

相关文档
最新文档