C语言程序设计实验指导书(自己写) - V2.1

更新时间:2023-11-24 11:19:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《程序设计基础》实验指导书

(第一版)

(14~26学时)

信息学院

《程序设计基础》教研组

2011年3月1日

目 录

前 言 ............................................................................................................................................................... 1 实验一 C程序的运行环境和简单C源程序的调试 ................................................................................... 2

一、实验学时 ........................................................................................................................................... 2 二、实验目的 ........................................................................................................................................... 2 三、预习要求 ........................................................................................................................................... 2 四、实验内容 ........................................................................................................................................... 2 五、实验注意事项 ................................................................................................................................... 7 六、思考题 ............................................................................................................................................... 7 实验二 数据类型、运算符和表达式 ........................................................................................................... 9

一、实验目的 ........................................................................................................................................... 9 二、实验要点 ........................................................................................................................................... 9 三、实验要求 ........................................................................................................................................... 9 四、实验内容 ........................................................................................................................................... 9 五、思考与总结 ..................................................................................................................................... 10 实验三 选择结构程序设计 ..........................................................................................................................11

一、实验学时 ..........................................................................................................................................11 二、实验目的 ..........................................................................................................................................11 三、预习要求 ..........................................................................................................................................11 四、实验内容 ..........................................................................................................................................11 五、实验注意事项 ................................................................................................................................. 13 六、思考题 ............................................................................................................................................. 14 实验四 循环结构程序设计(一) ............................................................................................................. 16

一、实验学时 ......................................................................................................................................... 16 二、实验目的 ......................................................................................................................................... 16 三、预习要求 ......................................................................................................................................... 16 四、实验内容 ......................................................................................................................................... 16 五、实验注意事项 ................................................................................................................................. 20 六、思考题 ............................................................................................................................................. 20 实验五 循环结构程序设计(二) ............................................................................................................. 22

一、实验学时 ......................................................................................................................................... 22 二、实验目的 ......................................................................................................................................... 22 三、预习内容 ......................................................................................................................................... 22 四、实验内容 ......................................................................................................................................... 22 五、实验注意事项 ................................................................................................................................. 24 六、思考题 ............................................................................................................................................. 24 实验六 一维数组程序设计 ......................................................................................................................... 26

一、实验学时 ......................................................................................................................................... 26 二、实验目的 ......................................................................................................................................... 26 三、预习要求 ......................................................................................................................................... 26 四、实验内容 ......................................................................................................................................... 26 五、实验注意事项 ................................................................................................................................. 28 六、思考题 ............................................................................................................................................. 28 实验七 二维数组程序设计 ......................................................................................................................... 30

一、实验学时 ......................................................................................................................................... 30 二、实验目的 ......................................................................................................................................... 30 三、预习要求 ......................................................................................................................................... 30 四、实验内容 ......................................................................................................................................... 30 五、实验注意事项 ................................................................................................................................. 34 六、思考题 ............................................................................................................................................. 35 实验八 字符数组程序设计 ......................................................................................................................... 37

一、实验学时 ......................................................................................................................................... 37

二、实验目的 ......................................................................................................................................... 37 三、预习要求 ......................................................................................................................................... 37 四、实验内容 ......................................................................................................................................... 37 五、实验注意事项 ................................................................................................................................. 39 六、思考题 ............................................................................................................................................. 39 实验九 函数 ................................................................................................................................................. 41

一、实验学时 ......................................................................................................................................... 41 二、实验目的 ......................................................................................................................................... 41 三、预习要求 ......................................................................................................................................... 41 四、实验内容 ......................................................................................................................................... 41 五、实验注意事项 ................................................................................................................................. 46 六、思考题 ............................................................................................................................................. 46 实验十 指针(一) ..................................................................................................................................... 49

一、实验学时 ......................................................................................................................................... 49 二、实验目的 ......................................................................................................................................... 49 三、预习要求 ......................................................................................................................................... 49 四、实验内容 ......................................................................................................................................... 49 五、实验注意事项 ................................................................................................................................. 51 六、思考题 ............................................................................................................................................. 51 实验十一 指针(二) ................................................................................................................................. 52

一、实验学时 ......................................................................................................................................... 52 二、实验目的 ......................................................................................................................................... 52 三、预习要求 ......................................................................................................................................... 52 四、实验内容 ......................................................................................................................................... 52 五、实验注意事项 ................................................................................................................................. 53 六、思考题 ............................................................................................................................................. 53 实验十二 结构体、共用体和位运算 ......................................................................................................... 55

一、实验学时 ......................................................................................................................................... 55 二、实验目的 ......................................................................................................................................... 55 三、预习要求 ......................................................................................................................................... 55 四、实验内容 ......................................................................................................................................... 56 五、实验注意事项 ................................................................................................................................. 59 六、思考题 ............................................................................................................................................. 59 实验十三 文件 ............................................................................................................................................. 60

一、实验学时 ......................................................................................................................................... 60 二、实验目的 ......................................................................................................................................... 60 三、预习要求 ......................................................................................................................................... 60 四、实验内容 ......................................................................................................................................... 60 五、实验注意事项 ................................................................................................................................. 62 六、思考题 ............................................................................................................................................. 62 附录:常见错误提示信息的英汉对照 ......................................................................................................... 63

前 言

C 语言是现代最流行的通用程序设计语言之一,它既具有高级程序设计语言的优点,又具有低级程序设计语言的特点,既可以用来编写系统程序,又可以用来编写应用程序。因此,C 语言正在被迅速地推广和普及。上机实验是该课程教学的一个重要环节,因此要求学生做一定数量的上机实验。本指导书可增强同学上机实验的针对性。整个教学和实验中,采用VC++6.0 作为实验环境,强调学生切实培养动手实践能力,掌握调试程序的方法,通过调试理解 C语言程序运行的过程以及C 语言的语法规则,为后续的课程设计,计算机等级考试及其他应用做好充分的准备。

本实验指导书通过大量的实例,循序渐进地引导学生做好各章的实验。根据实验教学大纲,共选择编写了13个实验,其中必做11个,选做 2个 。每个实验内容结构如下:

(1)实验学时 (2)实验目的 (2)预习要求 (4)实验内容 (5)实验注意事项 (6)思考题

其中思考题属于扩展应用部分,学生可以根据自己的学习情况选择完成。

在实验之前,要求学生对实验作好预习工作。在实验中,学生根据实验指导中的内容进行验证与总结,然后再去完成实验内容中安排的任务。一般要求准备好相关代码,实验课中最好以调试和讨论为主。

实验结束后,应及时提交实验报告,报告具体内容可根据实验内容和实验要求进行增删。实验报告一般要求包含:

(1)实验题目

(2)设计思路或算法分析 (3)流程图 (4)程序源代码

(5)程序运行结果及分析 (6)存在的问题。

1

实验一 C程序的运行环境和简单C源程序的调试

一、实验学时

2学时

二、实验目的

(一)掌握在Visaul C++ 环境如何编辑、编译和运行C源程序; (二)掌握C语言的各种数据类型以及整型、字符型、实型变量的定义; (三)掌握C语言中有关算术运算符及表达式的使用。

三、预习要求

熟悉C程序的书写规则、上机调试步骤;熟悉C语言的数据类型;熟悉C语言表达式的构成、运算规则等内容。

(一)Visual C++6.0 集成开发环境简介

由于这些年C++语言程序的普及,Visual C++6.0集成开发环境作为一种功能强大的程序编译器也被相当多的程序员所使用,使用Visual C++也能够完成C语言的编译。

由于Visual C++集成开发环境运行于Windows下,对于习惯于图形界面的用户来说是比较易学的,因此,简要介绍一下如何用Visual C++来完成C语言程序的设计。Visual C++也有多种版本,本书中使用比较普及的Visual C++ 6.0集成开发环境。

(二)Visual C++6.0 集成开发环境安装

Visual C++中文版集成开发环境的安装比较简单,在输入SETUP执行后,可以按照提示信息完成程序安装,在这里不再详述。

四、实验内容

