语言程序设计第3次上机.docx

上传人:b****1 文档编号:428215 上传时间:2022-10-10 格式:DOCX 页数:17 大小:635.05KB
下载 相关 举报
语言程序设计第3次上机.docx_第1页
第1页 / 共17页
语言程序设计第3次上机.docx_第2页
第2页 / 共17页
语言程序设计第3次上机.docx_第3页
第3页 / 共17页
语言程序设计第3次上机.docx_第4页
第4页 / 共17页
语言程序设计第3次上机.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

语言程序设计第3次上机.docx

《语言程序设计第3次上机.docx》由会员分享,可在线阅读,更多相关《语言程序设计第3次上机.docx(17页珍藏版)》请在冰豆网上搜索。

语言程序设计第3次上机.docx

语言程序设计第3次上机

C语言程序设计实验报告

班级CS1108日期2012/5/26

学生姓名王一微学号U201114404

第3次上机

实验1编译预处理

(一)实验目的

(1)掌握文件包含、宏定义、条件编译、assert宏的使用;

(2)练习带参数的宏定义、条件编译的使用;

(3)练习assert宏的使用;

(4)使用集成开发环境中的调试功能:

单步执行、设置断点、观察变量值。

(二)实验内容及要求

1.源程序改错

下面是用宏来计算平方差和交换两数的源程序。

在这个源程序中,存在若干语法和逻辑错误,要求在计算机上对这个源程序进行调试修改,使之能够正确完成计算平方差和交换两数的任务。

源程序:

#include

#defineSUMa+b

#defineDIFa-b

#defineSWAP(a,b)a=b,b=a

voidmain(void)

