C程序设计上机实验指导.docx

上传人:b****3 文档编号:5479885 上传时间:2023-05-08 格式:DOCX 页数:28 大小:33.36KB
下载 相关 举报
C程序设计上机实验指导.docx_第1页
第1页 / 共28页
C程序设计上机实验指导.docx_第2页
第2页 / 共28页
C程序设计上机实验指导.docx_第3页
第3页 / 共28页
C程序设计上机实验指导.docx_第4页
第4页 / 共28页
C程序设计上机实验指导.docx_第5页
第5页 / 共28页
C程序设计上机实验指导.docx_第6页
第6页 / 共28页
C程序设计上机实验指导.docx_第7页
第7页 / 共28页
C程序设计上机实验指导.docx_第8页
第8页 / 共28页
C程序设计上机实验指导.docx_第9页
第9页 / 共28页
C程序设计上机实验指导.docx_第10页
第10页 / 共28页
C程序设计上机实验指导.docx_第11页
第11页 / 共28页
C程序设计上机实验指导.docx_第12页
第12页 / 共28页
C程序设计上机实验指导.docx_第13页
第13页 / 共28页
C程序设计上机实验指导.docx_第14页
第14页 / 共28页
C程序设计上机实验指导.docx_第15页
第15页 / 共28页
C程序设计上机实验指导.docx_第16页
第16页 / 共28页
C程序设计上机实验指导.docx_第17页
第17页 / 共28页
C程序设计上机实验指导.docx_第18页
第18页 / 共28页
C程序设计上机实验指导.docx_第19页
第19页 / 共28页
C程序设计上机实验指导.docx_第20页
第20页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

C程序设计上机实验指导.docx

《C程序设计上机实验指导.docx》由会员分享,可在线阅读,更多相关《C程序设计上机实验指导.docx(28页珍藏版)》请在冰点文库上搜索。

C程序设计上机实验指导.docx

C程序设计上机实验指导

C程序设计上机实验指导讲义

 

Lituo16@

实验报告书写格式(供参考):

《C语言程序设计》上机第次实验报告

实验名称:

姓名:

学号班级

实验类型

1、实验目的

(1)……..

(2)…….

…………..

2、实验(设计)内容(包括实验(设计)步骤、上机(设计)内容,程序清单,运行结果等)

(1)……..

…………..

(2)…….

…………

…………..

3、实验体会

(1)……..

…………..

(2)…….

目录

C程序设计上机实验指导讲义1

实验报告书写格式(供参考):

I

《C语言程序设计》上机第次实验报告I

目录II

实验一、I/O操作及顺序结构、分支结构程序设计3

一、实验目的:

3

二、实验内容:

3

实验二、循环结构程序设计4

一、实验目的:

4

二、实验内容:

4

实验三、数组程序设计7

一、实验目的:

7

二、实验内容:

7

实验四、指针程序设计9

一、实验目的:

9

二、实验内容:

9

三、补充资料10

实验五、指针、函数程序设计13

一、实验目的:

13

二、实验内容:

13

实验六、结构体程序设计17

一、实验目的:

17

二、实验内容:

17

实验七、综合设计实验18

一、实验目的:

18

二、实验内容:

18

三、实验步骤:

19

四、大型程序设计注意事项:

19

 

实验一、I/O操作及顺序结构、分支结构程序设计

一、实验目的:

1.掌握C语言各种标准函数的使用,并学会通过在线帮助了解标准函数使用方法以及对应的头文件;

2.掌握C数据输入输出方法,包括格式化I/O、字符串I/O,可以选择掌握C++流输入输出cin/cout;

3.掌握预编译命令#define和#include的使用;

4.学会正确使用逻辑运算符及逻辑表达式,注意“==”“=”的区别;

5.掌握顺序结构;

6.掌握选择分支结构的使用,包括if语句和switch语句(两种形式);

7.注意培养良好的程序设计习惯和风格.通过编程及上机调试,提高编程能力。

二、实验内容:

1、自行编程理解scanf和printf的各种格式说明,体会格式说明的类型要与输入/输出参数类型的一致性.

