C语言程序设计物理与电子信息学院安徽师范大学.docx
《C语言程序设计物理与电子信息学院安徽师范大学.docx》由会员分享,可在线阅读,更多相关《C语言程序设计物理与电子信息学院安徽师范大学.docx(44页珍藏版)》请在冰豆网上搜索。
![C语言程序设计物理与电子信息学院安徽师范大学.docx](https://file1.bdocx.com/fileroot1/2023-6/28/0df1aafd-b4cc-4ad3-acd6-749814b3cdb5/0df1aafd-b4cc-4ad3-acd6-749814b3cdb51.gif)
C语言程序设计物理与电子信息学院安徽师范大学
C语言程序设计
实验指导书
蔡继盛王元航编写
安徽师范大学物理与电子信息学院计算机教研室
2005年9月
前言
七十年代初,贝尔实验室的DennisRitchie等人在B语言的基础上设计出C语言。
由于C语言既具有高级语言的强有力的表达能力,又不失低级语言直接访问内存地址及对硬件进行操作的特性,从而使它成为近十多年来在计算机应用领域做出巨大贡献的一种语言,并成功地应用于数值计算、文字处理、数据库和办公自动化等诸多方面。
为了配合课堂教学,我们根据大纲的要求,并结合所用教材,编写了本实验指导书,供学生上机操作使用。
指导书包括六个实验,每个实验均由实验目的、基本概念和实验内容三个部分构成。
其中实验内容包括“验证性内容”和“设计性内容”两部分。
“验证性内容”提供了参考程序,主要是加深对基本概念的理解、增加感性认识;“设计性内容”则是考察对所学知识灵活运用的能力。
上机操作是学好程序设计语言的一个极为重要的环节,因此要求在每次上机操作之前,仔细阅读实验指导书和教材中的相关内容,弄清基本概念,做好必要的准备(包括“设计性内容”中程序的编制)。
上机操作时认真调试程序,细心观察各种现象和结果,从而获得事半功倍的效果,巩固所学的知识。
实验一简单程序设计────────────────1
实验二选择型与循环型程序设计───────────7
实验三函数、数组与字符串─────────────14
实验四C语言的指针及其应用────────────21
实验五结构体、共用体、枚举、位运算────────26
实验六文件操作──────────────────33
实验一简单程序设计
一、实验目的
1.学会在TurboC集成环境下编辑和运行C程序
2.熟悉C语言中的各种表达式和运算符
3.初步掌握C语言输入输出函数的使用
二、基本概念
1.TurboC集成环境
TurboC是Borland公司开发的C语言集成环境系统,该系统集C语言的编辑、编译、连接和执行于一体,在实际中得到广泛应用。
在DOS状态下键入TC即可启动TurboC进入集成环境,这时出现初始屏幕
FileEditRunCompileProjectOptionsDebugBreak/watch
Line1Col1InsertIndentTabFillUnindentC:
NONAME.C
Message
F1-HelpF5-ZoomF6-SwitchF7-TraceF8-StepF9-MakeF10-Menu
其中第一行为若干主菜单项,每项主菜单均可下拉出若干子菜单项。
按F10键可激活主菜单,利用光标键←和→可选择某主菜单项,然后利用光标键↓和↑可选择具体的子菜单项,按回车则执行选定的菜单功能。
例如,按F10键激活主菜单,利用光标键←和→选择File菜单项,表示
LoadF3
PickAlt-F3
New
SaveF2
Writeto
Directory
Changedir
OSshell
QuitAlt-x
进行文件操作,用↓键拉出子菜单如下
选择其中的New则表示清除当前编辑画面中的程序,为输入新程序做好准备;若选择OSshell则表示不退出TurboC环境而进入DOS状态,这样可以执行DOS命令,命令执行后键入EXIT则回到TurboC环境。
RunCtrl-F9
ProgramresetCtrl-F2
GotocursorF4
TraceintoF7
StepoverF8
UserscreenAlt-F5
又例如,按F10键激活主菜单,选择Run菜单项,拉出其子菜单如下:
若选择其中的Run则表示执行用户程序(自动进行编译、连接);若选择Userscreen则表示进入用户屏幕,观察程序运行结果,因为程序运行结果通常被TurboC屏敝,进入用户屏幕方能看到。
初始屏幕的第二行为状态行,从中可以了解当前的光标位置、编辑状态和正在编辑的程序文件名。
屏幕底部为提示行,显示一些常用功能键的作用。
例如,"F6-Switch"是指F6代表切换,程序编译或连接时若出现错误,出错信息显示在Message栏中,按F6可切换到编辑状态对源程序进行修改。
Ctrl-Y删除光标所在的一行
Ctrl-F9运行程序(包括编译、连接)
Alt-F5进入用户屏幕查看运行结果
Alt-X退出TurboC集成环境,回到DOS状态
记住几个频繁使用的组合键可以大大提高操作效率:
2.运算符与表达式
C语言提供了大量的运算符和表达式,为程序的编写提供了很大的方便。
它们是:
赋值运算符和赋值表达式、算术运算符和算术表达式、关系运算符和关系表达式、逻辑运算符和逻辑表达式、条件运算符和条件表达式等等,应注意这些运算符的优先级和求值顺序。
3.数据的输入和输出
scanf(格式字符串,输入表)
printf(格式字符串,输出表)
C语言中没有专门的输入输出语句,数据的输入输出是通过调用函数实现的。
输入数据时常使用scanf函数,输出数据时常使用printf函数,这两个函数的调用形式为:
在输入输出时,应掌握常用格式字符的用法。
三、实验内容
(一)分析以下各程序的原理并上机验证
首先进入TurboC集成环境,若当前屏幕含有程序则清除之(调File主菜单中的New项)。
1.编写一个C程序,在屏幕上显示信息"Programmingisfun."
[参考程序]
main()
{
printf("Programmingisfun.\n");
}
先将程序输入计算机,然后可编译、连接、运行(按^F9),并进入用户屏幕观察结果是否正确(按Alt-F5)。
注意:
每输入一个新的程序之前,应先将原有程序从编辑屏幕中清除。
2.编程计算35°的正弦值。
[参考程序]
main()
{
floatx,y;
x=35*3.14159/180.0;
y=sin(x);
printf("%f\n",y);
}
请分析运行结果是否可靠?
在主函数前插入一行
#include"math.h"
再看运行结果有何变化?
由此体会“头文件”的重要性。
3.输入以下程序,分析格式字符串与输出的关系。
[参考程序]
main()
{
inta=3,b=4;
printf("Thesumof%dand%dis%d\n",a,b,a+b);
printf("%d+%d=%d\n",a,b,a+b);
printf("%d,%d,%d\n",a,b,a+b);
}
4.输入圆的半径,求其周长和面积。
[参考程序]
#definePI3.14159
main()
{
floatr,c,a;
printf("Pleaseinputradiushere");
scanf("%f",&r);
c=2*PI*r;
a=PI*r*r;
printf("Thecircumferenceis%f,theareais%f\n",c,a);
}
运行时输入半径5.5,记录运行结果。
5.输入以下程序,仔细分析其运行结果。
[参考程序]
main()
{
charch='A';
intn=97;
inti,j;
printf("ch=%c,ch=%d\n",ch,ch);
printf("n=%d,n=%c\n",n,n);
printf("%c,%d,%c,%d\n",ch+1,ch+1,n+1,n+1);
i=-5<-3;
j=5<3;
printf("1\ti=%d,j=%d\n",i,j);
i=(-5<-3<-1);
j=(2==2<4);
printf("2\ti=%d,j=%d\n",i,j);
i=(1<4&&7<4);
j=(4<3||2<3);
printf("3\ti=%d,j=%d\n",i,j);
}
(二)按要求进行程序设计并调试运行
1.用scanf输入任意三个数,用条件表达式求出其中的最小者并输出。
2.写一个程序打印以下两行信息:
Hesaid,"It'sonly65%!
"
PATH=C:
\WPS\BOOK
3.用scanf输入任意两个数给变量a、b,然后将它们的值交换再输出。
(即a的原值放入b中,b的原值放入a中)
4.从键盘输入华氏温度F,计算并输出摄氏温度,输出结果保留两位小数。
已知华氏温度F和摄氏温度C的关系为
运行时分别输入32、50、100,记录相应的运行结果
5.输入三角形三边长a、b、c,求三角形面积s:
其中,运行时输入的边长为3、4、6,记录面积值。
实验二选择型与循环型程序设计
一、实验目的
1.熟悉选择和循环的基本概念
2.掌握选择型程序和循环型程序的设计方法
3.进一步熟悉输入输出函数的使用
二、基本概念
循环结构和选择结构及顺序结构是程序设计的三种基本结构,是程序设计的基础。
C语言的选择型程序通过if语句和switch语句实现,其中if语句有三种结构形式。
if(条件)
语句;
1.if结构形式为:
若条件成立(非0)就执行给定的语句,否则跳过该语句往后执行。
if(条件)
语句1;
else
语句2;
2.if…else结构形式为:
若条件成立(非0)就执行语句1,否则执行语句2。
if(条件)
语句1;
elseif(条件2)
语句2;
.
.
elseif(条件n)
语句n;
else
语句n+1;
.
3.if…elseif结构形式为:
各个条件中,哪一个条件成立就执行哪一个语句;若都不成立,就执行语句n+1。
switch(开关表达式)
{
case情况1:
语句1;
case情况2:
语句2;
.
.
case情况n:
语句n;
default:
语句n+1;
}
4.switch结构形式为:
测试开关表达式,判断与哪一种情况相符,就转到相应的case执行,若没有遇到break语句就一直执行下去。
若与所有情况皆不符,就执行default中的语句。
C语言的循环结构有三种实现方法:
while(条件)
循环体;
1.while结构形式为:
只要条件为真,就反复执行循环体,每执行一次,对条件判断一次。
do
循环体;
while(条件);
2.do…while结构形式为:
反复执行循环体,直到条件不成立为止,每执行一次后,对条件判断一次。
for(初值;条件;增值)
循环体;
3.for结构形式为:
根据初值、条件和增值,将循环体执行若干次。
for结构是C语言中使用最多、功能最强的循环结构。
三、实验内容
(一)分析以下各程序的原理并上机验证
1.编写一个程序,由键盘接收三个整数,输出其中最大的数。
[参考程序]
main()
{
intn1,n2,n3,max;
printf("\nInputthreenumberhere:
");
scanf("%d,%d,%d",&n1,&n2,&n3);
max=n1;
if(n2>n1)max=n2;
if(n3>max)max=n3;
printf("Maxis%5d\n",max);
}
2.编写程序计算函数y的值,已知函数y与自变量x的关系为:
2x(x<0)
y=
x3(x≥0)
[参考程序]
main()
{
floatx,y;
printf("Inputthevalueofx:
\n");
scanf("%f",&x);
if(x<0)
y=2*x;
else
y=x*x*x;
printf("x=%7.2f,y=%7.2f\n",x,y);
printf("x=%e,y=%e\n",x,y);
printf("x=%g,y=%g\n",x,y);
}
运行时x分别输入2.52,-3.7,1234.5,记录并分析运行结果。
3.计算级数和1+2+3+…+100。
[参考程序]
main()
{
inti,sum=0;
i=1;
loop:
if(i<=100)
{
sum+=i;
i++;
gotoloop;
}
printf("sumis%d\n",sum);
}
4.一个简易的菜单程序。
[参考程序]
main()
{
intn;
again:
printf("\n\t\t\t1-sort");
printf("\n\t\t\t2-search");
printf("\n\t\t\t3-list");
printf("\n\t\t\t0-exit");
printf("\n\n\t\t\tpleaseselect(0-3)");
scanf("%d",&n);
switch(n)
{
case1:
printf("\nYouaresorting");break;
case2:
printf("\nYouaresearching");break;
case3:
printf("\nYouarelisting");break;
case0:
exit(0);
default:
printf("\nwrongselection!
selectagain!
\n");
}
gotoagain;
}
5.用while结构计算级数和1+2+3+…+100。
[参考程序]
main()
{
intsum=0,i=1;
while(i<=100)
{
sum=sum+i;
i=i+1;
}
printf("Thesumis%d\n",sum);
}
程序的循环体可以改为
{
sum+=i;
i++;
}
或简化为
{
sum+=i++;
}
6.用do…while结构重新计算上述级数和。
[参考程序]
main()
{
intsum=0,i=1;
do{
sum+=i;
i++;
}while(i<=100);
printf("Thesumis%d\n",sum);
}
7.打印Fibonacci数列的前20项。
[参考程序]
#include"stdio.h"
main()
{
intn;
longfib,fib1=1,fib2=1;
printf("%ld%ld",fib1,fib2);
for(n=3;n<=20;n++)
{
fib=fib1+fib2;
fib1=fib2;
fib2=fib;
printf("%ld",fib);
}
putchar('\n');
}
8.用牛顿迭代法和for结构计算实数的平方根。
[参考程序]
#include"math.h"
#defineERROR1e-6
main()
{
doublea,x;
printf("Enteranumbertobesquarerooted");
scanf("%lf",&a);
if(a>=0)
{
for(x=a;fabs(x*x-a)>ERROR;)
x=(x+a/x)/2.0;
printf("Thesquarerootof%fis%f\n",a,x);
}
else
printf("Negativecan'tbesquarerooted!
\a\n");
}
运行时分别输入9,10,-3,记录运行结果。
(二)按要求进行程序设计并调试运行
1.从键盘输入任意一个字符,若为小写字母则自动转换为大写输出,其余字符原样输出。
(提示:
用getchar函数)
2.利用if…elseif结构判断输入的字符是大写字母、小写字母、数字字符或是其它字符,分别显示相应的提示信息。
3.利用实验题3的方法计算级数1+3+5+…+99的和。
4.用for结构计算级数和1+2+3+…+100。
5.验证勒让德计算素数的通项公式
an=n2+n+41(n=0,1,2,…)
当n为多少时公式失效。
实验三函数、数组与字符串
一、实验目的
1.掌握函数的定义与声明
2.掌握函数的常规调用、嵌套调用和递归调用
3.初步掌握变量的存储属性及其使用
4.初步掌握编译预处理中宏定义和文件包含的用法
5.掌握一维数组和二维数组的定义和使用
6.掌握用字符数组处理字符串的方法
二、基本概念
(一)函数
模块化是结构化程序设计的基础,C语言程序是由一个个函数模块组成的,符合这种结构化的要求,因此希望通过本实验,初步掌握结构化程序设计的方法。
1.函数的定义、声明和调用
函数类型 函数名(形参及其类型)
{
函数体
}
C语言程序是由一系列函数组成的,每一个函数构成一个模块,这些函数可以是标准库函数,也可以是用户自己定义的函数。
函数的定义方法如下:
函数定义后便可使用,但为了正确地调用它,必须作出恰当的声明,
函数类型 函数名(形参及其类型)
以便向编译系统提供必要的信息。
函数声明方法如下:
C语言中的函数通常是以传值方式调用的,调用可以形成嵌套,即一个函数调用另一个函数。
此外,C语言允许函数递归调用,即函数直接或间接地调用自己。
但不论何种调用,均必须注意形参和实参之间的对应关系。
2.变量的存储属性
C语言中的变量,如按其存储介质,可分为内存变量和寄存器变量;如按其生存期,可分为动态变量和静态变量;如按其作用域,可分为全局变量和局部变量。
要掌握变量的这些分类方法,能够在程序中灵活运用不同的变量。
3.编译预处理
宏定义和文件包含是C语言中最常见的预处理操作。
#define宏名 宏体
#define宏名(参数表)宏体
宏定义分为无参数和有参数两种,它们的形式分别为
利用宏定义可以有效地增加程序的灵活性,但在使用时应注意带参宏定义与函数之间的区别。
#include“文件名”或#include<文件名>
文件包含的形式为
它常用于包含"头文件",因为C语言中大量的库函数一般要使用一些公共的定义和说明信息,这些信息均保存于“头文件”中。
应注意不同类的库函数对应的是不同的头文件,包含时不可弄错。
(二)数组
数组是一种构造类型的数据,即类型相同的一组数据的有序集合,它们具有相同的名字和不同的序号,这个相同的名字就是数组名,不同的序号就是下标。
数组类型数组名[元素个数]
数组类型数组名[行数][列数]
数组可分为一维数组、二维数组和多维数组。
在实际使用中,以一维数组和二维数组较常见。
数组的定义形式为:
前者定义一维数组,后者定义二维数组。
数组经过定义,便可用来存放数据。
数组的引用可以通过带下标的数组元素来进行,也可将数组名作为函数的参数进行传递。
(三)字符数组和字符串
如果数组中存放的是字符数据,则称为字符数组,字符数组常用来存放字符串,应记住字符串是以'\0'作为结束字符的。
利用字符数组,再结合字符串运算函数,如字符串拷贝strcpy、字符串连接strcat、字符串比较strcmp、测字符串长度strlen等,便可实现字符及字符串的各种处理操作。
三、实验内容
(一)分析以下各程序的原理并上机验证
1.将计算xn编写为函数,然后在主函数中调用,并计算210和(-4)3。
[参考程序]
main()
{
floatpower(floatx,intn);
floatx,p;
intn;
printf("Inputxandn\n");
scanf("%f,%d",&x,&n);
p=power(x,n);
printf("%ftothe%dthpoweris%f\n",x,n,p);
}
floatpower(floatx,intn)
{
inti;
floatp=1;
for(i=0;ip*=x;
return(p);
}
2.定义一个宏,将大写字母变为小写字母。
[参考程序]
#defineLOWER(c)(c>=65&&c<=90?
c+32:
c)
main()
{
charc;
scanf("%c",&c);
printf("Theoriginalis%c\n",c);
printf("Thenewis%c\n",LOWER(c));
}
运行时分别输入字符B、Q、a、4、*,记录运行结果。
3.已知一组数据从小到大排列(设为1,3,5,7,9)任意输入一个数,插入到该数列中,并保持原有顺序不变。
[参考程序]
main()
{
inta[6]={1,3,5,7,9};
inti,new,position;
printf("Enterthenewnumbertobeinserted\n");
scanf("%d",&new);
for(i=0;i<5;i++)
if(a[i]>new)break;
position=i;
for(i=5;i>position;i--)
a[i]=a[i-1];
a[position]=new;
printf("Thenewarrayis\n");
for(i=0;i<=5;i++)
printf("%d",a[i]);
}
运行时分别输入6,12,-3,7,记录运行结果。
4.已知10名学生的成绩,求其平均成绩,试将数组名作为函数参数传递。
[参考程序]
main()
{
floataverage(floatarray[],intn);
floatscore[10]={95,86.5,100,78,56,93.5,68,72,84,92};
printf("Theaveragescoreis%6.2f\n",average(score,10));
}
floataverage(floatarray[],intn)
{
inti;
floataver,sum=array[0];
for(i=1;isum+=array[i];
aver=sum/n;
return(aver);
}
5.在屏幕上显示sinx和cos(2x+30°)两条曲线,每隔10°显示一个点。
[参考程序]将整个屏幕看作一个二维字符数组,分为24行80列,则有以下程序
#definePI3.14159
#include"math.h"
main()
{
chargraph[24][80];
inti,j1,j2;
floatx,y1,y2;
for(i=0;i<24;i++)
{
for(j1=0;j1<79;j1++)
graph[i][j1]='';
gr