{

intb,t;

printf("Inputtwointegersa,b:

");

scanf("%d,%d",&a,&b);

printf("\nSUM=%d\nthedifferencebetweensquareofaandsquareofbis:

%d",SUM,SUM*DIF);

SWAP(a,b);

Printf("\nNowa=%d,b=%d\n",a,b);

}

源程序在code:

blocks上运行后出现

修改后为:

运行测试为:

2.源程序修改替换

下面是用函数实现求三个数中最大数、计算两数之和的源程序。

在这个源程序中存在若干语法和逻辑错误,要求:

(1)对这个例子程序进行调试修改,使之能够正确完成指定任务。

(2)用带参数的宏替换函数max,来实现求最大数的功能。

源程序:

voidmain(void)

{

inta,b,c;

floatd,e;

printf("Enterthreeintegers:

");

scanf("%d,%d,%d",&a,&b,&c);

printf("\nthemaximumofthemis%d\n",max(a,b,c));

printf("Entertwofloatingpointnumbers:

");

scanf("%f,%f",&d,&e);

printf("\nthesumofthemis%f\n",sum(d,e));

}

intmax(intx,inty,intz)

{

intt;

if(x>y)

t=x;

else

t=y;

if(t

t=z;

returnt;

}

floatsum(floatx,floaty)

{

returnx+y;

}

(1)源程序修改后为:

运行测试为:

(2)按要求修改源程序如下:

运行测试为

3.跟踪调试程序

下面程序的功能是利用R计算圆的面积s,以及面积s的整数部分。

现要求:

(1)修改程序,使程序编译通过且能运行。

源程序修改如下:

运行测试为:

(2)单步执行。

进入函数integer_fraction时,watch窗口中x为何值?

在返回main时,watch窗口中i为何值?

单步执行,进入integer_fraction时,watch窗口中x=254.468796.返回main时,watch中i=254.

(3)排除错误,使程序能正确输出面积s值的整数部分,不会输出错误信息assertionfailed。

程序代码:

#defineR

voidmain(void)

{

floatr,s;

ints_integer=0;

printf("inputanumber:

");

scanf("%f",&r);

#ifdefR

s=3.14159*r*r;

printf("areaofroundis:

%f\n",s);

s_integer=integer_fraction(s);

printf("theintegerfractionofareais%d\n",s_integer);

assert((s-s_integer)<1.0);

#endif

}

intinteger_fraction(floatx)

{

inti=x;

returni;

}

实验2数组实验

(一)实验目的

(1)掌握数组的说明、初始化和使用。

(2)掌握一维数组作为函数参数时实参和形参的用法。

(二)实验内容及要求

1.源程序改错

下面是用来将数组a中元素按升序排序后输出的源程序。

分析源程序中存在的问题,并对源程序进行修改,使之能够正确完成任务。

源程序:

#include

voidmain(void)

{

inta[10]={27,13,5,32,23,3,17,43,55,39};

voidsort(int[],int);

inti;

sort(a[0],10);

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

printf("%6d",a[i]);

printf("\n");

}

voidsort(intb[],intn)

{

inti,j,t;

for(i=0;i

for(j=0;j

if(b[j]

t=b[j],b[j]=b[j+1],b[j+1]=t;

}

源程序修改如下:

运行测试为:

2.源程序完善、修改、替换

(1)下面的源程序用于求解瑟夫问题:

M个人围成一圈,从第一个人开始依次从1至N循环报数,每当报数为N时报数人出圈,直到圈中只剩下一个人为止。

请在源程序中的下划线处填写合适的代码来完善该程序。

源程序:

#include

#defineM10

#defineN3

voidmain(void)

{

inta[M],b[M];/*数组a存放圈中人的编号,数组b存放出圈人的编号*/

inti,j,k;

for(i=0;i

a[i]=i+1;

for(i=M,j=0;i>1;i--){

/*i表示圈中人个数,初始为M个,剩1个人时结束循环;j表示当前报数人的位置*/

for(k=1;k<=N;k++)/*1至N报数*/

if(++j>i-1)j=0;/*最后一个人报数后第一个人接着报,形成一个圈*/

b[M-i]=j?

a[j-1]:

a[i-1];/*将报数为N的人的编号存入数组b*/

if(j)

for(k=--j;k

a[k]=a[k+1];

}

for(i=0;i

printf(“%6d”,b[i]);

printf(“%6d\n”,a[0]);/*输出圈中最后一个人的编号*/

}

运行测试为:

(2)上面的程序中使用数组元素的值表示圈中人的编号,故每当有人出圈时都要压缩数组,这种算法不够精炼。

如果采用做标记的办法,即每当有人出圈时对相应数组元素做标记,从而可省掉压缩数组的时间,这样处理效率会更高一些。

因此,请采用做标记的办法修改

(1)中的程序,并使修改后的程序与

(1)中的程序具有相同的功能。

源程序为:

运行测试为:

3.跟踪调试源程序

在下面所给的源程序中,函数strncat(s,t,n)本来应该将字符数组t的前n个字符连接到字符数组s中字符串的尾部。

但函数strncat在定义时代码有误,不能实现上述功能。

请按下面的要求进行操作,并回答问题和排除错误。

(1)单步执行源程序。

进入函数strncat后观察表达式s、t和i。

当光条落在for语句所在行时,i为何值?

当光条落在strncat函数块结束标记(右花括号})所在行时,s、t分别为何值?

光条落在for语句所在行时,i=22

光条落在strncat函数块结束标记所在行时

(2)分析函数出错的原因,排除错误,使函数正确实现功能,最后写出程序的输出结果。

源程序:

#include

voidstrncat(char[],char[],int);

voidmain(void)

{

chara[50]="Theadoptedsymbolis",b[27]="abcdefghijklmnopqrstuvwxyz";

strncat(a,b,4);

printf("%s\n",a);

}

voidstrncat(chars[],chart[],intn)

{

inti=0,j;

while(s[i++]);

for(j=0;j

s[i++]=t[j++];

s[i]='\0';

}

(2)调试发现s,t和i值有误,修改后源程序为:

运行输出结果为:

程序设计:

编写并上机调试运行能实现以下功能的程序。

(1)已知三角形的面积是

,其中

,a,b,c为三角形的三边。

定义两个带参数的宏,一个用来求s,另一个用来求area,试编写一程序,用带参数的宏来计算三角形的面积。

(1)源程序如下:

运行测试为:

结果正确。

(2)使用条件编译方法编写一程序,其功能要求是,输入一行电报文字,可以任选两种输出:

一为原文输出;二为变换字母的大小写(如小写‘a’变成大写‘A’,大写‘D’变成小写‘d’),其他字符不变。

用#define命令控制是否变换字母的大小写。

例如,#defineCHANGE1则输出变换后的文字,若#defineCHANGE0则原文输出。

(2)源程序如下:

运行测试为:

将#defineCHANGE1换为#defineCHANGE0后源程序为:

运行测试为:

结果正确。

(3)编写一个程序,从键盘读取数据,对一个3⨯4矩阵进行赋值,求其转置矩阵,然后输出原矩阵和转置矩阵。

(3)源程序如下:

运行测试如下:

结果正确。

实验心得与体会:

编程时要多看多做多改。

暂时没有思路的程序,可以看一些类似的例题,多看看别人是怎么做的,可以用什么方法。

做出来的程序,不能认为自己已经完全会了,而不去理会,应该试着用其他句型修改一下程序,看看会产生什么效果,尽量简化程序,让程序看起来简单易懂,且让人不会产生误解。

选做题

给定n位(n≤100)正整数a,去掉其中任意k个数字(k≤n)后,剩下的数字按原次序排列组成一个新的正整数。

对于给定的n位正整数a和正整数k,设计一个算法找出剩下数字组成的新数最大的删除方案。

具体任务为,对于给定的正整数a,编程计算删除k个数字后得到的最大数。

数据输入:

由键盘输入两个数据,两个数据之间以空格隔开,前面一个数据是正整数a,第2个是正整数k。

结果输出:

程序运行结束时,将计算出的最大数输出到屏幕。

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

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1