2024年1月17日发(作者:)

上机实验指导

实验一 C语言的运行环境和运行过程

一、实验实训目的及要求

1、C语言的运行环境,了解所用的计算机系统的基本操作方法,学会独立使用该系统。

2、了解在该系统上如何编辑、编译、连接和运行一个C程序。

3、通过运行简单的C程序,初步了解C源程序的特点。

二、实验内容

1、C的启动以及工作环境介绍。

2、在Visual C环境中运行C语言源程序

三、实验实训指导

Visual C++提供了一个集源程序编辑、代码编译与调试于一体的开发环境,这个环境称为集成开发环境,对于集成开发环境的熟悉程度直接影响程序设计的效率。开发环境是程序员同Visual C++的交互界面,通过它程序员可以访问C源代码编辑器、资源编辑器,使用内部调试器,并且可以创建工程文件。Microsoft Visual C++是多个产品的集成。Visual C++从本质上讲是一个windows应用程序。Visual C++有两个版本,对于每一个版本,都有对应的文档:

(1)专业版本,它包括一个更高级的优化编译器,更广泛的文档,并能设计基于DOS的应用程序。

(2)标准版本,其费用较低,没有那么高级的编译器,文档较少,且不能设计基于DOS的应用程序。

用鼠标单击“开始”、“程序”、“Microsoft Visual Studio 6.0”、“Microsoft Visual C++ 6.0”,然后打开一个工程文件,就会显示如图1.5.1所示的窗口,图中标出了窗口中各组成部分的名称,而且显示了已装入Graph工程文件的Visual C++ 6.0的开发环境,这是在建立了工程文件之后的结果。

菜单栏

1.File菜单

2.Edit菜单

3.View菜单

4.Insert菜单

5.Project菜单

6.Build菜单

7.Tools菜单

如下图

编辑C源程序

[例]一个C源程序。

#include

int add(int,int);

void main()

{

int a,b;

a=5;

b=7;

int c=add(a,b);

cout<<”a+b=”<

}

int add(int x,int y)

{

return x+y;

}

四、实验实训思考题

1、输入并运行例题中程序,熟悉调试C程序的的方法与步骤。

2、写出一个C程序的构成。

实验二 C语言的基础知识

一、实验实训目的及要求

1、掌握C语言数据类型,熟悉如何定义一个整型、字符型、实型变量,以及对它们赋值的方法,了解以上类型数据输出时所用的格式转换符。

2、学会使用C的有关算术运算符,以及包含这些运算符的表达式,特别是自加(++)和自减(--)运算符的使用。

3、进一步熟悉C程序的编辑、编译、连接和运行的过程。

二、实验实训内容

1、输入程序,运行出结果。

mian()

{

char c1 , c2;

c1=97;c2=98;

cout<

}

2、分析下程序,写出运行结果,再输入计算机运行,将得到的结果与你分析得到的结果比较对照。

main()

{

int i , j , m , n ;

i=8; j=10;

m=++i; n=j++;

cout<

}

三、实验实训指导

1、在此基础上

1)将第二行改为:

int c1, c2;

再使之运行。

3)再将第三行改为:

c1=300; c2=400;

再使之运行,分析其运行结果。

在该程序中,说明了字符型数据在特定情况下可作为整型数据处理,整型数据有时也可以作为字符型数据处理。

2、此程序主要考查自加、自减运算符以及复合运算符的用法。

四、实验实训思考题

1、“=”和“==”有什么区别?

2、“&”和“&&”、“|”和“||”有什么区别?

实验三 简单的C程序设计

一、实验实训目的及要求

1.理解C语言程序的顺序结构

2.掌握常用的C语言语句,熟练应用赋值、输入、输出语句。

二、实验实训内容

1、按格式要求输入/输出数据

#include "iostream.h"

main()

{

int a,b;

flost x,y;

char c1,c2;

cin>>a>>b;

cin>>x>>y;

cin>>c1>>&c2;

cout<

}

2、输入三角形三边长,求三角形面积。

#include “math.h”

main()

{

float a,b,c,s,area;

cin>>a>>b>>c;

s=1.0/2*(a+b+c);

area=sqrt(s*(s-a)*(s-b)*(s-c));

cout<

}

3、已知圆半径,圆柱高,求圆周长,圆柱体积。

main()

{

float r,h,l,v,pi;

pi=3.1415926;

cin>>r>>h;

l=2*pi*r;

v=pi*r*r*h;

cout<

cout<

}

4、输入一个摄氏温度,要求输出华氏温度。公式为f=5/9*c+32.

main()