2、参考在线帮助理解gets()、puts()、putchar()、getchar()、cin、cout等函数(类)的使用方法,试着编写程序实现输入输出操作,并体验行缓冲输入方式,以及重定向的含义;

3、输入华氏温度,要求输出摄氏温度,公式为:

C=5/9*(F-32),输出要求文字说明,取2位小数。

4、试编程将阳历年365.2422天换算成几天几小时几分几秒?

(注意:

秒的结果是带小数的,试试存放秒的变量分别用float,double,longdouble定义,看结果有什么区别?

5、口令编码:

从键盘输入8位字符,对其进行编码,编码规律:

将顺序输入的8位字符同生日(如19820928)进行按位异或(如输入“students”,’s’对’1’,’t’对’9’,...),输出编码结果。

6、写出下面表达式运算后a的值,设原来a=10。

设a和n已定义成整型变量。

(1)a+=a

(2)a-=2

(3)a*=2+3(4)a/=a+a

(5)a%=(n%=2),n的值等于5(6)a+=a-=a*=a

先自己分析,再试着编写程序求解,看得到的结果是否一致。

 

7、运行程序:

#include

#include

voidmain()

{

inti;

charc;

scanf("%d",&i);

scanf("%c",&c);

cout<<"i="<

cout<<"c="

<<(c>32?

c:

'?

')<

}

运行时输入:

68回车A回车,运行结果有什么问题出现?

如何处理?

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

90分以上(包括90):

A

80至90分(包括80):

B

70至80分(包括70):

C

60至70分(包括60):

D

60分以下:

E

以下是采用if-else的语法结构编写的程序:

#include"stdio.h"

voidmain()

{

intscore;

chargrade;

printf("\npleaseinputastudentscore:

");

scanf("%f",&score);

if(score>100||score<0)

printf("\ninputerror!

");//程序中对用户可能的错误输入,进行的出错处理

else

{

if(score>=90)

grade='A';

else

{

if(score>=80)

grade='B';

else

{

if(score>=70)

grade='C';

else

{

if(score>=60)

grade='D';

elsegrade='E';

}

}

}

printf("\nthestudentgrade:

%c",grade);

}

}

请把上述程序改为采用switch语句编写,写出程序,调试运行并输入测试数据,输出成绩等级。

9、编写程序求s=z+x+y

ex+yx<0,y<0

z=e2x-y0<=x<1,y>=0

lnxx>=1

【基本要求】:

.打开math.h头文件(在bc或tc目录下的include子目录中),寻找要求的函数原型。

.分析问题,输入是什么,输出是什么,处理过程如何用if语句构造,编制可读性好的程序(利用缩进规则,空行规则,学会附加注释)。

【测试数据】

分析下面几组数据的测试结果:

1)、-1-6

2)、-3.1-2.5

3)、0.6-4.4

4)、0.78

5)、3-2

【思考】:

用switch语句实现有什么困难?

程序如何防止不在这些条件内的数据输入?

 

实验二、循环结构程序设计

一、实验目的:

1.掌握while、do—while和for三种循环语句的使用;

2.掌握流程控制语句continue、break、goto的使用。

3.利用C/C++开发环境的在线帮助自学C/C++语言(BC++环境下用F1、Alt+F1、Shift+F1,VC++环境下用F1看帮助),进一步掌握查找与修改编译错误以及学习调试的方法。

二、实验内容:

【一般示例】

【例1】求5!

#include

voidmain()

{

intn,t;

n=1;

t=1;

while(t<=5)

{

n=n*t;

t=t+1;

}

printf(“%d”,n);

}

【例2】求和s=1!

+2!

+3!

#include

voidmain()

{

intn,s=0,t=1;

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

{

t=t*n;

s=s+t;

}

printf(“%d\n”,s);

}

【例3】求和s=3+33+333

#include

voidmain()

{

ints=0,t=3,i;

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

{

s=s+t;

t=10*t+3;

}

printf(“%d\n”,s);

}

【例4】有一数列:

2/1,3/2,5/3,8/5,…求出这个数列的前10项之和。

#include

voidmain()

