• 沒有找到結果。

C语言程序设计实验与实训教程 - 万水书苑-出版资源网

N/A
N/A
Protected

Academic year: 2021

Share "C语言程序设计实验与实训教程 - 万水书苑-出版资源网"

Copied!
15
0
0

加載中.... (立即查看全文)

全文

(1)

实验一 编程环境和简单程序的运行 

1.了解和使用 Visual C++集成开发环境编写运行简单的程序。 

2.掌握 C 语言源程序的建立、编辑、修改、保存及编译、运行。 

1.1  Visual C++ 6.0 编程环境 

1.Visual C++ 6.0 界面 

Visual C++ 6.0 集成开发环境被划分成 4 个主要区域:菜单栏和工具栏、项目工作区窗口、

代码窗口、输出窗口,如图 1­1 所示。

(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)以及项目工作区文

(2)

件(.dsw)等。若要打开一个项目,只需打开对应的项目工作区文件即可。

图 1­1  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 文件夹需要事先创建好)

,如图 1­2 所示。

项目工作 区窗口 代码窗口 输出窗口

(3)

图 1­2  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,如图 1­3 

所示。

图 1­3  新建 C++ Source File 对话框 工程类型

(4)

3)输入、编辑源程序。

在这个阶段中,F:\C\C_BOOK\p1_2 文件夹中创建了 ex1_2.c。

(3)编译、连接和运行。

选择 Build→Execute p1_2.exe 命令进行编译、连接和运行,会在输出区中显示有关信息,

如图 1­4 所示。若程序有错,则进行编辑。

图 1­4  编译和运行的界面

编译、连接和运行可以分别执行。 

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 工程的文件夹如图 1­5 所示。

图 1­5    p1_2 工程的文件夹

(5)

是编译后产生的目标代码文件,p1_2.exe 是最终生成的可执行文件。

图 1­6    p1_2 工程调试后的 Debug 文件夹

至此,一个简单 C 程序的编写、调试过程结束。 

ex1_2.c 文件是最重要的一个文件,源程序保存在这个文件中,其他文件一般都是系统自

动生成的。但是,在 Visual  C++中,仅有.c 文件是不能直接编译、连接的,需要首先用 Build 

命令让系统自动创建一个工程并将 ex1_2.c 文件加入到该工程中,然后才能执行各种操作。因

此,程序员可以只复制.c  文件,若要复制整个工程的文件夹,也请删除  Debug  文件夹,因为

它占有相当多的存储空间。 

1.2 利用 Visual C++ 6.0 编辑和调试下面的程序

【例 1­1】已知圆的半径,求圆的周长和面积。

(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);  /*输出圆的半径、周长和面积*/  } 

程序的运行结果如图 1­7 所示。

图 1­7  程序 exp1_1 的运行结果

(6)

【例 1­2】参照教材中本章例题编写一个 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()函数。

【例 2­1】分析下面的程序,并上机验证运行结果。(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);

(7)

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", c1­32, c2+32);  } 

程序运行结果如图 2­1 所示。

图 2­1  程序 exp2_1 的运行结果

【例 2­2】分析下面的程序,并上机验证运行结果。

(sy2_2.cpp)

程序代码: 

#include <stdio.h>  void main()  {  printf("a\nbc d\tef\r");  printf("HIJK\tL\bM\n");  } 

【例 2­3】分析下面的程序,并上机运行。

(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);  } 

运行程序,结果如图 2­2 所示。

图 2­2  程序 exp2_3 的运行结果

(8)

需要认真思考的问题是,表达式中除了运算符本身的优先级外,还有一个结合性问题。

在(++i)+(++i)+(i++);中,因为存在两个同级的“+”运算,根据“+”运算符的左结合性,在

编译时,其实是先处理前面的(++i)+(++i)这部分,然后再将此结果再和(i++)相加。

【例 2­4】分析下面的程序,并上机验证运行结果。(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);  } 

运行结果如图 2­3 所示。

图 2­3  程序 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;

(9)

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 语句。

【例 3­1】

以下程序的功能是:

从键盘输入一个字符型数据,

若输入一个数字字符‘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");  }

(10)

实验步骤:

(1)上机调试以上程序;

(2)输入‘0’~‘9’之间的任何字符,验证输出结果是否和程序功能相符合;

(3)输入‘0’~‘9’之外的任何字符,例如,输入字母‘a’,验证输出结果是否和程序功能相

符合;

(4)将条件表达式 if('0'≤c≤'9')改为 if('0'≤c&&c≤'9'),重复(2)、(3)步骤。分析、比

较以上的输出结果,总结字符变量 c  的取值在‘0’~‘9’之间在 C  语言编程中的正确描述。

【例 3­2】有一函数 

(

1) 

2

1 (1

10) 

(

10) 

3

11 

y

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*x­1;  printf("x=%3d,    y=2*x­1=%d\n",x,y);  }  else  {  y=3*x­11;  printf("x=%3d,y=3*x­11=%d\n",x,y);  }  } 

【 例  3­3 】 下 列 程 序 的 输 出 结 果 是 _________ ( 要 求 先 分 析 结 果 然 后 上 机 调 试 )。

(sy3_3.cpp) 

#include<stdio.h>  main()  {  int a = 1, b = 0,m=0,n=0;  switch (a)  {

(11)

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>

(12)

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=a­b;a=a­b;)

。 

5.给一个不多于 5 位的正整数,要求:①求出它是几位数;②分别输出每一位数字;③

按逆序输出各位数字,例如原数为 321。

应准备以下测试数据:

l

要处理的数为 1 位正整数;

l

要处理的数为 2 位正整数;

l

要处理的数为 3 位正整数;

l

要处理的数为 4 位正整数;

l

要处理的数为 5 位正整数;

l

除此之外,程序还应当对不合法的输入做必要的处理,例如:输入负数,输入的数超

过 5 位(123456)。

实验四 循环结构程序设计 

1.掌握在设计循环结构程序时,设定循环条件及控制循环的次数的方法。 

2.了解计数式循环、标记式循环的基本编程方法。 

3.掌握在嵌套循环结构中,提高程序效率的方法。

【例 4­1】你参加共有 8 门课程的期中考试,请从键盘依次输入这 8 门课程的成绩,由程

序统计你的总分与平时成绩。(sy4_1.cpp)

分析:程序处理部分应对每次输入的成绩进行累加,重复累加  8  次后计算得到总分,并

(13)

根据总分计算出平时成绩。

算法: 

1.定义变量并初始化。所需的变量有:获取键盘输入成绩的变量 score,放置成绩总分的

变量 totalScore(初值为 0),放置平均成绩的变量 avgScore(初值为 0),注意由于平均成绩的

精度需要,各变量最好定义为 float 类型。 

2.利用计数式循环重复执行 8 次,每次从键盘读取一门课程成绩,置入 score,并将其累

加到总成绩  totalScore  中。为控制循环次数,还需在此处理前定义一个循环控制变量  i,初值

为 1。 

3.完成循环后,根据总成绩计算出平均成绩,并将总成绩与平均成绩显示出来。

while 语句实现程序: 

#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);  }  l 

do…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);

(14)

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);  } 

【例 4­2】为扩大此程序的适用范围,请编写程序能够保证在期末考试时(目前还不确定

期末考试要测试的课程总门数)也能完成总分和平均分的统计。

(sy4_2.cpp)

分析:由于不确定期末考试要进行测试的课程总门数,需要进行重复累加的次数也就无

法确定。此次可以让累加不断进行,直到其满足特定的条件。根据测试成绩的特点,可以设计

成当从键盘录入的成绩为负数时,

就表示所有课程成绩已经输入完毕。

此时累加总分工作完成,

即可由总分计算平时成绩。

由于平均成绩是根据输入课程的门数得到的,

就必须在录入成绩时

同时记录录入的门数。

l

利用循环控制条件实现程序。

算法:

①定义变量并初始化,利用变量 number 记录课程门数。

②利用标志式循环重复执行,每次从键盘读取一门课程成绩,置入  score,并将其累加到

总成绩 totalScore 中,同时将课程门数加 1。为控制循环的反复执行,可将循环控制条件设置

为 score≥0,因此 score 变量必须先做初始化并保证其初始值满足循环控制条件。

③完成循环后,由于循环部分无论录入成绩为多少都立即进行了总成绩的累加,即最后

一次时肯定将最后那个负数作为单课成绩进行了累加,

在结果中就必须将其从总成绩中去除才

能得到正确的总成绩。然后再依据总成绩计算出平均成绩,并将总成绩与平均成绩显示出来。

代码: 

#include <stdio.h>  void main()

(15)

{  /*变量初始化部分*/  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 / (number­1);  /*输出结果部分*/  printf("\n 你的总成绩是%6.2f,平均成绩是%6.2f\n",totalScore,avgScore);  }  l

利用 break 语句实现程序。

算法:

①定义变量并初始化。

②每次从键盘读取一门课程成绩,置入  score,检测其是否为负数,如果不是负数则将其

累加到总成绩 totalScore 中,同时将课程门数加 1;否则直接中止循环的执行。

③完成循环后,再根据总成绩计算出平均成绩,并将总成绩与平均成绩显示出来。

代码: 

#include <stdio.h>  void main()  {  float score=0,totalScore=0,avgScore=0;  int number=0;  /*反复执行直到输入一个负数为止*/  while(1)  {  printf("请输入第%2d 门课程的成绩:\t",number+1);  scanf("%f",&score);  if(score<0)break; /*当 score 为负数时,循环结束,也不用进行成绩累加*/  totalScore += score;  number++;  }  avgScore = totalScore / number ;  printf("\n 你的总成绩是%6.2f,平均成绩是%6.2f\n",totalScore,avgScore);  }

參考文獻

相關文件

• 也就是 ”我的dp是n^3”這句話本身不夠表示你的dp演算法,必須 要說“我的dp是個狀態n^2,轉移n”才夠精確. •

也就是設定好間隔時間(time slice)。所有的 程序放在新進先出的佇列裡面,首先CPU

• 提供程序性指導 程序性指導 程序性指導 程序性指導(procedural facilitation),而非實 質性指導(substantive

Augmented reality (AR) is a live direct or indirect view of a physical, real-world environment whose elements are augmented (or supplemented) by computer-generated sensory input

C-C-6 用一般語言及數學語言說明解題的過程 C-C-8 能尊重他人解決數學問題的多元想法 C-E-4 能評析解法的優缺點.

衡量一个地区或一个国家水资源的丰歉 程度的指标:

是偏振光。 光的偏振现象应用很广,如汽车夜间行车时,为了避免 对方汽车的灯光晃眼以保证行车安全,可以在所有汽车的车窗玻 璃和车灯前装上与水平方向成

Thomson)也 完成了 电子衍射实验 。 他是在 德布 罗意 理论 的启发下进 行实