{

float c,f;

cin>>c;

f=5.0/9*c+32;

cout<

}

三、实验实训指导

1、第一题运行程序,必须按如下方式在键盘上输入数据

a=3,b=7 ↙

8.5,71.82 ↙

a A ↙

2、修改输出格式控制符,观察输出结果的变化。

四、实验实训思考题

1、已知圆半径r=1.5,圆柱高h=3, 求圆周长,圆面积,圆球表面积,圆球体积,圆柱体积。

2、输入一个华氏温度,要求输出摄氏温度。公式为c=5/9*(f-32)。

实验四 选择结构程序设计

一、实验实训目的及要求

1、了解C语句表示逻辑量的方法(以0代表“假”以1代表“真”);

2、学会正确使用逻辑运算符和逻辑表达式;

3、熟练掌握if语句和switch语句。

二、实验实训内容

编写程序完成下列题目:

1、已知三个数a,b,c,找出最大值放于max中。

2、输入某学生的成绩,经处理后给出学生的等级,等级分类如下:

90分以上(包括90): A

80至90分(包括80):B

70至80分(包括70):C

60至70分(包括60):D

60分以下:E

3、有一函数:

x x1y=2x-1 1x10

3x-11 x10

用scanf函数输入x的值(分别为x<1,1~10,10三种情况),求y值。

三、实验实训指导

1、分析:由已知可得在变量定义时定义四个变量a,b,c和max,a,b,c是任意输入的三个数,max是用来存放结果最大值的。第一次比较a和b,把大数存入max中,因a,b都可能是大值,所以用if语句中if——else 形式。第二次比较max和c,把最大数存入max中,用if语句的第一种形式if形式。Max即为a,b,c中的最大值。

#include "iostream.h"

main()

{

int a,b,c,max; /*定义四个整型变量*/

cin>>a>>b>>c;

if (a>=b)

max=a; /*a>=b*/

else

max=b; /*a

if (c>max)

max=c; /*c是最大值*/

cout<<"max="<

}

若输入下列数据,分析程序的执行顺序并写出运行结果

(1)a=1,b=2,c=3

(2)a=2,b=1,c=3

(3)a=3,b=2,c=1

(4)a=3,b=1,c=2

(5)a=3,b=3,c=2

(6)a=2,b=1,c=2