{

intn,t,;

floata=2,b=1,s=0;

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

{

s=s+a/b;

t=a;

a=a+b;

b=t;

}

printf(“%f\n”,s);

}

【典型示例】用牛顿迭代求方程2x3-4x2+3x-6=0在1.0附近的根。

#include

voidmain()

{

floatx,x0,f,f1;

x=1.0;

do

{

x0=x;

f=((2*x0-4)*x0+3)*x0-6;

f1=(6*x0-8)*x0+3;

x=x0-f/f1;

}while(fabs(x-x0)>=1e-5);

printf(“%6.2f”,x);

}

以下为上机编程实现:

1、编写一个程序,计算

【基本要求】:

用下述方式分别编程并比较结果:

1从左到右各项相加;②从右到左各项相加;③从左到右各个正项和负项分别相加;④从右到左各个正项和负项分别相加;

【思考】:

1三种循环结构for、while、do…while都能实现吗?

2如果n(项数)由程序运行时输入确定,程序应如何修改?

3如果精度要求|sn-sn-1|<1e-8,则程序如何修改,此时n的值是什么?

2、编写一个程序求整数n阶乘(n!

【基本要求】:

每三个一行,共输出从1-21个数的排列,如下所示:

1!

12!

23!

6

4!

245!

1206!

720

【思考】:

1)计算20的阶乘时遇到什么困难,怎么解决?

(提示:

考虑数据类型,printf时还要考虑指定与该类型对应的格式说明)

2)设计一个循环,不断提示用户任意输入一个整数,计算该整数的阶乘并输出显示,直到用户输入负数终止循环。

3、输入一行字符,分别统计出其中的英文字母、空格、数字和其他字符的个数。

(用getchar、while、if-elseif-else实现)

4、用迭代法求x=√a。

求平方根的迭公式为Xn+1=1/2*(xn+a/xn)要求前后两次求出的x的差的绝对值小于10-5

5、输出500以内的所有亲密数,并输出所有亲密数之和。

要求:

1)程序中既要有for循环也要有while或do…while循环

2)在输出每对亲密数时,小数在前、大数在后,并去掉重复的亲密数对,例如:

220和284是一对亲密数,而284和220也是一对亲密数,只输出220和284这对“亲密数”

3)输出要有文字说明。

输出时每对亲密数用一对圆括号括起来,两数间逗号隔开,每对占一行

4)“亲密数”定义:

如果自然数M的所有因子(包括1不包括M本身)之和为N,而N所有因子和为M,则M和N为一对亲密数。

如:

6所有因子和=1+2+3=6,所以,6和它自身构成一对“亲密数”。

6、输入一个十六进制数,输出相应的十进制数。

 

实验三、数组程序设计

一、实验目的:

1.掌握一维、二维数组定义、引用、初始化的方法;

2.掌握字符数组和字符串库函数的使用;

3.掌握与数组有关的算法(排序与查找与矩阵运算);

4.进一步熟悉C开发环境中调试、跟踪的使用。

二、实验内容:

1、用交换法(又叫冒泡法)对10个整数升/降序排列输出(要求:

外层循环变量代表的轮次号从0开始编号)

2、编程实现字符串拷贝、比较功能,要求不能使用系统库函数strcpy、strcmp。

3、有15个数存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。

如果该数不在数组中,则输出“无此数”。

以15个数用赋初值的方法在程序中给出,要找的数用scanf函数输入。

4、输入一组实数,按录入顺序保存进数组arr中,采用选择法对其排序,任意输入一数,直接在arr数组中将其按序插入相应位置。

(不允许使用其它数组来完成)

5、上机写出下面程序的运行结果并与自己分析结果比较:

#include

charstr[]=“SSSWILTECH1\1\11W\1WALLMP1”;

voidmain()