(一) 创建一个新的文件夹

为了方便管理自己的C语言程序,在启动Visual C++ 6.0集成开发环境前,首先在E盘创建一个新的文件夹,以便存放自己的C语言程序。

(二) 启动Visual C++ 6.0集成开发环境

如图1-1所示,单击“开始”→“程序”→Microsoft Visual Studio 6.0→Microsoft Visual C++ 6.0,就可以启动Visual C++ 6.0集成开发环境。

启动后的Visual C++ 6.0集成开发环境如图1-2所示。

(三)开始一个新程序

1.创建文件

单击主菜单中的“文件”→“新建”菜单命令,弹出“新建”对话框,在“新建”对话框中选择“文件”选项卡。在左边列出的选项中,选择“C++ Source File”;在右边的相应对话框中,输入文件名称“c1-1.c”及保存的位置,如图1-3所示。单击“确定”按钮。

2

图1-1 启动Visual C++ 6.0的方法

图1-2 Visual C++ 6.0 中文版集成开发环境

E盘新建的文件夹

图1-3 创建新的C源文件

进入Visual C++ 6.0集成环境的代码编辑窗口,如图1-4所示。

图1-4 Visual C++ 6.0集成环境的代码编辑窗口

2.代码编辑

在Visual C++ 6.0代码编辑窗口中,输入如下所示的源代码,完成后如图1-4中所示。程序代码: /* c1-1.c C语言的第一个程序 */ #include \

3