2、方法一:(用if嵌套`)

分析:

由题意知如果某学生成绩在90分以上,等级为A;否则,如果成绩大于80分,等级为B;否则,如果成绩大于70分,等级为C;否则,如果成绩大于60分为D;否则,如果成绩小于60分,等级为E;但当我们输入成绩时也可能输错,出现小于0或大于100,这时也要做处理,输出出错信息。因此,再用if嵌套前,应先判断输入的成绩是否在0~100之间。

#include"iostream.h"

main()

{

int score;

char grade;

cout<<"nplease input a student score:";

cin>>score;

if(score>100||score<0)

cout<<"ninput error!";

else

{ if(score>=90)

grade='A';

else

{ if(score>=80)

grade='B';

else

{if(score>=70)

grade='C';

else

{ if(score>=60)

grade='D';

else grade='E';

}

}

}

cout<<"nthe student grade:"<

}

}

输入测试数据,调试程序。测试数据要覆盖所有路径,注意临界值,例如此题中得100分,60分,0分以及小于0和大于100的数据。

方法二:用switch语句

分析:

switch 语句是用于处理多分支的语句。注意,case后的表达式必须是一个常量表达式,所以在以用switch语句之前,必须把0~100之间的成绩分别化成相关的常量。所有A(除100以外),B,C,D类的成绩的共同特点是十位数相同,此外都是E类。则由此可得把score除十取整,化为相应的常数。

#include"iostream.h"

main()

{

int g,s;

char ch;

cout<<"ninput a student grade:";

cin>>g;

s=g/10;

if(s<0||s>10)

cout<<"ninput error!";

else

{ switch (s)

{ case 10:

case 9: ch='A'; break;

case 8: ch='B'; break;

case 7: ch='C'; break;

case 6: ch='D'; break;

default: ch='E';

}

cout<<"nthe student scort:"<

}

}

输入测试数据,同方法一一样调试程序并写出结果。

3、分析:y是一个分段表达式。要根据x的不同区间来计算y的值。所以应使用If语句。

main()

{

int x,y;

cout<<”please input x :”;

cin>>x;

if (x<1)

{

y=x;

cout<< “y=”<

}

else if (x<10) {

y=2*x-1;

cout<<“y=”<

}

else

{

y=3*x-11;

cout<<“y=”<

}

}

四、实验实训思考题

c语言如何表示“真”与“假”?系统如何判断一个量的“真”与“假”?

实验五 循环结构程序设计

一、实验实训目的及要求

熟练掌握while、do—while和for三种循环语句的应用。

二、实验实训内容

编写程序,完成下列题目:

1、求5!

2、求和s=1!+2!+3!

3、求和s=1!+3!+5!

4、求和s= 3+33+333

5、有一数列:2/1,3/2,5/3,8/5,„求出这个数列的前10项之和。

6、打印500以内的“水仙花数”。“水仙花数”是一个三位数,其各位数立方和等于该数本身。

7、一个数如果恰好等于它的因子之和,这个数就称为完数。求100之内的所有完数。

三、实验实训指导

1、程序清单:

main()

{

int n,t;

n=1;

t=1;

while(t<=5)

{

n=n*t;

t=t+1;

}

cout<

}

2、程序清单:

main()

{

int n,s=0,t=1;

for(n=1;n<=3;n++)

{

t=t*n;

s=s+t;

}

cout<

}

3、程序清单:

main()

{

int s=0,t,i,j;

for(i=1;i<=3;i++)

{

t=1;

for(j=1;j<=2*i-1;j++)

t=t*j;

s=s+t;

}

cout<

}

4、程序清单:

main()

{

int s=0,t=3,i;

for(i=1;i<=3;i++)

{

s=s+t;

t=10*t+3;

}

cout<

}

5、程序清单:

main()

{

int n,t,;

float a=2,b=1,s=0;

for(n=1;n<=10;n++)

{

s=s+a/b;

t=a;

a=a+b;

b=t;

}

cout<

}

6、程序清单:

main()

{

int i,j,k,n;

for(n=100;n<=500;n++)

{

i=n/100;

j=n/10-i*10;

k=n%10;

if(n= =i*i*i+j*j*j+k*k*k)

cout<

}

}

7、程序清单:

main()

{

int n,s,j;

for(n=1;n<=100;n++)

{

s=0;

for(j=1;j

if (n%j= =0)

s=s+j;

if (s= =n)

cout<

}

}

四、实验实训思考题

求Sn=a+aa+aaa+„+aa„a 之值,其中a是一个数字。例如:2+22+222+2222+22222(此时n=5), n由键盘输入(分别用while和for编程)。

实验六 函数

一、实验实训目的及要求

1、掌握C语言函数的定义方法、函数的声明及函数的调用方法。

2、了解主调函数和被调函数之间的参数传递方式。

二、实验实训内容

1、写一个判断素数的函数,在主函数输入一个整数,输出是否素数的信息。

2、写一函数,是给定的一个二位数组(4×4)转置,即行列互换。

3、写两个函数,分别求两个正数的最大公约数和最小公倍数,用主函数调用这两个函数并输出结果。两个正数由键盘输入。

4、写一函数,用“起泡法”对输入的10个字符按由小到大顺序排序。

三、实验实训指导

1、程序清单:

mian()

{

int number;

cout<< “请输入一个正整数:n”;

cin>>number;

if (prime(number))

cout<< “n %d是素数.”<

else

cout<<“n %d不是素数.”<

}

int prime(number) /*此函数用于判别素数*/

int number;

{

int flag=1,n;

for(n=2;n

if (number%n==0)

flag=0;

return(flag);

}

判断素数的算法,我们在以前学习循环的时候已经学过了,在这里只是把这个算法用函数的形式表示出来。这里我们要注意函数的

定义、声明的方法和格式。

2、程序清单:

/*矩阵的转置*/

#define N 4

int array[N][N];

convert(array)

int array[4][4];

{

int i,j,t;

for (i=0;i

for (j=i+1;j

{

t=array[i][j];

array[i][j]=array[j][i];

array[j][i]=t;

}

}

main()

{

int i,j;

cout<< “输入数组元素:n”;

for (i=0;i

for (j=0;j

cin>>array[i][j];

cout<< “n数组是:n”;

for (i=0;i

{

for (j=0;j

cout<

}

conver(array);

cout<< “转置数组是:n”;

for (i=0;i

{

for (j=0;j

cout<

}

}

本例题用数组作为函数参数,大家要注意数组作为函数参数时的用法。

3、程序清单:

#include "stdio.h"

hcf(u,v)

int u,v;

{

int a,b,t,r;

if(u>v)

{

t=u;

u=v;

v=t;

}

a=u; b=v;

while((r=b%a)!=0)

{

b=a; a=r;

}

return(a);

}

lcd(u,v,h)

int u,v,h;

{

return(u*v/h);

}

main()

{

int u,v,h,l;

cin>>u>>v;

h=hcf(u,v);

cout<<"H.C.F=%dn"<

l=lcd(u,v,h);

cout<<"L.C.D=%dn"<

}

这是一个十分典型的算法,同学们一定要认真分析、学习。

4、程序清单:

/*起泡法排序*/

#define N 10

char str[N];

main()

{

int i,flag;

for (flag=1; flag = =1;)

{

cout<< “n输入字符串,长度为10:n”;

cin>>str;

if (strlen(str)>N)

cout<<“超过长度,请重输!”;

else

flag = 0;

}

sort(str);

cout<< “n排序结果:”;

for (i=0;i

cout<

}

sort(str)

char str[N];

{

int i,j;

char t;

for (j=1;j

for (i=0;(i

if (str[i]>str[i+1])

{

t=str[i];

str[i]=str[i+1];

str[i+1]=t;

}

}

四、实验实训思考题

编写一个程序,包括主函数和如下子函数。

(1) 输入10个无序的整数;

(2) 用起泡方法从大到小排序;

(3) 要求输入一个整数,用折半查找法找出该数,若存在,在主函数中输出其所处的位置,否则,插入适当位置。

分析:input函数完成10个整数的录入。sort函数完成起泡法排序,search函数完成输入数的查找。

实验七 指针

一、实验实训目的及要求

1.掌握指针变量的定义与引用。

2.熟练使用函数指针、数组指针、字符串指针编写应用程序。

二、实验实训内容

1、写一函数,求一个字符串的长度。

2、编写一个函数,将数组中n个数按反序存放。

3、设一个函数,调用它时,每次实现不同的功能:(1)求两个数之和;(2)求两个数之差;(3)求两个数之积。

三、实验实训指导

1、分析:

(1) 本部分习题要求全部用指针完成;

(2) 在main函数中输入字符串,并输出其长度;

(3) 本题不能使用strlen()函数;

方法说明:

在主函数中定义一个指向字符串的指针变量pstr,并将输入的字符串的首地址赋值给pstr,然后调用求字符串长度的函数strlenth(char*p),得到字符串的长度。在函数strlenth(char

*p)中,判断*p是否为’ 0’ ,如果不为’ 0’ ,则进行len++的操作,直到遇到’ 0’ 为止。然后返回len值。

求字符串长度的函数strlenth(char *p)算法如下:

(1)定义int len=0;

(2)当*p!=’ 0’ 时,重复执行(2.1)(2.2),否则算法终止。

len=len+1

p++

(3)return(len)

2、分析:

(1)在主函数中输入10个数,并输出排好序的数。

(2)编写函数invert()将10个数按反序存放。

3、分析:

(1)在主函数中输入2个数a,b,并输出a,b的和、差和乘积。

(2)分别编写函数add()、sub()、mul()计算两个数的和、差、积。(3) 编写函数process(),分别调用函数add()、sub()、mul()。

四、实验实训思考题

实现指针移动的几种方法。

实验八 一维数组

一、实验实训目的及要求

1、掌握一维数组的定义、赋值和输入输出的方法;

2、掌握字符数组的使用;

3、掌握与数组有关的算法(例如排序算法)。

二、实验实训内容

1、在键盘上输入N个整数,试编制程序使该数组中的数按照从大到小的次序排列。

2、青年歌手参加歌曲大奖赛,有10个评委对她的进行打分,试编程求这位选手的平均得分(去掉一个最高分和一个最低分)。

3、输入一串字符,计算其中空格的个数。

三、实验实训指导

1、分析:C中数组长度必须是确定大小,即指定N的值。排序的方法有多种,我们取出其中两种作为参考。

方法一:起泡排序

从第一个数开始依次对相邻两数进行比较,如次序对则不做任何操作;如次序不对则使这两个数交换位置。第一遍的(N-1)次比

较后,最大的数已放在最后,第二遍只需考虑(N-1)个数,以此类推直到第(N-1)遍比较后就可以完成排序。

源程序如下:

#define N 10

#include"iostream.h"

main()

{

int a[N],i,j,temp;

cout<<"please input %d numbersn"<

for(i=0;i

cin>>a[i];

for(i=0;i

for(j=0;j

{

if(a[j]>a[j+1])

{

temp=a[j];

a[j]=a[j+1];

a[j+1]=temp;

}

}

cout<<"the array after sort:n";

for(i=0;i

cout<

}

方法二:选择排序

首先找出值最小的数,然后把这个数与第一个数交换,这样值最小的数就放到了第一个位置;然后,在从剩下的数中找值最小的,

把它和第二个数互换,使得第二小的数放在第二个位置上。以此类推,直到所有的值从小到大的顺序排列为止。

#include"iostream.h"

#define N 10

main()

{

int a[N],i,j,r,temp;

cout<<"please input %d numbersn"<

for(i=0;i

cin>>a[i];

for(i=0;i

{

r=i;

for(j=i+1;j

if(a[j]

r=j;

if(r!=i)

{

temp=a[r];

a[r]=a[i];

a[i]=temp;

}

}

cout<<"the array after sort:n";

for(i=0;i

cout<

}

2、分析:这道题的核心是排序。将评委所打的10个分数利用数组按增序(或降序)排列,计算数组中除第一个和最后一个分数以外

的数的平均分,其中排序部分这里用选择法实现。

main()

{int i,j,min;

float temp,ave=0;

float a[11];

cout<<"n输入评委所打的分数:n";

for(i=1;i<=10;i++)

cin>>a[i];

for(i=1;i<=9;i++)

{

min=i;

for(j=i+1;j<=10;j++)

if(a[min]>a[j])

{

min=j;

temp=a[i];

a[i]=a[min];

a[min]=temp;

}

}

for(i=2;i<=9;i++) /*注意i值的变化范围*/

ave=ave+a[i];

cout<<"选手所得最后分数:"<

}

3、程序清单:

#include

main( )

{

char c[30];

int i,sum=0;

gets(c);

for(i=0;i

if(c[i]==' ')

sum=sum+1;

cout<<"空格数为:"<

}

四、实验实训思考题

已有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中。

实验九 二维数组

一、实验实训目的及要求

1、掌握二维数组的定义、赋值和输入输出的方法;

2、掌握字符数组的使用;

3、掌握与数组有关的算法(例如排序算法)。

二、实验实训内容

1、有一个3×4的矩阵,要求输出其中值最大的元素的值,以及它的行号和列号。

2、打印以下图案:

* * * * *

* * * * *

* * * * *

* * * * *

* * * * *

3、求矩阵下三角形元素之和。

三、实验实训指导

1、程序清单:

#define M 3

#define N 4

main( )

{

int max,i,j,r,c;

static int a[M][N]={{123,94,-10,218},{3,9,10,-83},{45,16,44,-99}};

max=a[0][0];

for(i=0;i

for(j=0;j

if ( a[i][j]>max)

{

max= a[i][j];

r=i;

c=j;

}

cout<< “max=”<< max<<” row =”<

}

2、程序清单:

main()

{

char a[5]={' * ' , ' * ' , ' * ' , ' * ' , ' * '};

int i,j,k;

char space=' ';

for(i=0;i<5;i++) /*输出5行*/

{

cout<<"n"; /* 输出每行前先换行* /

cout<<" "; /* 每行前面留5个空格 */

for (j=1;j<=i;j++)

cout<

for ( k=0;k<5;k++)

cout<

}

}

3、程序清单:

#define N 6

main()

{

int i,j,sum=0;

int a[N][N]={0};

cout<<"input 5×5 data:n";

for(i=1;i

{

cout<<"Input the %d line data:n"<

for(j=1;j

cin>>a[i][j];

}

for(i=1;i

{

for(j=1;j

cout<

}

for(i=1;i

for(j=1;j<=i;j++)

sum=sum+a[i][j];

cout<<"sum="<

}

四、实验实训思考题

求一个3×3矩阵对角线元素之和。

实验十 结构体和共用体程序设计

一、实验实训目的及要求

1、掌握结构体类型和结构体变量的定义。

2、掌握结构类型变量的定义和使用;

3、掌握链表的概念,初步学会对链表进行操作;

4、掌握共用体的概念和使用。

二、实验实训内容

1、有五个学生,每个学生的数据包括学号,姓名,三门课的成绩,从键盘输入五个学生的数据,要求打印出每个学生的平均成绩,

以及最高分的学生的数据(包括学号,姓名,三门课的成绩,平均分数)。

2、三个人围成一圈,从第一个人开始顺序报号1,2,3。凡报到“ 3” 者退出圈子,找出最后流在圈子中的人原来的序号。

3、建立一个链表,每个结点包括:学号,姓名,性别,年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此

结点删去。

三、实验实训指导

用一个函数输入五个学生的数据;用一个函数求总平均分;用函数找出最高分学生数据,总平均分和最高分的学生的数据都在主函

数中输出。

四、实验实训思考题

用链表实现排序。