{

intk;charc;

for(k=2;(c=str[k])!

=‘\0’;k++)

{

switch(c)

{

case‘A’:

putchar(‘a’);continue;

case‘1’:

break;

case1:

while((c=str[++k])!

=‘\1’&&c!

=‘\0’);

case9:

putchar(‘#’);

case‘E’:

case‘L’:

continue;

default:

putchar(c);continue;

}

putchar(‘*’);

}

puts(“”);

}

6、编程实现将一行字符串中最长的单词输出。

7、输入一串字符,以“?

”结束。

统计各字母出现的次数,并按字母出现的多少输出(先输出次数多的,次数相同的按字母表顺序输出,不出现的字母不输出)。

如:

输入:

5B3A+4-HDEH5DH?

要求:

排序方法任选交换法和选择法中一种

输出:

H3

D2

A1

B1

E1

8、输入一段以回车换行终止的英文语句,要求将句中的多余空格删掉(允许在单词之间有一个空格),然后将句中单词首字母全改成大写输出。

要求:

该英文语句保存进数组中,删除多余空格及大写首字母均在同一个数组中进行。

9、编程求一个3×3矩阵对角线元素之和。

 

实验四、指针程序设计

一、实验目的:

1、进一步熟悉开发环境,掌握编译、连接和调试的技巧;

2、理解指针的概念,掌握指针变量的定义与引用;

3、掌握使用数组的指针和指向数组的指针变量;

4、掌握使用字符串的指针和指向字符串的指针变量。

二、实验内容:

1、上机调试并理解下述例题:

找错并作理解说明:

#include

voidmain(void)

{

inta[10],i,*p;

for(i=0,p=a;p

*p=i+1;

for(i=0;i<10;i++,p++)

cout<<*p<

}

2、编程实现:

输入一个字符串,内有数字和非数字符号,如:

a123x45617960?

302tab5876。

将其中连续的数字作为一个整数,依次存放到一个数组a中。

例如:

123放在a[0]中,456放在a[1]中……试统计共有多少个整数,并输出这些数。

要求添加合适的注释。

3、利用指向指针的指针方法对6个字符串按字典顺序排序并输出。

4、利用指向指针的指针的方法对N个整数排序并输出。

5、编程实现,先读入一段正文,然后删除其中单词from、in、at、an和on,最后显示该结果文本段。

6、理解教材示例:

例6.9,例6.10,例6.14

三、补充资料

关于内存的管理在C/C++中的深度理解:

内存分配方式有三种:

(1)从静态存储区域分配。

内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。

例如全局变量,static变量。

(2)在栈上创建。

在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。

栈内存分配运算内置于处理器的指令集中,效率很高,管理自动,但是分配的内存容量有限。

(3)从堆上分配,亦称动态内存分配。

程序在运行的时候用malloc或new(C++运算符)申请任意多少的内存,程序员自己负责在何时用free或delete(C++运算符)释放内存。

动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

malloc/free的使用要点

函数malloc的原型如下:

void*malloc(size_tsize);

用malloc申请一块长度为length的整数类型的内存,程序如下:

int*p=(int*)malloc(sizeof(int)*length);

我们应当把注意力集中在两个要素上:

“类型转换”和“sizeof”。

◆malloc返回值的类型是void*,所以在调用malloc时要显式地进行类型转换,将void*转换成所需要的指针类型。

◆malloc函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数。

我们通常记不住int,float等数据类型的变量的确切字节数。

例如int变量在16位系统下是2个字节,在32位下是4个字节;而float变量在16位系统下是4个字节,在32位下也是4个字节。

在malloc的“()”中使用sizeof运算符是良好的风格,但要当心有时我们会昏了头,写出p=malloc(sizeof(p))这样的程序来。

◆函数free的原型如下:

voidfree(void*memblock);

为什么free函数不象malloc函数那样复杂呢?

这是因为指针p的类型以及它所指的内存的容量事先都是知道的,语句free(p)能正确地释放内存。

如果p是NULL指针,那么free对p无论操作多少次都不会出问题。

如果p不是NULL指针,那么free对p连续操作两次就会导致程序运行错误。

常见的内存错误及其对策如下:

◆内存分配未成功,却使用了它。

编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。

常用解决办法是,

在使用内存之前检查指针是否为NULL。

如果是用malloc或new来申请内存,应该用if(p==NULL)或if(p!

=NULL)进行防错处理。

例如:

char*p=(char*)malloc(100);

if(p==NULL)exit

(1);

strcpy(p,“hello”);

◆忘记了释放内存,造成内存泄露。

含有这种错误的函数每被调用一次就丢失一块内存。

刚开始时系统的内存充足,你看不到错误。

但最终程序会突然死掉,系统出现提示:

内存耗尽(outofmemory)。

动态内存的申请与释放必须配对,程序中malloc与free的使用次数一定要相同,否则肯定有错误(C++中采用的new/delete同理)

 

例如:

voidGetMemory(char*p,intnum)

{

p=(char*)malloc(sizeof(char)*num);

}//不要以为局部变量p的内存空间会自动被回收,就能保证指针p指向的内存空间也会被回收,这是做不到的。

voidmain()

{

char*str=NULL;

GetMemory(str,100);//str仍然为NULL,形参的变化不影响实参

strcpy(str,"hello");//运行错误,同时另外隐藏的问题就是malloc分配的堆空间没有被释放

}

◆释放了内存却继续使用它。

有三种情况:

(1)程序中的对象调用关系过于复杂,实在难以搞清楚某个对象究竟是否已经释放了内存,此时应该重新设计数据结构,从根本上解决对象管理的混乱局面。

(2)函数的return语句写错了,注意不要返回指向“栈内存”的“指针”,因为该内存在函数体结束时被自动销毁。

(3)使用free或delete释放了内存后,没有将指针设置为NULL。

导致产生“野指针”

例如:

char*p=(char*)malloc(100);

if(!

p)exit

(1);

strcpy(p,“hello”);

free(p);//p所指的内存被释放,但是p变量本身空间没有释放,其值代//表的所指内存的地址仍然不变。

if(p!

=NULL)//没有起到防错作用

{

strcpy(p,“world”);//出错,即便p不是NULL指针,它已不指向合法//的内存块

}//此时的p指针是典型的“野指针”,它所指内存中保存的是垃圾内容。

从上面的分析可以发现指针有一些“似是而非”的特征:

(1)指针变量本身消亡了,并不表示它所指的内存会被自动释放。

(2)内存被释放了,并不表示指针会消亡或者成了NULL指针。

要坚决杜绝“野指针”,“野指针”不是NULL指针,是指向“垃圾”内存的指针。

人们一般不会错用NULL指针,因为用if语句很容易判断。

但是“野指针”是很危险的,if语句对它不起作用。

“野指针”产生的原因:

(1)指针变量没有被初始化。

任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。

所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。

例如

char*p=NULL;

char*str=(char*)malloc(100);

(2)指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。

如上例。

试着单步跟踪分析下面程序出现乱码而不输出helloworld的原因:

#include

char*GetString(void)

{

charp[]="helloworld";

returnp;//p指针指向哪一类内存空间?

}

voidmain(void)

{

char*str=NULL;

str=GetString();

cout<

}写出你对结果的理解。

 

实验五、指针、函数程序设计

一、实验目的:

1.理解函数定义和函数原型说明的方法,掌握函数调用中实参与形参的对应关系,理解“传值”和“传指针”;

2.掌握递归函数定义和调用的方法。

3.掌握指针和函数的结合

4.掌握含多个源文件的程序的编译、连接和调试运行的方法。

5.进一步熟悉C开发环境中调试的使用

二、实验内容:

在实际的程序设计中,通常要求实现在A函数中使用B函数中定义的数组,这就要需要传递数组的指针,实参常用数组名或指针变量来表示,B函数的形参用形参数组名变量或指针变量来表示,它们的参数传递通常有四种组合。

【1】intmax(intx[],intn)

{

inti,max;

max=x[0];

for(i=1;i

if(x[i]>max)max=x[i];

returnmax;

}

voidmain()

{

inta[10],i;

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

scanf(“%d”,&a[i]);

max(a,10);

...

}

【2】intmax(int*x,intn)

{

int*p,max;

max=*x;

for(p=x+1;p

if(*p>max)max=*p;

returnmax;

}

voidmain()

{

inta[10],i,*p;

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

scanf(“%d”,&a[i]);

p=a;

max(p,10);

...

}

【3】intmax(intx[],intn)

{

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2