文档介绍:该【语言程序设计第3次上机 】是由【知识徜徉土豆】上传分享,文档一共【14】页,该文档可以免费在线阅读,需要了解更多关于【语言程序设计第3次上机 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。语言程序设计第3次上机
语言程序设计第3次上机
语言程序设计第3次上机
C语言程序设计 实验报告
班级CS1108日期 2012/5/26
学生姓名 王一微 学号 U201114404
第 3 次上机
实验1编译预处理
(一) 实验目的
(1)掌握文件包含、宏定义、条件编译、assert宏的使用;
(2)练习带参数的宏定义、条件编译的使用;
(3)练习assert宏的使用;
(4)使用集成开发环境中的调试功能:单步执行、设置断点、观察变量值.
(二) 实验内容及要求
1.源程序改错
下面是用宏来计算平方差和交换两数的源程序。在这个源程序中,存在若干语法和逻辑错误,要求在计算机上对这个源程序进行调试修改,使之能够正确完成计算平方差和交换两数的任务。
源程序:
#include<〉
#define SUM a+b
#define DIF a—b
#define SWAP(a,b) a=b,b=a
void main(void)
{
int b, t;
printf("Input two integers a, b:”);
scanf("%d,%d", &a,&b);
printf(”\nSUM=%d\n the difference between square of a and square of b is:%d”,SUM, SUM*DIF);
SWAP(a,b);
Printf(”\nNow a=%d,b=%d\n”,a,b);
}
源程序在code::blocks上运行后出现
修改后为:
语言程序设计第3次上机
语言程序设计第3次上机
语言程序设计第3次上机
运行测试为:
2.源程序修改替换
下面是用函数实现求三个数中最大数、计算两数之和的源程序。在这个源程序中存在若干语法和逻辑错误,要求:
(1) 对这个例子程序进行调试修改,使之能够正确完成指定任务。
(2) 用带参数的宏替换函数max,来实现求最大数的功能。
源程序:
void main(void)
{
int a, b, c;
float d, e;
printf("Enter three integers:");
scanf(”%d,%d,%d”,&a,&b,&c);
printf("\nthe maximum of them is %d\n”,max(a,b,c));
printf("Enter two floating point numbers:”);
scanf(”%f,%f",&d,&e);
printf("\nthe sum of them is %f\n",sum(d,e));
}
int max(int x, int y, int z)
{
int t;
if (x〉y)
t=x;
else
t=y;
if (t〈z)
t=z;
return t;
}
float sum(float x, float y)
语言程序设计第3次上机
语言程序设计第3次上机
语言程序设计第3次上机
{
return x+y;
}
(1)源程序修改后为:
运行测试为:
(2)按要求修改源程序如下:
语言程序设计第3次上机
语言程序设计第3次上机
语言程序设计第3次上机
运行测试为
3.跟踪调试程序
下面程序的功能是利用R计算圆的面积s,以及面积s的整数部分。现要求:
(1) 修改程序,使程序编译通过且能运行.
源程序修改如下:
语言程序设计第3次上机
语言程序设计第3次上机
语言程序设计第3次上机
运行测试为:
(2) ,watch窗口中x为何值?在返回main时, watch窗口中i为何值?
单步执行,进入integer_fraction时,watch窗口中x=254。468796。返回main时,watch中i=254.
(3) 排除错误,使程序能正确输出面积s值的整数部分,不会输出错误信息assertion failed.
程序代码:
#define R
void main(void)
{
float r,s;
int s_integer=0;
printf ("input a number: ");
scanf(”%f”,&r);
#ifdef R
s=*r*r;
printf("area of round is: %f\n”,s);
s_integer= integer_fraction(s);
printf(”the integer fraction of area is %d\n”, s_integer);
assert((s—s_integer)<);
语言程序设计第3次上机
语言程序设计第3次上机
语言程序设计第3次上机
#endif
}
int integer_fraction(float x)
{
int i=x;
return i;
}
实验2数组实验
(一) 实验目的
(1)掌握数组的说明、初始化和使用.
(2)掌握一维数组作为函数参数时实参和形参的用法。
(
(二) 实验内容及要求
1.源程序改错
,并对源程序进行修改,使之能够正确完成任务。
源程序:
#include<stdio。h〉
void main(void)
{
int a[10] = {27, 13, 5, 32, 23, 3, 17, 43, 55, 39};
void sort(int [],int);
int i;
sort(a[0],10);
for(i = 0; i < 10; i++)
printf("%6d”,a[i]);
printf(”\n”);
}
void sort(int b[], int n)
{
int i, j, t;
for (i = 0; i < n - 1; i++)
for ( j = 0; j 〈 n — i - 1; j++)
if(b[j] < b[j+1])
t = b[j], b[j] = b[j+1], b[j+1] = t;
}
源程序修改如下:
语言程序设计第3次上机
语言程序设计第3次上机
语言程序设计第3次上机
运行测试为:
2。源程序完善、修改、替换
(1) 下面的源程序用于求解瑟夫问题:M个人围成一圈,从第一个人开始依次从1至N循环报数,每当报数为N时报数人出圈,直到圈中只剩下一个人为止。请在源程序中的下划线处填写合适的代码来完善该程序。
源程序:
#include<〉
#define M 10
#define N 3
void main(void)
{
int a[M], b[M]; /* 数组a存放圈中人的编号,数组b存放出圈人的编号 */
int i, j, k;
for(i = 0; i < M; i++) /* 对圈中人按顺序编号1—M */
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 〈 i; k++) /* 压缩数组a,使报数为N的人出圈 */
a[k]=a[k+1] ;
}
for(i = 0;i 〈 M – 1; i++) /* 按次序输出出圈人的编号 */
printf(“%6d”, b[i]);
printf(“%6d\n", a[0]); /* 输出圈中最后一个人的编号 */
}
语言程序设计第3次上机
语言程序设计第3次上机
语言程序设计第3次上机
运行测试为:
(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
语言程序设计第3次上机
语言程序设计第3次上机
语言程序设计第3次上机
光条落在strncat函数块结束标记所在行时
(2) 分析函数出错的原因,排除错误,使函数正确实现功能,最后写出程序的输出结果.
源程序:
#include〈〉
void strncat(char [],char [],int);
void main(void)
{
char a[50]=”The adopted symbol is ",b[27]="abcdefghijklmnopqrstuvwxyz”;
strncat(a, b, 4);
printf(”%s\n",a);
}
void strncat(char s[],char t[], int n)
{
int i = 0, j;
while(s[i++]) ;
for(j = 0; j < n && t[j];)
s[i++] = t[j++];
s[i] = ’\0';
}
(2)调试发现s,t和i值有误,修改后源程序为:
语言程序设计第3次上机
语言程序设计第3次上机
语言程序设计第3次上机
运行输出结果为:
程序设计:编写并上机调试运行能实现以下功能的程序。
(1) 已知三角形的面积是,其中,a,b,c为三角形的三边。定义两个带参数的宏,一个用来求s,另一个用来求area,试编写一程序,用带参数的宏来计算三角形的面积.
(1)源程序如下:
运行测试为: