实验一 编程环境和简单程序的运行
1.了解和使用 Visual C++集成开发环境编写运行简单的程序。
2.掌握 C 语言源程序的建立、编辑、修改、保存及编译、运行。
1.1 Visual C++ 6.0 编程环境
1.Visual C++ 6.0 界面
Visual C++ 6.0 集成开发环境被划分成 4 个主要区域:菜单栏和工具栏、项目工作区窗口、
代码窗口、输出窗口,如图 11 所示。
(1)菜单栏。Visual C++菜单栏包含了开发环境中几乎所有的命令,它为用户提供了代
码操作、
程序的编译、
调试、
窗口操作等一系列的功能。
与一般 Windows 应用程序一样有 File、
Edit、View、Insert、Project、Build、Tools、Window、Help 等菜单。
(2)工具栏。通过工具栏,可以迅速地使用常用的菜单命令。最常用的工具栏是标准工
具栏,当鼠标指向这些工具时,通常有信息提示工具的含义,因此也比较容易掌握。若要显示
或隐藏某个工具栏,则在任一工具栏的快捷菜单中选择相应的命令即可。
(3)项目工作区。项目是开发一个程序时需要的所有文件的集合,而工作区是进行项目
组织的工作空间。利用项目工作区窗口可以观察和存取项目的各个组成部分。在 Visual C++
中,一个工作区可以包含多个项目。
项目工作区有 Class View、ResourceView 和 File View 三个选项卡,分别用来浏览当前项
目所包含的类、资源和文件。
在 Visual C++中,项目中所有的源文件都是采用文件夹的方式进行管理的,它将项目名作
为文件夹,在此文件夹下包含源程序代码文件(.c、.h)、项目文件(.dsp)以及项目工作区文
件(.dsw)等。若要打开一个项目,只需打开对应的项目工作区文件即可。
图 11 Visual C++ 6.0 集成开发环境1)Class View:显示当前项目的类,全局的变量和函数也在这里显示。
2)File View:显示当前项目的源文件、头文件、资源文件等。
(4)代码窗口。一般位于开发环境中的右边,各种程序代码的源文件、资源文件、文档
文件等都可以通过该窗口显示。
(5)输出区。输出区有多个选项卡,最常用的是 Build。在编译、连接时,这里会显示有
关的信息,供调试程序用。
(6)状态栏。状态栏一般位于开发环境的最底部,它用来显示当前操作状态、注释、文
本光标所在的行、列号等信息。
2.C 程序的开发过程
在 Visual C++中,一个简单 C 程序的编写、运行过程是:
创建一个空工程 → 创建一个 C 源文件,输入源程序 → 进行编译、连接、运行
操作步骤如下:
(1)创建空工程。
1)选择 File→New 命令,弹出 New 对话框。
2)选择 Projects 选项卡,选择 Win32 Console Application(32 位控制台应用程序)
,输入
工程名:
p1_2,
确保单选按钮 Create new workspace 被选定,
输入工程位置:
F:\C\C_BOOK\p1_2
(注意 F:\C\C_BOOK 文件夹需要事先创建好)
,如图 12 所示。
项目工作 区窗口 代码窗口 输出窗口图 12 New 对话框
3)在随后弹出的向导对话框中,选择 An empty project,并单击 Finish 按钮,显示新建工
程的有关信息。
4)单击 OK 按钮,创建空工程的工作结束。
此时为工程 p1_2 创建了 F:\C\C_BOOK\p1_2 文件夹,并在其中生成 p1_2.dsp、p1_2.dsw、
Debug 文件夹(Debug 文件夹用于存放编译、连接过程中产生的文件)
。
(2)创建 C 源文件。
1)选择 File→New 命令,弹出 New 对话框。
2)选定 Files 选项卡,选定 C++ Source File,并输入源程序文件名 ex1_2.c,如图 13
所示。
图 13 新建 C++ Source File 对话框 工程类型
3)输入、编辑源程序。
在这个阶段中,F:\C\C_BOOK\p1_2 文件夹中创建了 ex1_2.c。
(3)编译、连接和运行。
选择 Build→Execute p1_2.exe 命令进行编译、连接和运行,会在输出区中显示有关信息,
如图 14 所示。若程序有错,则进行编辑。
图 14 编译和运行的界面编译、连接和运行可以分别执行。
1)编译(Ctrl+F7)
:选择 Build→Compile ex1_2.c 命令,编译结果显示在输出区中,如果
没有错误,则生成 ex1_2.obj。
2)连接(F7)
:选择 Build→Build p1_2.exe 命令,连接信息显示在输出区中,如果没有错
误,则生成 p1_2.exe。
3)运行(Ctrl+F5)
:选择 Build→Execute p1_2.exe 命令。
e1_1 工程的文件夹如图 15 所示。
图 15 p1_2 工程的文件夹是编译后产生的目标代码文件,p1_2.exe 是最终生成的可执行文件。
图 16 p1_2 工程调试后的 Debug 文件夹至此,一个简单 C 程序的编写、调试过程结束。
ex1_2.c 文件是最重要的一个文件,源程序保存在这个文件中,其他文件一般都是系统自
动生成的。但是,在 Visual C++中,仅有.c 文件是不能直接编译、连接的,需要首先用 Build
命令让系统自动创建一个工程并将 ex1_2.c 文件加入到该工程中,然后才能执行各种操作。因
此,程序员可以只复制.c 文件,若要复制整个工程的文件夹,也请删除 Debug 文件夹,因为
它占有相当多的存储空间。
1.2 利用 Visual C++ 6.0 编辑和调试下面的程序
【例 11】已知圆的半径,求圆的周长和面积。
(sy1_1.cpp)
程序如下:
#include <stdio.h> #define PI 3.14159 //预处理,宏定义 float area(int r) /*计算半径为 r 的圆面积函数*/ { return PI * r * r; //返回圆面积 } void main() { int r; /*声明圆半径 r 为整型变量*/ float l,s; /*声明周长 l、面积 s 为单精度浮点型变量*/ scanf("%d",&r); /*从键盘输入半径*/ l=2 * PI * r; /*计算周长 l 的值*/ s=area(r); /*计算面积 s 的值*/ printf("r=%d,l=%5.2f,s=%5.2f\n",r,l,s); /*输出圆的半径、周长和面积*/ }程序的运行结果如图 17 所示。
图 17 程序 exp1_1 的运行结果【例 12】参照教材中本章例题编写一个 C 程序,输出以下信息:
********************************** This is my first c program. ********************************** (sy1_2.cpp) // sy1_2.cpp #include <stdio.h> main() { printf("**********************************\n"); printf(" This is my first c program.\n"); printf("**********************************\n"); }实验二 简单的 C 语言编程
1.掌握 C 语言基本标识符的写法,能正确命名变量和文件。
2.掌握 C 语言数据类型的基本概念,熟悉如何定义整型、字符型、实型变量。
3.掌握 C 语言各种类型的常量。
4.学会使用 C 语言的算术运算符、赋值运算符、逗号运算符,能正确地运用它们构成表
达式。
5.掌握不同数据类型的数据混合运算时,数据类型的转换规则。
6.掌握 printf()和 scanf()函数。
【例 21】分析下面的程序,并上机验证运行结果。(sy2_1.cpp)
程序如下:
#include "stdio.h" void main() { int a, b, c; char c1, c2; a=97; b=65; c= 3; c1='a'; c2= 'A'; printf("a=%d, b=%d\n", a, b);printf("a=%c, b=%c\n", a, b); printf("c1=%d, c2=%d\n", c1, c2); printf("c1=%c, c2=%c\n", c1, c2); printf("c1=%c, c2=%c\n", c132, c2+32); }
程序运行结果如图 21 所示。
图 21 程序 exp2_1 的运行结果【例 22】分析下面的程序,并上机验证运行结果。
(sy2_2.cpp)
程序代码:
#include <stdio.h> void main() { printf("a\nbc d\tef\r"); printf("HIJK\tL\bM\n"); }【例 23】分析下面的程序,并上机运行。
(sy2_3.cpp)
程序代码:
#include <stdio.h> void main() { int i=10,j; j=++i + i++; printf("i=%d,j=%d\n",i,j); printf("++i=%d,i++=%d\n",++i,i++); printf("i=%d,j=%d\n",i,j); printf("i+j=%d,j++=%d\n",i+j,j++); printf("i=%d,j=%d\n",i,j); j=10; j=(++i)+(i++)+(++i); printf("i=%d,j=%d\n",i,j); i=10; j=(++i)+(++i)+(i++); printf("i=%d,j=%d\n",i,j); }运行程序,结果如图 22 所示。
图 22 程序 exp2_3 的运行结果需要认真思考的问题是,表达式中除了运算符本身的优先级外,还有一个结合性问题。
在(++i)+(++i)+(i++);中,因为存在两个同级的“+”运算,根据“+”运算符的左结合性,在
编译时,其实是先处理前面的(++i)+(++i)这部分,然后再将此结果再和(i++)相加。
【例 24】分析下面的程序,并上机验证运行结果。(sy2_4.cpp)
程序代码:
#include <stdio.h> void main() { char c= 65; int a; double d; /*自动类型转换*/ d = 100+'A'+10.0/5*2; printf("d=%lf\n",d); /*存在赋值类型转换*/ d = c; printf("c =%c,d=%lf\n",c,d); /*强制类型转换*/ d = 3.14159; a = (int)d; printf("a=%d\n",a); }运行结果如图 23 所示。
图 23 程序 exp2_4 的运行结果1.分析下列程序的运行结果。
#include <stdio.h> void main() { float x=3.5, y=4.5, z; int a=8, b=9; z=(float)(a+b)/2+(int)x%(int)y;printf("z=%.2f\n", z); }
2.分析下列程序的运行结果。
#include <stdio.h> void main() { int a, b, c; c=((a=10)%(b=20)<1) && ((a++)+10==++b); printf("a=%d,b=%d,c=%d\n", a, b, c); }3.编程实现,从键盘输入三个字母,输出其 ASCII 码,如果输入的是小写(或大写)字
母,则输出其相应的大写(或小写)字母。
实训三 选择结构程序设计
1.了解 C 语言表示逻辑量的方法(以 0 代表“假”
,以非 0 代表“真”
)
。
2.学会正确使用逻辑运算符和逻辑表达式。
3.熟练掌握 if 语句和 switch 语句。
【例 31】
以下程序的功能是:
从键盘输入一个字符型数据,
若输入一个数字字符‘0’~‘9’,
则将其转换成相应的整数显示出来;若输入其他字符,则显示出错信息。
(sy3_1.cpp)
程序代码:
#include<stdio.h> void main( ) { char c; scanf("%c",&c); if('0'<=c<='9') { c=c'0'; printf("c=%d\n",c); } else printf("data error!\n"); }实验步骤:
(1)上机调试以上程序;
(2)输入‘0’~‘9’之间的任何字符,验证输出结果是否和程序功能相符合;
(3)输入‘0’~‘9’之外的任何字符,例如,输入字母‘a’,验证输出结果是否和程序功能相
符合;
(4)将条件表达式 if('0'≤c≤'9')改为 if('0'≤c&&c≤'9'),重复(2)、(3)步骤。分析、比
较以上的输出结果,总结字符变量 c 的取值在‘0’~‘9’之间在 C 语言编程中的正确描述。
【例 32】有一函数
(
1)
2
1 (1
10)
(
10)
3
11
x
x
y
x
x
x
x
<
ì
ï
=
í
-
<
ï
-
î
≤
≥
用 scanf 函数输入 x 的值,求 y 的值。
(sy3_2.cpp)
分析:运行程序,输入 x 的值(分别为 x<1,1~10,x≥10)这 3 种情况,检查输出的值
是否正确。
此题类型为调试程序,其中有一些错误,请修改使之运行正确。
#include<stdio.h> void main() { int x,y; printf("输入 x: "); scanf("",&x); if(x<1) { y=x; printf("x=%3d, y=x=%d\n",x,y); } else if (x<10) { y=2*x1; printf("x=%3d, y=2*x1=%d\n",x,y); } else { y=3*x11; printf("x=%3d,y=3*x11=%d\n",x,y); } }【 例 33 】 下 列 程 序 的 输 出 结 果 是 _________ ( 要 求 先 分 析 结 果 然 后 上 机 调 试 )。
(sy3_3.cpp)
#include<stdio.h> main() { int a = 1, b = 0,m=0,n=0; switch (a) {case 1: switch (b) { case 0: m++; break; case 1: n++; break; } case 2: m++; n++; } printf("a=%d, b=%d\n", a, b); printf("m=%d, n=%d\n", m, n); }
1.以下程序求 3 个整数中的最小值,程序是否有错?若有错,请改正。
#include<stdio.h> main() { int a,b,c,t; scanf("%d,%d",&a,&b); if (a>b)&&(a>c) if (b<c) printf("min=%d\n",b); else printf("min=%d\n",c) if (a<b)&&(a<c) printf("min=%d\n",a) getchar(); }2.当 a=1、b=2、c=3、d=4 时,执行下面程序段后,x 的值是________。
if(a<b) if(c<d) x=1; else if (a<c) if(b<d) x=2; else x=3; else x=6; else x=7;3.有以下程序,输出结果是___________(要求先分析结果然后上机调试)
。
#include<stdio.h>main() { int a=6,b=7,m=1; switch(a%2) { case 0:m++; break; case 1:m++; switch(b%2) { defaut: m++; Case 0: m++; break; } } printf("%d\n",m); }
4.编程实现,不借助中间变量交换 a 和 b 中的值(提示:a=a+b;b=ab;a=ab;)
。
5.给一个不多于 5 位的正整数,要求:①求出它是几位数;②分别输出每一位数字;③
按逆序输出各位数字,例如原数为 321。
应准备以下测试数据:
l要处理的数为 1 位正整数;
l要处理的数为 2 位正整数;
l要处理的数为 3 位正整数;
l要处理的数为 4 位正整数;
l要处理的数为 5 位正整数;
l除此之外,程序还应当对不合法的输入做必要的处理,例如:输入负数,输入的数超
过 5 位(123456)。
实验四 循环结构程序设计
1.掌握在设计循环结构程序时,设定循环条件及控制循环的次数的方法。
2.了解计数式循环、标记式循环的基本编程方法。
3.掌握在嵌套循环结构中,提高程序效率的方法。
【例 41】你参加共有 8 门课程的期中考试,请从键盘依次输入这 8 门课程的成绩,由程
序统计你的总分与平时成绩。(sy4_1.cpp)
分析:程序处理部分应对每次输入的成绩进行累加,重复累加 8 次后计算得到总分,并
根据总分计算出平时成绩。
算法:
1.定义变量并初始化。所需的变量有:获取键盘输入成绩的变量 score,放置成绩总分的
变量 totalScore(初值为 0),放置平均成绩的变量 avgScore(初值为 0),注意由于平均成绩的
精度需要,各变量最好定义为 float 类型。
2.利用计数式循环重复执行 8 次,每次从键盘读取一门课程成绩,置入 score,并将其累
加到总成绩 totalScore 中。为控制循环次数,还需在此处理前定义一个循环控制变量 i,初值
为 1。
3.完成循环后,根据总成绩计算出平均成绩,并将总成绩与平均成绩显示出来。
lwhile 语句实现程序:
#include <stdio.h> void main() { /*变量初始化*/ float score,totalScore=0,avgScore=0; int i=1; /*循环处理部分*/ while(i<=8) { printf("请输入第%d 门课程的成绩:\t",i); scanf("%f",&score); totalScore += score; i++; } /*输出结果部分*/ avgScore = totalScore / 8; printf("\n 你的总成绩是%6.2f,平均成绩是%6.2f\n",totalScore,avgScore); } ldo…while 语句实现程序:
#include <stdio.h> void main() { float score,totalScore=0,avgScore=0; int i=1; do { printf("请输入第%d 门课程的成绩:\t",i); scanf("%f",&score); totalScore += score; i++; }while(i<=8);avgScore = totalScore / 8; /*输出结果部分*/ printf("\n 你的总成绩是%6.2f,平均成绩是%6.2f\n",totalScore,avgScore); } l
for 语句实现程序:
#include <stdio.h> void main() { float score,totalScore=0,avgScore=0; int i=1; for(i=1;i<=8;i++) { printf("请输入第%d 门课程的成绩:\t",i); scanf("%f",&score); totalScore += score; } avgScore = totalScore / 8; printf("\n 你的总成绩是%6.2f,平均成绩是%6.2f\n",totalScore,avgScore); }【例 42】为扩大此程序的适用范围,请编写程序能够保证在期末考试时(目前还不确定
期末考试要测试的课程总门数)也能完成总分和平均分的统计。
(sy4_2.cpp)
分析:由于不确定期末考试要进行测试的课程总门数,需要进行重复累加的次数也就无
法确定。此次可以让累加不断进行,直到其满足特定的条件。根据测试成绩的特点,可以设计
成当从键盘录入的成绩为负数时,
就表示所有课程成绩已经输入完毕。
此时累加总分工作完成,
即可由总分计算平时成绩。
由于平均成绩是根据输入课程的门数得到的,
就必须在录入成绩时
同时记录录入的门数。
l利用循环控制条件实现程序。
算法:
①定义变量并初始化,利用变量 number 记录课程门数。
②利用标志式循环重复执行,每次从键盘读取一门课程成绩,置入 score,并将其累加到
总成绩 totalScore 中,同时将课程门数加 1。为控制循环的反复执行,可将循环控制条件设置
为 score≥0,因此 score 变量必须先做初始化并保证其初始值满足循环控制条件。
③完成循环后,由于循环部分无论录入成绩为多少都立即进行了总成绩的累加,即最后
一次时肯定将最后那个负数作为单课成绩进行了累加,
在结果中就必须将其从总成绩中去除才
能得到正确的总成绩。然后再依据总成绩计算出平均成绩,并将总成绩与平均成绩显示出来。
代码:
#include <stdio.h> void main(){ /*变量初始化部分*/ float score=0,totalScore=0,avgScore=0; int number=0; /*反复执行直到输入一个负数为止*/ while(score≥0) { printf("请输入第%2d 门课程的成绩:\t",number+1); scanf("%f",&score); totalScore += score; number++; } /*注意将总成绩及课程门数还原成正确结果后再计算平均值*/ totalScore =score; avgScore = totalScore / (number1); /*输出结果部分*/ printf("\n 你的总成绩是%6.2f,平均成绩是%6.2f\n",totalScore,avgScore); } l