void main( ) { printf(\ *\\n\ printf(\ printf(\ }

3.程序的编译、连接与运行

将C语言源代码编译成计算机能执行的目标代码。

单击主菜单下的“组建”→“编译 [c1-1.c]”(或者是工具栏上的按钮或按快捷键Ctrl+F7),此时将弹出一个对话框,询问是否创建一个项目工作区,选择“是(Y)”。Visual C++ 6.0集成开发环境会自动在c1-1.c文件所在文件夹中建立相应的项目文件。

编译时,在下方的输出框中将显示出相应的编译说明,如图1-5所示。 如果代码编译无误,最后将显示: c1-1.obj - 0 error(s), 0 warning(s)

这说明编译没有错误(error)和警告(warning),生成目标文件c1-1.obj,程序编译顺利完成。目标文件(.obj)不能被计算机直接执行,接下来将目标文件(.obj)和相关的库函数或目标程序连接成为可执行程序(.exe)。

工具栏编译按钮 编译信息窗口 图1-5 Visual C++ 6.0 集成环境下编译源程序

单击主菜单下的“组建”→“批组建”命令,将弹出如图1-6所示的对话框。

图1-6 Visual C++ 6.0 集成环境下批组建对话框

确保选中“c1-1-Win32 Release”复选框,这样生成的可执行文件才是发行版的程序,否则生成的是调试(Debug)版的程序。

单击“创建”按钮,生成可执行文件c1-1.exe。如果在“批组建”对话框中选中了两个复选框,可以看到程序中生成了两个c1-1.exe可执行文件,一个文件为调试版本,存储在与c1-1.c同一文件夹下的Debug文件夹中;另一个是发行版本,保存在与c1-1.c同一文件夹下的Release文件夹中。

这一步只是为了生成发行版的程序文件,只有在程序准备发行时才需要执行这种编译。在通常

4

情况下,可以单击主菜单下的“组建”→“组建 [c1-1.exe]”(或工具栏按钮或按快捷键F7),直接生成调试版本程序就可以了。

编译、连接完成后, c1-1.exe已经是一个独立的可执行程序,可以在Windows 资源管理器中直接执行,也可以在Visual C++ 6.0集成开发环境中运行。

单击主菜单下的“组建”→[执行c1-1.exe](或工具栏按钮或按快捷键Ctrl+F5),此时弹出一个控制台程序窗口,程序正确运行,如图1-7所示。按任意键后返回Visual C++ 6.0集成开发环境。

图1-7 Visual C++ 6.0 集成环境下程序运行结果

4.关闭工作空间

当第1~3步工作完成后,应该将工作保存下来,并关闭工作空间,以便做下一个新的程序。单击主菜单下的“文件”→“保存全部”,然后再单击“文件”→“关闭工作空间”菜单命令,询问确认要关闭所有文档窗口,选择“是(Y)”。

(四)按照(三)的操作,输入下面的程序,运行并查看输出结果。

/* c1-2.c C语言的第二个程序 */ #include \void main( ) { int c,a=3,b=5; c=a+b;

printf(\ }

(五)打开已有的文件

在打开已有的文件时一定要先确认关闭了工作空间,然后单击主菜单下的“文件”→“打开”命令,选择(三)创建的c1-1.c文件,然后打开。

(六)重新开始一个新的程序

关闭所有工作空间,点击Visual C++ 6.0窗口的关闭按钮即可退出Visual C++ 6.0集成环境,按照(二)、(三)再次进入Visual C++ 6.0集成环境,输入以下程序:

/* c1-3.c C语言的第三个程序 */ #include \void main( ) { int a=38;

printf(\printf(\ }

注意观察两个printf函数语句输出结果有何不同?

(七)在Visual C++ 6.0集成环境,输入以下程序:

/* c1-4.c C语言的第四个程序 */ #include \void main( )

{ long int a=32767;

printf(\printf(\printf(\ }

5

将程序中的a改为a=65535,并再次运行程序,观察结果。

(八)在Visual C++ 6.0集成环境,,输入以下程序:

/* c1-5.c C语言的第五个程序 */ #include \void main( )

{ char c1=97,c2=98;

int a=97,b=98;

printf(\printf(\printf(\ }

观察程序运行结果,掌握int与char类型数据的互通性。

(九)在Visual C++ 6.0集成环境,输入以下程序:

/* c1-6.c C语言的第六个程序 */ #include \void main( ) { int a,b;a=2; b=1%a;

printf(\ printf(\

printf(\ %f\\n\ }

观察程序运行结果,从中掌握类型转换运算符的使用。

(十)在Visual C++ 6.0集成环境,输入以下程序:

/* c1-7.c C语言的第七个程序 */ #include \void main( ) { int i,j; i=3; j=4;

printf(\ printf(\

printf(\ }

观察程序运行结果,从中掌握自加自减运算符的使用。

(十一)在Visual C++ 6.0集成环境,输入以下程序

/* c1-8.c C语言的第八个程序 */ #include \void main( ) { int a,b;a=5; a-=a*a;

printf(\ b=(a=3*5,a*4,a+5);

printf(\ }

观察程序运行结果,从中掌握复合赋值运算符、逗号运算符的使用。

(十二)下面程序,计算输出当x=2.5,a=7,y=4.7时,表达式

x + a % 3 * (int) (x + y) % 2 / 4的运算结果z的值。

/* c1-9.c C语言的第九个程序 */ #include \

6

void main( )

{ _________ a=7;

float x=2.5,y=4.7, z ;

z= x + a % 3 * (int) (x + y) % 2 / 4; printf(\}

程序不完整,请删除横线后填空并运行程序。

五、实验注意事项

(一)在Visual C++ 6.0集成环境中,如何对C程序进行创建、运行、查看结果和退出。

Visual C++ 6.0集成环境等操作可以通过菜单、按钮、热键实现。另外,在源程序文件编辑过程中,还可以进行复制、移动、删除等常用文件编辑操作。

注意C程序的编辑与显示结果界面是两个不同的界面。

(二)由于C程序运行必须从main函数开始,因此一个C程序要有一个main函数,且只能有一个main函数。当一个程序运行结束之后,一定要先“文件”→“关闭工作空间”,然后再开始创建一个新的C程序。

(三)在程序的输入过程中: 1.要注意区分大小写;

2.要注意程序中需要空格的地方一定要留空格(如int a=3,b=5;中的int和a之间必须留空格);

3.注意“\\”与“/”的区别。

4.所定义的变量的类型与输入的数据的类型要一致,输出时的格式一定要满足数据的大小。 5.注意实验内容(十二)中当运算对象均为整数时“/”运算符的使用,“%”运算符两边一定是整型数据。

6.注意自加和自减运算符的运算规则,仔细分析实验内容(十)中程序的输出结果。

六、思考题

(一)有如下程序: #include \void main( ) { int a=-1;

printf(\ }

printf语句的运行结果是_______________。

(二)有如下程序: #include \void main( )

{ char c1=97,c2=98; int a=97,b=98; printf(\ printf(\ printf(\ }

最后一个printf语句的运行结果是_______________。

(三)有如下程序: #include \void main( )

{ int i,j; i=3; j=4;

printf(\ %d\\n\ printf(\

printf(\}

7

最后一个printf语句的运行结果是_______________。

(四)程序填空: #include \void main( )

{ _________ a=7;

float x=2.5,y=4.7,z;

z= x + a % 3 * (int) (x + y) % 2 / 4;

printf(\

程序中空格处应填_______________。

8

实验二 数据类型、运算符和表达式

一、实验目的

(1)了解C 语言数据类型的意义,掌握基本数据类型变量的特点和定义方法。 (2)学会使用C 的算术运算符,以及包含这些运算符的算术表达式。 (3)掌握自加(++)和自减(--)运算符的使用。

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

二、实验要点

基本数据类型包括整型、字符型、实型。

三、实验要求

(1)上机前先阅读和编写以下要调试的程序。 (2)上机输入和调试程序并存在磁盘上。 (3)检查实验结果是否正确。

四、实验内容

(以下内容在实验报告中的实验预习报告内容中完成) 1. 调试程序,分析输出结果

(1)输入并运行以下程序。 main()

{ float a,b;

a=123456.789e5; b=a+20;

printf(\}

将第二行改为: double a,b;

重新运行该程序,分析运行结果。

说明:由于实型变量的值是用有限的存储单元存储的,因此其有效数字的位数是有限的。float型变量最多只能保证7 位有效数字,后面的数字是无意义的,不能准确表示该数。

(2)输入并运行以下程序。 main()

{ char c1,c2; c1=97;c2=98;

printf(\printf(\}

① 将第二行改为:int c1,c2;再运行。

9

② 再将第三行改为:c1=300;c2=400;再运行,分析运行结果。

说明:字符型数据可作为整型数据处理,整型数据也可以作为字符型数据处理,但应注意字符数据只占一个字节,它只能存放0-255 范围的整数。

2.完成以下填空,并把程序调通,写出运行结果。 下面的程序计算由键盘输入的任意两个整数的平均值: main()

{ int x,y ;

;

scanf(“%d,%d”,&x,&y); ;

printf(\}

3. 指出以下程序的错误并改正,上机把程序调通 main(); { int a;

a=5;

printf(“a=%d, a) }

4. 编写程序并上机运行

要将“China”译成密码,译码规律是:用原来字母后面的第3 个字母代替原来的字母。例如,字母“A”后面第4 个字母是“E”,用“E”代替“A”。因此,“China”应译为“Fklqd”。请编一程序,用赋初值的方法使c1、c2、c3、c4、c5 五个变量的值分别为‘C’、‘h’、‘i’、‘n’、‘a’,经过运算,使c1、c2、c3、c4、c5 分别变为‘F’、‘k’、‘l’、‘q’、‘d’、,并输出。输入程序,并运行该程序。分析是否符合要求。

五、思考与总结

(1)总结各种整型变量的取值范围。

(2)总结各种实型变量的有效数字位数和取值范围。 (3)总结算术运算符和自加、自减运算符的优先级与结合性。

10

实验三 选择结构程序设计

一、实验学时

2学时

二、实验目的

(一)掌握C语言关系表达式和逻辑表达式的运算和使用;

(二)正确使用条件控制语句(if语句、switch语句)进行选择结构程序设计。

三、预习要求

(一)关系运算符和关系表达式、逻辑运算符和逻辑表达式;

(二)if语句的三种形式(单分支、双分支、多分支),以及if语句的嵌套; (三)switch语句的形式。

四、实验内容

(一)分析下面程序,掌握关系及逻辑表达式的运算规则。 /* c3-1.c 关系及逻辑表达式运算规则 */ #include \void main( )

{ int a=3,b=5,c=8;

if(a++<3 && c--!=0) b=b+1;

printf(\}

注意该程序中的条件判断表达式a++<3 && c--!=0是一个逻辑表达式,关系表达式a++<3的值为假,因此后一部分c--!=0就不再计算。试比较下列各部分运行结果。

#include \void main( )

{ int a=3,b=5,c=8;

if(a++<3 && c--!=0) b=b+1;

printf(\

int a=3,b=5,c=8;

if(c--!=0 && a++<3) b=b+1;

printf(\

int a=3,b=5,c=8;

if(a++<3 || c--!=0) b=b+1;

printf(\

int a=3,b=5,c=8;

if(c--!=0 || a++<3) b=b+1;

printf(\ }

11

(二)输入下面两段程序并运行,掌握case语句中break语句的作用。 1./* c3-2.c */ /* c3-3.c */

/* 不含break的switch */ /* 含break的switch */ #include \ #include \void main( ) void main( ) { int a,m=0,n=0,k=0; { int a,m=0,n=0,k=0; scanf(\ scanf(\ switch(a) switch(a) { case 1: m++; { case 1: m++; break; case 2: case 2: case 3: n++; case 3: n++; break; case 4: case 4: case 5: k++; case 5: k++; } }

printf(\ printf(\} } 分别从键盘上输入1、3、5,写出程序运行的结果。

(三)完善程序,从键盘上输入x的值,按下式计算y的值。

?x x<1?y??2x?1 1?x<10

?3x?11 x?10?编程提示:注意逻辑表达式的正确表达方法,数学中的1≤x<10应使用C语言的逻辑表

达式(x>=1 && x<10)来表示。

下面是用多分支选择结构实现本题的程序结构: /* c3-4.c if 语句实现的多分支结构 */ #include \ void main( ) { 定义变量; 输入x;

if ( _______________ ) //按y=x为变量y赋值;

else if( _______________ ) //按y=2x-1为变量y赋值; else

_______________ //按y=3x-11为变量y赋值; printf(\ }

注意:在赋值语句中2x应该写成2*x。

(四)编写程序,给出一个百分制成绩,要求输出相应的等级A、B、C、D、E。90分以上为'A',80~89分为'B',70~79分为'C',60~69分为'D',60分以下为'E'。

编程提示: 1.先定义一个整型变量存放百分制成绩、定义一个字符型变量存放相应的等级成绩; 2.输入百分制成绩;

3.将百分制成绩按10分,分档作为switch语句中括号内的表达式; 4.按

case 10: case 9:

12

case 8: case 7: case 6: default:

这六种匹配情况分别选择不同的入口; 5.输出转换后的等级成绩。

(五)下面程序运行时从键盘上分别输入(20,15),(15,20),写出运行结果。 /* c3-5.c 分支结构中的复合语句*/ #include \ void main( ) { int a,b,t; t = 0;

scanf(\ if (a>b) { t = a ; a = b ; b = t ;

}

printf(\ }

(六)编写程序,给出一个不多于3位的正整数n,要求:(1)求出它是几位数;(2)分别打印出每一位数字(数字之间加一个空格);(3)按逆序打印出各位数字(数字之间加一个空格)。

编程提示: 1.定义变量(考虑需要几个变量)并输入一个3位以下的正整数n 2.将n拆分成三个一位数:

表达式:n 可将一个三位数n拆分出三位数中的个位数; 表达式:n/100 可将一个三位数n拆分出三位数中的百位数;

表达式:((n0))/10 或(n-(n/100)*100)/10 可将一个三位数n拆分出三位数中的十位数。

3.用一个嵌套的选择结构,按照百位数、十位数是否为0决定n为几位数。 4.按相反的顺序输出n。

思考:如果是对一个5位的正整数进行上述处理,程序应如何改动?

(七)写出与表达式z =( x>=y ? x : y )等价的if语句,并上机验证。

五、实验注意事项

(一)C程序中表示比较运算的等号用“==”表示,赋值运算符用“=”表示,不能将赋值号“=”用于比较运算。

(二)控制表达式是指任何合法的C语言表达式(不只限于关系或逻辑表达式),只要表达式的值为“非零”,则为“真”,“零”则为“假”

13

(三)在if语句的嵌套结构中,else与if的配对原则是:每个else总是与同一个程序中、在前面出现的、而且距它最近的一个尚未配对的if构成配对关系。

(四)case及后面的常量表达式,实际仅是起标号作用。控制表达式的值与某个情况常量一旦匹配,那么,在执行下面语句的过程中,只要不遇到break语句,就一直执行下去,而不再判别是否匹配。允许出现多个“case”与一组语句相对应的情况。

六、思考题

(一)下面程序的功能是实现表达式z=( x>=y ? x : y),请将程序填写完整。 /* 分支结构的程序 */ #include \ void main( ) { int x, y, z;

printf(\ scanf(\ if (________) z=x; else z=y;

printf(\ }

(二)下面程序的运行结果为_______________。 /* 分支结构的程序 */ #include \void main( )

{ int a=1,b=5,c=8;

if(a++<3 && c--!=0) b=b+1;

printf(\}

(三)程序填空,从键盘上输入x的值,按下式计算y的值。

?x x<1?y??2x?1 1?x<10

?3x?11 x?10?/* 多分支结构的程序 */ #include \void main( ) { float x,y; printf(\ scanf(\

if ( _________ ) y=x; else if( x>=1 && x<10 )

y=2*x-1; else

y=3*x-11; printf(\ }

(四)下面程序运行时从键盘上输入15,20,运行结果为_______________。

14

/* 分支结构的程序 */ #include \void main( ) { int a,b,t; t = 0;

scanf(\if (a>b) { t = a ; a = b ; b = t ; }

printf(\}

15

实验四 循环结构程序设计(一)

一、实验学时

2学时

二、实验目的

(一)掌握用while,do-while,for语句实现循环的方法;

(二)掌握在设计条件型循环结构的程序时,如何正确地设定循环条件,以及如何控制循环的次数。

(三)掌握与循环有关的算法。

三、预习要求

预习教材有关while,do-while,for语句的语法格式,并能通过这三种语句编写、调试单层循环结构的程序。

四、实验内容

(一)分析并运行下面程序段,循环体的执行次数是__________。 int a=10,b=0;

do { b+=2;a-=2+b;} while(a>=0);

(二)当执行以下程序段时,循环体执行的次数是__________。 x = -1;

do { x=x*x;} while( !x);

(三)编程求 1!+2!+3!+??+20! 的值。

注意:根据题目,考虑所定义的各个变量应该为何种类型。程序结构如下:

/* c4-1.c 求1!+2!+3!+??+20! */ #include \ void main( )

{ 定义变量i作为循环控制变量;

定义变量p和sum分别存放各个整数的阶乘和阶乘之和; 变量p和sum赋初值; for( i=1; i<=20; i++ ) { 变量p连乘 ; 变量sum累加; } 输出sum的值 ; }

(四)编写一个程序,求出两个数m和n的最大公约数和最小公倍数。

16

编程提示:求最大公约数的方法有三种:

1.从两个数中较小数的开始向下判断,如果找到一个整数能同时被m和n整除,则终止循环。设n为m和n中较小的数,则如下程序段可实现:

for(k=n; k>=1; k--) if(m%k==0 && n%k ==0) break; k即为最大公约数。

/* c4-2.c 求最大公约数算法1 */ #include \ void main( ) { }

2.从整数1开始向上找,直至m和n中较小的数,每找到一个能同时被m和n整除的整数,将其存入一个变量中,当循环结束时,变量中存放的即为最大公约数。设n为m和n中较小的数,则如下程序段可实现:

for(k=1; k<=n; k++) if(m%k==0 && n%k==0) x=k; 变量x的值即为最大公约数。

/* c4-3.c 求最大公约数算法2 */ #include \ void main( ) { }

3.用辗转相除法,即将求m和n的最大公约数问题转化为求其中的除数和两个数相除所得余数的公约数。每次循环中,先求两个数的余数,然后以除数作为被除数,以余数作为除数,当余数为0时结束循环,此时除数即为最大公约数。设m和n中n为较小的数,则可用如下程序段实现:

b=m%n; while(b!=0) { m=n; n=b; b=m%n;} printf(\

/* c4-4.c 求最大公约数算法3 */ #include \ void main( ) { }

类似地,求最小公倍数的方法也可以从m和n中较大的数开始向上找,或者从m*n向下找,请自己考虑程序的设计方法。

另外,两个数的最大公约数和最小公倍数的关系为:最小公倍数=m*n/最大公约数 可利用此关系进行程序设计。

(五)编程实现,从键盘上输入一行字符,统计其中英文字母、数字、空格和其它字符的个数。

17

编程提示:先定义一个字符型的变量(如c),再定义4个整型变量作为计数器,作为

计数器的变量要先赋初值0。在循环中每次从键盘上读入一个字符,在循环体中对读入的字符进行判断,相应的计数器加1,当读入的字符为’\\n’时结束。

编程中可使用如下的循环结构: while((c=getchar())!=’\\n’)) { if(??) ??; else if(??) ??; ??; else ??; }

/* c4-5.c 统计字符串中指定字符的个数 */ #include \ void main( ) { }

注意: 1.while( (c=getchar( ))!=’\\n’) )中括号的使用,第二层的小括号不能省略,想一想为什么?

2.字符常量’0’与数值常量0是不同的。

(六)下面程序的功能是:计算1到100之间的奇数之和及偶数之和,并输出。请在程序中的横线上填入适当的内容,将程序补充完整并运行。

/* c4-6.c 计算1到100之间的奇数之和及偶数之和 */ #include \ void main( ) { int a,b,c,i;

_____________; /*变量初始化*/ for(i=0; i<=100; i+=2)

{ a+=i; /*变量a存放偶数的和*/ ____________;

c+=b; /*变量c存放奇数的和*/ }

printf(\

printf(\ }

(七)编程打印出所有的“水仙花数”,所谓水仙花数是指一个3位数,其各位数字的立方和等于该数本身。如153=1+3+5。

3

3

3

编程提示:定义一个变量作为循环变量,再定义3个变量分别存放三位数的每位数字,

在循环体中将一个三位数拆分成个位、十位、百位后判断循环变量的值是否为水仙花数,如果是则输出,否则不输出。程序的基本结构为: /* c4-7.c 打印出所有的“水仙花数” */ #include \ void main( )

18

{ 定义4个整型变量;

for( j=100; j<=999; j++ )

{ a=j/100; /*分离出百位数*/ b=j/10-a*10; /*分离出十位数*/ c=___________; /*分离出个位数*/ if(j==a*a*a+b*b*b+c*c*c) 输出j ; }

printf(\ }

(八)以下程序的功能是:从键盘上输入若干个学生的成绩,统计并输出最高成绩和最低成绩,当输入负数时结束输入。请将程序补充完整。

/* c4-8.c 求最大值最小值程序 */ #include \ void main( )

{ float x,amax,amin; scanf(\ amax=x; amin=x;

while ( _______________ ) { if (x>amax) amax=x;

if ( _______________ ) amin=x; scanf(\ }

printf(\ }

(九)求两个正整数[m,n]之间所有既不能被3整除也不能被7整除的整数之和。

编程提示:定义两个变量m,n和t,再定义一个循环变量和结果变量s,从键盘输入m

和n的值,判断两个变量的值,如果m>n,则交换两个变量。然后用循环依次判断m和n之间的每一个数,在循环体中通过条件语句来判断这个数是否既不能被3整除也不能被7整除,如果满足条件,累加求和,如果不满足,则继续循环。

程序的基本结构如下:

/* c4-9.c 按条件求数列和 */ #include \ void main( ) { 定义变量; 变量赋初值; 输入m,n的值; if( m>n )

m和n交换;

for ( _______________ ) if ( i%3 != 0 && i%7 != 0 ) 变量 s 累加求和 ;

printf(\ }

(十)下面程序的功能是:计算正整数num的各位上的数字之和。例如,若输入:252,则输出应该是:9;若输入:202,则输出应该是:4。请将程序补充完整。

19

/* c4-10.c 求整数各位数字和 */ #include \ void main( ) { int num,k;

_______________; /* k赋初值 */ printf(\ scanf(\ do

{ k=_______________ ; /* 取最低位并累加 */

num/=10; /* 去掉最低位 */ } while(num) ;

printf(\ }

五、实验注意事项

(一)while,do-while,for语句中应有使循环趋向于结束的语句,否则就可能构成死循环。

(二)while,do-while语句什么情况下的运行结果是相同的,什么情况下不同。 (三)注意在循环结构程序设计中,正确使用{ }构成复合语句。

六、思考题

(一)求两个正整数x和y的最大公约数,请填空。 /* 求最大公约数程序 */ #include \ void main( ) { int x,y,t,i;

scanf(\ / if (x > y) {t = x; x = y; y = t;} for(i>=1;i<=x;i++ )

{ if( x%i==0 && y%i==0 ) break; }

printf(\ }

(二)计算1到100之间的奇数之和及偶数之和。请填空。 /* 计算1到100之间的奇数之和及偶数之和 */ #include \ void main( ) { int a,b,c,i;

a=0, c=0; /* 变量赋初值 */ for(i=0;i<=100;i+=2)

{ a+=i; /* 变量a存放偶数的和 */ _______________ ;

c+=b; /* 变量c存放奇数的和 */ }

printf(\

printf(\ }

20

(三)下面程序的功能是:计算正整数num的各位上的数字之和。例如,若输入:252,则输出应该是:9;若输入:202,则输出应该是:4。请将程序补充完整。

/* 计算整数各位数字和 */ #include \ void main( ) { int num,k=0;

printf(\请输入一个整数: \ scanf(\ do

{ k=____________ ; num/=10; } while(num) ;

printf(\ }

(四)求两个正整数[m,n]之间所有既不能被3整除也不能被7整除的整数之和。请填空。

/* 按条件求数列和 */ #include \ void main( ) { int m,n,i,t; long int s=0;

scanf(\ if( m>n )

{ t=m; m=n; n=t;}

for ( _______________ ) if ( i%3 != 0 && i%7 != 0 ) s += i;

printf(\ }

21

实验五 循环结构程序设计(二)

一、实验学时

2学时

二、实验目的

(一)掌握使用for,while,do-while语句实现循环嵌套的方法; (二)巩固break和continue语句的使用。

三、预习内容

预习教材中有关用for,while,do-while语句实现循环嵌套的方法以及循环嵌套的执行过程。

四、实验内容

(一)根据公式:sum=1?111????,计算sum的值。 2!3!n!注意:根据题目,考虑所定义的各个变量应该为何种类型。

编程提示:定义一个变量存放最后的求和结果(假设为sum),sum的数据类型应为实型,

定义变量t计算整数的阶乘。使用双重循环,程序的基本结构为:

for(i=1,sum=0; i<=20; i++) { t赋初值1 ;

for( j=1; j<=i; j++ ) 变量t连乘求积; 变量sum累加t的倒数; }

注意上述程序结构和内循环变量的终值。想一想是否可以将t=1放在外循环之前? /* c5-1.c 求数列和 */ #include \ void main( ) { }

(二)编程输出九九乘法表。

编程提示:我们日常看到的乘法表是:

1×1=1 1×2=2 2×2=4 1×3=3 2×3=6 3×3=9 ?

22

int a[]={2,3,4,5,6,7,8,9};

for(i=0; i<8; ) /* 请补充完整循环语句 */ sum+=a[i];

printf(\}

(五)编写一程序,将100以内的素数存放到一个数组中。

编程提示:这是一个双层循环嵌套的程序。

1.首先复习教材上的内容,掌握判断素数的方法。

2.定义一个数组存放100以内的素数,想一想该数组的大小应该为多少? 3.定义一个整型变量作循环变量。

4.定义一个整型变量作为数组元素下标的计数器,想一想该变量应赋什么样的初值? 5.在外层循环中,对1~100之间的所有整数进行判断;内层循环则判断每个整数是否为素数。如果是素数,存放到数组中,并使数组下标变量加1;否则继续判断下一个整数。

6.用循环语句输出数组中的所有素数,注意循环变量的初值和终值如何确定。

(六)将一个数组中的值按逆序重新存放。例如,原来的顺序为8,6,5,4,1,2,要求改为按2,1,4,5,6,8的顺序存放(注意是逆序存放而不是逆序输出)。

编程提示: 1.定义一个数组,为该数组赋值(可以在定义时初始化,也可以用循环语句)。 2.在循环中,使第0个元素与第5个元素交换,第1个元素与第4个元素交换,第2个元素与第个3元素交换(注意循环次数按n/2确定,n为数据个数)。

3.输出逆序存放后的各数组元素(使用循环语句)。

五、实验注意事项

(一)C规定,数组的下标下界为0,因此数组元素下标的上界是该数组元素的个数减1。 例如,有定义:int a[10]; 则数组元素的下标上界为9。

(二)由于数组的下标下界为0,所以数组中下标和元素位置的对应关系是:第一个元素下标为0,第二个元素下标为1,第三个元素下标为2,依次类推,第n个元素下标为n-1。

(三)数值型数组要对多个数组元素赋值时,使用循环语句,使数组元素的下标依次变化,从而为每个数组元素赋值。

例如:int a[10],i;

for(i=0;i<10;i++) scanf(\不能通过如下的方法对数组中的全部元素赋值。

int a[10],i; scanf(\

六、思考题

(一)定义一个数组名为ftop且有5个int类型元素的一维数组,同时给每个元素赋初值为0,请写出数组的定义语句 。

(二)下面程序的功能是:为一维数组a中的元素赋值,并按照逆序输出。请在程序中的横线上填入正确的内容。

#include \

28

void main( )

{ int i,a[10]; /* 定义循环变量i和一维数组a */ for(i=0;i<=9;i++)

scanf(\ for( ;i>=0;i--)

printf(\ /* 按照逆序输出 */ printf(\}

(三)下面程序的功能是:输出一维数组a中的最小值及其下标。请在程序中的横线上填入正确的内容。

#include \void main( )

{ int i,p=0,a[10]; /* 定义a为数组名,p为下标名 */ for(i=0; i<10; i++) scanf(\ for(i=1; i<10; i++)

if (a[i]

printf(\ /* 输出一维数组a中的最小值及其下标 */

}

(四)下面程序的功能是:求一维数组中下标为偶数的元素之和并输出。请在程序中的横线上填入正确的内容。

#include \void main( )

{ int i,sum=0;

int a[ ]={2,3,4,5,6,7,8,9}; for(i=0; i<8; ) sum+=a[i];

printf(\ }

29

实验七 二维数组程序设计

一、实验学时

2学时

二、实验目的

(一)掌握二维数组的定义、赋值及输入输出的方法; (二)掌握与二维数组有关的算法如查找、矩阵转置等;

(三)掌握在程序设计中使用数组的方法。数组是非常重要的数据类型,循环中使用数组能更好地发挥循环的作用,有些问题不使用数组难以实现。

(四)掌握在VC++环境下上机调试二维数组程序的方法,并对结果进行分析。

三、预习要求

熟悉二维数组的定义、引用和相关算法(求最大值、最小值)的程序设计,同时要掌握在程序设计中利用双重循环来实现二维数组的输入和输出。

四、实验内容

(一)二维数组的初始化,即给二维数组的各个元素赋初值。下面的几个程序都能为数组元素赋值,请输入程序并运行,比较这些赋值方法有何异同。

1.在定义数组的同时对数组元素分行初始化。 /* c7-1.c 二维数组的初始化(分行)*/ #include \void main( )

{ int i,j,a[2][3]={{1,2,3},{4,5,6}}; for(i=0; i<2; i++) { for(j=0; j<3; j++) printf(\printf(\} }

2.不分行的初始化。把{ }中的数据依次赋值给数组的各个元素。 /* c7-2.c 二维数组的初始化(不分行)*/ #include \void main( )

{ int i,j,a[2][3]={1,2,3,4,5,6}; for(i=0;i<2;i++)

{ for(j=0;j<3;j++)

printf(\printf(\} }

3.为部分数组元素初始化。

30

如:数组定义语句为:int i,j,a[2][3]={{1,2},{4}};

4.可以省略第一维的定义,但不能省略第二维的定义。 如:int a[ ][3]={1,2,3,4,5,6};

依次运行以上程序,比较这四种定义方式的不同之处。

(二)求一个4×4矩阵的主对角线元素之和,填空并运行程序。

编程提示: 1.定义一个4行4列的二维数组a。

2.可利用双重循环的嵌套为该二维数组的各个数组元素赋值,一般格式为: for(i=0; i<4; i++) for(j=0; j<4; j++) scanf(\

3.用循环求和,并注意矩阵对角上线元素的特征是:行下标和列下标相同。 4.输出对角线元素之和。

/* c7-3.c 求一个4×4矩阵的主对角线元素之和*/ #include \void main( )

{ int a[4][4]={{1,2,3,4},{5,6,7,8},{3,9,10,2},{4,2,9,6}}; int i,sum=0;

for(i=0; i<4; i++)

_____; /*把对角线元素的和放在变量sum中 */ printf(\ /*输出对角线元素的和*/ }

(三)打印出以下的杨辉三角(要求打印出10行) 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1

编程提示:

1.杨辉三角的特点是:第1列和对角线上的元素为1,其它各元素的值都是上一行上一列元素和上一行前一列元素之和。

2.定义一个10×10的二维数组a。

3.先用一个单层循环为第一列和对角线上的元素赋值。如: for(i=0; i<10; i++) { a[i][i]=1;a[i][0]=1; } 4.再用一个双重循环嵌套为其它元素赋值。 for( ; i<10; i++)

31

for( ; ; j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; 想一想,划横线的地方应当填入什么内容?

5.计算之后再用一个双重循环嵌套输出杨辉三角。注意各层循环变量的初值和终值怎样确定。

(四)统计3个学生,每个学生4门课程的考试成绩,要求输出每个学生的总成绩,每个学生的平均成绩,3个学生的总平均成绩。填空并运行程序。

/* c7-4.c 学生成绩处理 */ #include \void main( )

{ int stu[3][4],i,j,t[3]; float sum=0,a[3];

for(i=0; i<3; i++) /* 输入三个学生的4门课程考试成绩 */ for(j=0; j<4; j++)

scanf(\ for(i=0; i<3; i++) { t[i]=0;

for(j=0; j<4; j++)

{ sum+=stu[i][j]; /* sum存放三个学生的4门课程总成绩 */ t[i]+=stu[i][j]; /* t[i]存放第i个学生的4门课程成绩 */ }

printf(\输出第i个学生的总成绩 */ ;

printf(\存放第i个学生的4门课程平均成绩*/ }

printf(\}

(五)已知二维数组a中的元素为: 4 4 34 37 3 12 5 6 5

求二维数组a中的最大值和最小值。程序的输出应为:The max is: 37 The min is: 3

填空并运行程序。

/* c7-5.c 求二维数组中元素的最大值与最小值 */ #include \void main( )

{ int a[3][3]={4,4,34,37,3,12,5,6,5},i,j,max,min; max=a[0][0];

; for( i=0; i<3; i++) for( j=0; j<3; j++)

32

{ if ( max < a[i][j] ) max = a[i][j]; if ( min > a[i][j] ) min = a[i][j]; }

printf(\ printf(\ }

(六)以下程序是查找二维数组a的最大元素及其下标,填空并运行程序。 /* c7-6.c 求二维数组中元素的最大值及其下标 */ #include \void main() { int a[4][4]={{1,2,3,4},{3,4,5,6},{5,6,7,8},{7,8,9,10}};

int i,j,max,l,c; /* max存放最大值,l、c分别存放行和列的下标 */ max=a[0][0]; for(i=0; i<4; i++) for(j=0; j<4; j++)

if(max

(七)下面的程序是自动形成并输出如下矩阵,填空并运行程序。 1 2 3 4 5 1 1 6 7 8 1 1 1 9 10 1 1 1 1 11 1 1 1 1 1

/* c7-7.c 生成指定的矩阵*/ #include \void main( )

{ int i,j,k,a[5][5]; k=2;

for(i=0; i<5; i++) /* 行循环 */ for(j=0; j<5; j++) /* 列循环 */

if( ) a[i][j]=1; /* 产生矩阵的下三角元素 */ else a[i][j]=k++; /* 产生矩阵的上三角元素 */ for(i=0; i<5; i++) { for(j=0; j<5; j++) printf(“M”,a[i][j]);

printf(“\\n”); /* 每输出一行后换行 */ }

}

33

(八)下面程序的功能是实现方阵(如:3行3列)的转置(即行列互换) 如:如果原来的矩阵:100 200 300 400 500 600 700 800 900 程序输出应为:

100 400 700 200 500 800 300 600 900 填空并运行程序。

/* c7-7.c 矩阵转置*/ #include \void main( ) { int i,j,temp;

int array[3][3]={{100,200,300},{400,500,600},{700,800,900}}; printf(\原来的矩阵为:\\n\ for(i=0; i<3; i++)

{ for(j=0; j< ; j++) printf(\ printf(\ for(i=0; i<3; i++)

{ for(j=0; ;j++)

{temp=array[i][j];array[i][j]=array[j][i];array[j][i]=temp;} } printf(\转置后的矩阵为:\\n\ for(i=0; i<3; i++)

{ for(j=0; j<3; j++) printf(\ } /*输出一行后要换行*/ }

请将此矩阵转置程序与教材上的矩阵转置程序进行比较,各用于何种类型矩阵比较合适?

五、实验注意事项

(一)C规定,二维数组的行和列的下标都是从0开始的。

例如,有定义:int b[3][[5]; 则数组b的第一维下标的上界为2,第二维下标的上界为4。说明定义了一个整型二维数组b,它有3行5列共3*5=15个数组元素,行下标为0,1,2,列下标为0,1,2,3,4,则数组b的各个数组元素是:

b[0][0],b[0][1],b[0][2],b[0][3],b[0][4] b[1][0],b[1][1],b[1][2],b[1][3],b[1][4] b[2][0],b[2][1],b[2][2],b[2][3],b[2][4]

(二)要对二维数组的多个数组元素赋值,应当使用循环语句并在循环过程中,使数组元素的下标变化。可用下面的方法为所有数组元素赋值:

int i,j,a[3][3]; for(i=0; i<3; i++)

34

for(j=0; j<3; j++) scanf(\

六、思考题

(一)定义一个5行5列的二维数组a,使下三角的所有元素初始化为1,在划线处填空。 int i,j,a[5][5]; for(i=0; i<5; i++) for(j=0; j<5; j++)

if( ) a[i][j]=1;

(二)求一个4×4矩阵的主对角线元素之和,填空并运行程序。 #include \

void main( )

{ int a[4][4]={{1,2,3,4},{5,6,7,8},{3,9,10,2},{4,2,9,6}};

int i,sum=0; for(i=0; i<4; i++) ;

printf(“sum=%d\\n”,sum); }

(三)求二维数组a中的最大元素及其下标,填空并运行程序。 #include \ void main( )

{int a[4][4]={{1,2,3,4},{3,4,5,6},{5,6,7,8},{7,8,9,10}}; int i,j,max,l,c; max=a[0][0]; for(i=0; i<4; i++) for(j=0; j<4; j++)

if( max

(四)统计3个学生,每个学生4门课程的考试成绩,要求输出每个学生的总成绩,每个学生的平均成绩,3个学生的总平均成绩,填空并运行程序。 #include \ void main( )

{ int stu[3][4],i,j,t[3];

float a[3],sum=0; for(i=0; i<3; i++) for(j=0; j<4; j++) scanf(\for(i=0; i<3; i++) { t[i]=0;

35

for(j=0; j<4; j++) { sum+=stu[i][j]; t[i]+=stu[i][j]; }

printf(\ ; printf(\ }

printf(\ }

36

实验八 字符数组程序设计

一、实验学时

2学时

二、实验目的

(一)掌握字符数组的定义、初始化和应用; (二)掌握字符串处理函数的使用。

三、预习要求

重点预习的内容:C语言中字符串的存储表示;字符数组输入输出的方法;常用的字符串处理函数的使用。

四、实验内容

(一)输入下面的程序并运行,观察程序运行的结果,并分析原因(注意程序第2行中有些单引号之间是空格)。

/* c8-1.c 字符数组的输出*/

#include \void main( )

{ char a[10]={ ’I’, ’ ’, ’a’, ’m’, ’ ’, ’a’, ’ ’, ’b’, ’o’, ’y’}; printf(\}

将字符数组a的大小改为11,再运行程序,并将结果与修改前的结果进行比较,分析原因。

(二)按照要求编写程序:有一行文字,不超过80个字符,分别统计出其中英文大写字母、小写字母、数字、空格、及其它字符的个数。

编程提示: 1.定义一个一维字符数组。

2.定义5个整型变量分别统计大写字母、小写字母、数字、空格和其它字符的个数(即作为5个计数器使用),并为这5个变量赋初值。

3.用scanf函数或gets函数为字符数组赋一个字符串。

4.在循环中对字符数组的每个元素进行判断,相应的计数器加1。注意循环控制的条件和进行判断的条件怎样设置。

5.循环结束后输出各计数器的值。

思考:如果是对一篇英文文章进行统计,又该怎么编程呢?文章的行数和每行字数可以自己来设。提示:对文章的内容要用二维字符数组来存储。

/* c8-2.c 统计字符个数 */

#include \

37

void main( ) { }

(三)下面程序的功能是实现将两个字符串连接起来并输出结果,注意不使用strcat函数。请填空并运行程序。

编程提示:

1.定义两个一维字符型数组str1、str2和两个循环变量。

2.为两个字符数组输入两个字符串(可使用scanf函数或gets函数整体赋值,要注意scanf和gets函数的区别,在对字符串赋值时,scanf函数不能出现空格)。

3.确定字符数组str1结束的位置。

4.再将字符数组str2中的内容连接到字符数组str1的后面。 5.为字符数组str1赋字符串结束的标志’\\0’。 6.输出连接后的字符数组str1。

/* c8-3.c 字符串连接*/ #include \void main( )

{ char str1[100],str2[100]; int i=0,j=0;

printf(\

scanf(\

printf(\ gets(str2);

for(i=0; str1[i]!='\\0'; i++) ; /*注意,此处空语句不可少*/ for(j=0;str2[j]!='\\0';j++) { str1[i]=str2[j]; i++;

}

_______________ ; /*给出新的字符串的结束符*/ printf(\}

(四)下面程序的功能是用strcat函数实现将字符串2连接到字符串1的后面并输出,请补充完整。

/* c8-4.c 字符串连接*/ #include \void main( )

{ char str1[80]=\

printf(\ printf(\

_______________; /*使用strcat函数实现,注意其格式*/ printf(\ }

38

(五)下面程序的功能是实现将一个字符串中的所有大写字母转换为小写字母并输出,请补充完整。

例如:当字符串为\

输出:\

/* c8-5.c 字符串中的大写字母转为小写字母*/ #include \void main( )

{ char str[80]=\ int i;

printf(\ for (i=0; str[i]!='\\0'; i++) if (str[i]>='A' && str[i]<='Z')

_______________; /*将大写字母转换成小写字母*/

printf(\}

思考:如果将字符串中的所有小写字母转换为大写字母,又将如何修改程序?

(六)编写程序实现在一个字符串中查找指定的字符,并输出指定的字符在字符串中出现的次数及位置,如果该字符串中不包含指定的字符,请输出提示信息。

编程提示:

1.定义两个一维数组,a字符数组用来存放字符串,b整数数组用来存放指定的字符在字符串中出现的位置(即对应的下标)。

2.定义i,j,m三个循环控制变量和一个标志变量flag,并初始化flag的值为0。 3.用scanf或者gets函数为字符数组赋一个字符串。

4.在循环中对字符数组的每个元素和指定字符ch进行匹配判断,如果相同,就把其下标依次存放在数组b中,并置flag的值为1。

5.循环退出后判断标志变量flag的值,如果仍为0,说明字符串中没出现指定的字符,否则,就输出该字符在字符串中出现的次数和位置。

五、实验注意事项

(一)注意C语言中字符串是作为一维数组存放在内存中的,并且系统对字符串常量自动加上一个‘\\0’作为结束符,所以在定义一个字符数组并初始化时要注意数组的长度。 (二)注意用scanf函数对字符数组整体赋值的形式。

六、思考题

(一)下面程序运行的结果是:___________。 #include \void main( )

{ char a[11]={ ’I’, ’ ’, ’a’, ’m’, ’ ’, ’a’, ’ ’, ’b’, ’o’, ’y’}; printf(\

}

39

(二)下面的程序用来实现将两个字符串连接起来,请将源程序补充完整。 #include \void main( )

{ char str1[100],str2[100];

int i=0,j=0;

printf(\scanf(\

printf(\gets(str2);

for(i=0; str1[i]!='\\0'; i++); for(j=0; str2[j]!='\\0'; j++) { str1[i]=str2[j]; i++; } _______________;

printf(\

}

(三)下面程序的功能是用strcat函数实现将字符串2连接到字符串1的后面并输出,请补充完整。

#include \void main( )

{ char str1[80]=\

printf(\ printf(\ __________________;

printf(\}

(四)下面的程序用来实现将一个字符串中的所有大写字母转换为小写字母并输出。请将源程序补充完整。

例如,当字符串为\ 输出:\

#include \void main( )

{ char str[80]=\ int i;

printf (\ for (i=0; str[i]!='\\0'; i++)

if (str[i]>='A' && str[i]<='Z') _________________;

printf(\}

40

实验九 函数

一、实验学时

2学时

二、实验目的

(一)掌握函数的定义、函数类型、函数参数、函数调用的基本概念; (二)掌握变量名作函数参数的程序设计方法; (三)掌握函数的嵌套调用的方法; (四)掌握数组元素作函数参数;

(五)掌握数组名作函数参数的程序设计方法; (六)掌握字符数组作函数参数的程序设计方法; (七)了解全局变量、局部变量的概念和使用方法;

(八)使用功能键F7单步执行,使用Ctrl+F7观察变量的值,学会程序调试基本方法。

三、预习要求

(一)函数的定义、函数类型、函数参数、函数调用的基本概念; (二)函数实参与形参的对应关系以及参数的传递; (三)以变量名和数组名作函数参数时的使用方法; (四)全局变量、局部变量的概念和使用方法。

四、实验内容

(一)下面程序的功能是:根据输入的整数x和n,利用函数fact实现求x。

例如:输入:2,3 输出23=8

请在程序中的横线上填入正确的内容,将程序补充完整。 /* c9-1.c 利用函数fact实现求x的n次方*/ #include \ void main( )

{ long int fact(long x,long n) ; /*声明fact函数*/

long int x ; long int n;

printf(\ scanf(\

printf(\调用fact函数 */ }

long int fact(long int x, long int n) /*定义fact函数求xn */ { long int i,s;

; /*求累积变量的初始化*/

41

n

if (n= =0) return 0;

for(i=1; i<=n; i++) /*用循环实现x*/ s=s*x;

; /*返回结果x*/ }

(二) 下面程序的功能是:计算Cm?的内容,将程序补充完整。

例如:输入:5,3 输出:Cm?10

nn

n

nm!的值。请在程序中的横线上填入适当

n!*(m?n)!编程提示:(1)定义求阶乘函数,在此基础上定义求组合数函数。

(2)主函数调用求组合数函数,求组合数函数再三次调用求阶乘函数。 /* c9-2.c 利用函数组合数*/ #include \

long int jf (int n) /*定义求阶乘函数jf*/ { int i; long int t=1; for(i=1; i<=n; i++) t*=i;

; }

long int cmn(int m, int n) /*定义求组合数函数cmn*/ { return(jf(m)/(jf(n)*jf(m-n))) ;} /*用return语句返回结果*/

void main( ) { int m,n;

printf(\ scanf(\,%d\

; }

(三)下面程序的功能是:读入一个整数m,计算如下公式的值:

t?1?111???? 23m例如:若输入5,则应输出:“The result is 2.28333”。 请在程序中的横线上填入适当的内容。

/* c9-3.c 利用函数实现级数求和*/ #include \double fun(int m) { float t=1.0; int i; for(i=2; i<=m; i++) ;

42

return ___ ______ ; }

void main( ) { int m;

printf(\ scanf(\

___ ______ ; /*按照例子中的输出形式输出结果*/ }

(四)下面程序的功能是:输入一个十进制整数,输出其对应的二进制数。

编程提示: 在main函数中定义一个变量并为其赋值,然后调用函数fun将该十进制数转换为二进制。

函数fun的形参即为被转换的整数,在for循环中每次求出m%k存放到数组aa中,同时将m/k的整数商赋给m继续判断,直止m的值为0。最后按反序输出数组aa的元素。

请在程序中的三处横线上填入适当的内容,将程序补充完整: /* c9-4.c 通过函数调用实现数制转换*/ #include \void fun(int m) { int aa[20],i,k=2;

for(i=0; m; i++) {aa[i]=m%k; ___ ______ ;} printf(\

for(; i; i--) printf(\void main( ) { int n;

printf(\请输入一个十进制整数:\\n\ fun( ___ ______ ); }

如果将十进制数转换为八进制数,应对程序的哪个语句进行修改?怎样修改?

(五)写一个程序,判别一个整数数组中各元素的值,若大于0 则输出该值,若小于或等于0则输出0值。

编程提示: 判断函数:1.函数的类型为void,函数中不使用return语句;

2.函数的形参为一整型变量;

3.函数体中使用选择结构,根据对变量值的判断输出相应结果。

main函数:1.定义一个一维整型数组;

2. 为整型数组赋若干个数值;

3. 调用判断函数对数组元素逐一进行判断,以数组元素作实参。

/* c9-5.c 判别一个整数数组中各元素的值 */ #include \ void main( ) {

43

}

(六)一维数组a中的元素为:1,4,2,7,3,12,5,34,5,9。求一维数组a中的最大元素及其下标。程序的输出应为:The max is: 34,position is: 7 。要求:求最大元素位置用函数实现,在main函数中调用该函数。

编程提示: 定义一个全局变量max,用来存放最大元素。求最大元素位置的子函数: 1.函数的类型为整型;

2. 函数的形参应为整型一维数组和一整型变量(存放数组元素的个数);

3.函数体中,定义一个整型pos,用来存放当前最大元素在数组中的下标,初值为0;将全局变量max的初值设置为数组中的第一个元素;

4. 函数体中使用循环结构,将数组元素依次和max中的值进行比较,将两者中的最大元素存入max中,并将最大元素的下标存入pos中;

5. 循环结束后,用return语句,将pos的值返回到主函数。 main函数:

1. 定义一个一维整型数组并为该数组赋若干个数;

2. 以赋值语句的形式,将求最大元素位置函数的返回值赋给一个变量,以数组名和数组的元素个数作实参。

注意:以数组名作实参时,实参与形参之间是地址的传递,实参数组和形参数组是公用一段内存单元。

/* c9-6.c 通过函数调用求一维数组中的最大元素及其下标*/

#include \ #include \ int max;

int fun( int arr[ ],int n ) { int pos,i; max = arr[0]; pos = 0;

for( i=1; i

pos=i; }

return (pos); }

void main( )

{ int a[10]={1,4,2,7,3,12,5,34,5,9},n; _______________;

printf(\ }

(七)下面程序的功能是:求二维数组a中的上三角元素之和。

例如:a中的元素为:

4 4 34 37 7 3 12 8

44

5 6 5 52 24 23 2 10 程序的输出应为:The sum is:147。

请在程序中的横线上填入适当的内容,将程序补充完整。

/* c9-7.c 通过函数调用求二维数组中的上三角元素之和*/

#include \

#include \ int arrsum( int arr[4][4]) { int i,j,sum; sum=0;

for( i=0; i<4; i++)

for ( __________;j<4; j++) sum+=arr[i][j]; return (sum); }

void main( )

{ int a[4][4]={4,4,34,37,7,3,12,8,5,6,5,52,24,23,2,10},i,j; printf(\

(八)将字符串1的第1,3,5,7,9,......位置的字符复制到字符串2并输出。 例如:当字符串1为\,则字符串2为\。 编程提示:

子函数:1. 函数的类型为void,函数中不使用return语句;

2. 函数的形参应为两个字符型一维数组;

3. 函数体中使用循环结构,将字符串1中相应位置上的字符逐一复制到字符

串2中,注意循环变量每次递增的数目。 main函数:1. 定义一个一维字符型数组;

2. 为字符数组赋一个字符串;

3. 调用转换函数,以两个数组名作实参;

4. 输出转换后的字符数组的内容。

/* c9-8.c 通过函数调用实现对字符串的处理*/ #include \ #include \ #include \

void fun(char str1[ ],char str2[ ]) { int i,j;

j=0;

for(i=0;i

str2[j]=’\\0’; }

void main()

45

{ char str1[80]=\ printf(\ _______________;

printf(\ }

(九)输入下面的程序并分析运行结果。用F7单步执行,注意程序的执行过程,观察变量d的值,理解全局变量和局部变量的区别,理解各种局部变量的作用范围。

/* c9-9.c 全局变量与局部变量的作用范围 */ int d=1;

fun(int p)

{ int d=5; d+=p++; printf(\main( )

{ int a=3; fun(a); { int d=16; d+=a++; printf(\ printf(\}

五、实验注意事项

(一)定义函数时,函数名后的圆括号后面不能加“;”。 (二)在函数体内,不能再对形参进行定义和说明。

(三)变量作实参时,只使用变量名,实参变量对形参变量的数据传递是“值传递”。 (四)一维数组作函数的实参时,只使用数组名如:fun(a); 。

下面对函数的调用都是不正确的: fun(int a[4]); fun(int a[ ]); fun(int a);

六、思考题

(一)下面程序的功能是:判别一个整数数组中各元素的值,若大于0 则输出该值,若小于或等于0则输出0值。请在程序中的横线上填入适当的内容,将程序补充完整。

#include \void nzp(int v) { int i=0;

if(v>0) printf(\else printf(\}

void main( ) { int a[5],i;

printf(\for(i=0;i<5;i++)

46

{ scanf(\_______________ ; } }

(二)一维数组a中的元素为:1,4,2,7,3,12,5,34,5,9。下面程序的功能是:求一维数组a中的最大元素及其下标。程序的输出应为:The max is: 34,position is: 7 。

请在程序中的横线上填入适当的内容,将程序补充完整。 #include #include int max;

int fun( int arr[ ],int n ) { int pos,i; max = arr[0]; pos = 0;

for ( i=1; i

pos=i; }

return(pos); }

void main()

{ int a[10]={1,4,2,7,3,12,5,34,5,9},n; _______________;

printf(\ }

(三)下面程序的功能是:将字符串1的第1,3,5,7,9,......位置的字符复制到字符串2并输出。

例如,当字符串1为\,则字符串2为\请在程序中的横线上填入适当的内容,将程序补充完整。 #include \ #include \ #include \

void fun(char str1[ ],char str2[ ]) { int i,j;

j=0;

for(i=0;i

str2[j]=’\\0’; }

void main( )

{ char str1[80]=\

47

本文来源:https://www.bwwdw.com/article/l1zt.html

Top