c语言3次上机Word下载.docx
《c语言3次上机Word下载.docx》由会员分享,可在线阅读,更多相关《c语言3次上机Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
Printf("
\nNowa=%d,b=%d\n"
a,b);
}
#defineSUM(a+b)
#defineDIF(a-b)
#defineSWAP(a,b)t=b,b=a,a=t
inta,b,t;
printf("
scanf("
SWAP(a,b);
2.源程序修改替换
下面是用函数实现求三个数中最大数、计算两数之和的源程序。
在这个源程序中存在若干语法和逻辑错误,要求:
(1)对这个例子程序进行调试修改,使之能够正确完成指定任务。
(2)用带参数的宏替换函数max,来实现求最大数的功能。
inta,b,c;
floatd,e;
Enterthreeintegers:
%d,%d,%d"
&
b,&
c);
\nthemaximumofthemis%d\n"
max(a,b,c));
Entertwofloatingpointnumbers:
%f,%f"
d,&
e);
\nthesumofthemis%f\n"
sum(d,e));
intmax(intx,inty,intz)
intt;
if(x>
y)
t=x;
else
t=y;
if(t<
z)
t=z;
returnt;
floatsum(floatx,floaty)
returnx+y;
(1)
intmax(intx,inty,intz);
floatsum(floatx,floaty);
inta,b,c;
floatd,e;
intt;
if(x>
=y)t=x;
elset=y;
if(t<
=z)t=z;
returnt;
returnx+y;
(2)#definemax(a,b,c)a>
b?
(a>
c?
a:
c):
(b>
b:
c)
3.跟踪调试程序
下面程序的功能是利用R计算圆的面积s,以及面积s的整数部分。
现要求:
(1)修改程序,使程序编译通过且能运行。
(2)单步执行。
进入函数decimal_fraction时,watch窗口中x为何值?
在返回main时,watch窗口中i为何值?
(3)排除错误,使程序能正确输出面积s值的整数部分,不会输出错误信息assertionfailed。
程序代码:
#defineR
floatr,s;
ints_integer=0;
printf("
inputanumber:
"
%f"
r);
#ifdefR
s=3.14159*r*r;
areaofroundis:
%f\n"
s);
s_integer=integer_fraction(s);
theintegerfractionofareais%d\n"
s_integer);
assert((s-s_integer)<
1.0);
#endif
intinteger_fraction(floatx)
inti=x;
returni;
assert.h>
intinteger_fraction(floatx);
#ifdefR
s=3.14159*r*r;
s_integer=integer_fraction(s);
assert((s-s_integer)<
#endif
inti=x;
returni;
(2)314.159000314(r=10)
(3)
(1)已经解决
实验2数组实验
(一)实验目的
(1)掌握数组的说明、初始化和使用。
(2)掌握一维数组作为函数参数时实参和形参的用法。
(
下面是用来将数组a中元素按升序排序后输出的源程序。
分析源程序中存在的问题,并对源程序进行修改,使之能够正确完成任务。
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++)
%6d"
a[i]);
\n"
voidsort(intb[],intn)
inti,j,t;
for(i=0;
n-1;
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;
voidsort(intb[],int);
sort(a,10);
if(b[j]>
b[j+1])
{t=b[j],b[j]=b[j+1],b[j+1]=t;
2.源程序完善、修改、替换
(1)下面的源程序用于求解瑟夫问题:
M个人围成一圈,从第一个人开始依次从1至N循环报数,每当报数为N时报数人出圈,直到圈中只剩下一个人为止。
请在源程序中的下划线处填写合适的代码来完善该程序。
#defineM10
#defineN3
inta[M],b[M];
/*数组a存放圈中人的编号,数组b存放出圈人的编号*/
inti,j,k;
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;
i;
k++)/*压缩数组a,使报数为N的人出圈*/
a[k]=a[k+1];
i<
M–1;
i++)/*按次序输出出圈人的编号*/
printf(“%6d”,b[i]);
printf(“%6d\n”,a[0]);
/*输出圈中最后一个人的编号*/
(2)上面的程序中使用数组元素的值表示圈中人的编号,故每当有人出圈时都要压缩数组,这种算法不够精炼。
如果采用做标记的办法,即每当有人出圈时对相应数组元素做标记,从而可省掉压缩数组的时间,这样处理效率会更高一些。
因此,请采用做标记的办法修改
(1)中的程序,并使修改后的程序与
(1)中的程序具有相同的功能。
voidmain()
inti,k,n,a[M];
i++)
a[i]=i+1;
k=0;
{
n=0;
while(n<
N){
while(a[k]==0)
k=(k+1)%M;
n++;
}
k--;
if(k<
0)k=M-1;
%-6d"
a[k]);
a[k]=0;
3.跟踪调试源程序
在下面所给的源程序中,函数strncat(s,t,n)本来应该将字符数组t的前n个字符连接到字符数组s中字符串的尾部。
但函数strncat在定义时代码有误,不能实现上述功能。
请按下面的要求进行操作,并回答问题和排除错误。
(1)单步执行源程序。
进入函数strncat后观察表达式s、t和i。
当光条落在for语句所在行时,i为何值?
当光条落在strncat函数块结束标记(右花括号})所在行时,s、t分别为何值?
(2)分析函数出错的原因,排除错误,使函数正确实现功能,最后写出程序的输出结果。
voidstrncat(char[],char[],int);
chara[50]="
Theadoptedsymbolis"
b[27]="
abcdefghijklmnopqrstuvwxyz"
;
strncat(a,b,4);
%s\n"
a);
voidstrncat(chars[],chart[],intn)
inti=0,j;
while(s[i++]);
for(j=0;
n&
&
t[j];
)
s[i++]=t[j++];
s[i]='
\0'
23
s=0x0012ff4c"
t=0x0012ff30"
(2)错因:
a的终结符没有被覆盖,连入的b的第四个字母被终结符覆盖
#include<
i--;
s[i++]='
程序设计
编写并上机调试运行能实现以下功能的程序。
(1)已知三角形的面积是
,其中
,a,b,c为三角形的三边。
定义两个带参数的宏,一个用来求s,另一个用来求area,试编写一程序,用带参数的宏来计算三角形的面积。
(2)使用条件编译方法编写一程序,其功能要求是,输入一行电报文字,可以任选两种输出:
一为原文输出;
二为变换字母的大小写(如小写‘a’变成大写‘A’,大写‘D’变成小写‘d’),其他字符不变。
用#define命令控制是否变换字母的大小写。
例如,#defineCHANGE1则输出变换后的文字,若#defineCHANGE0则原文输出。
(3)编写一个程序,从键盘读取数据,对一个34矩阵进行赋值,求其转置矩阵,然后输出原矩阵和转置矩阵。
(1)
math.h>
#defines(a,b,c)(a+b+c)/2
#definearea(a,b,c,s)sqrt(s*(s-a)*(s-b)*(s-c))
floata,b,c;
%f,%f,%f"
theareais%f\n"
area(a,b,c,s(a,b,c)));
(2)
#defineCHANGE1
intj;
chars[100];
gets(s);
#ifCHANGE
for(j=0;
j<
100;
j++){
if(s[j]>
='
A'
s[j]<
Z'
)s[j]=s[j]+32;
elseif(s[j]>
a'
z'
)s[j]=s[j]-32;
elses[j]=s[j];
puts(s);
当#defineCHANGE1时
当#defineCHANGE0时
(3)
#include"
stdio.h"
#defineSIZE3
{floatx[SIZE][SIZE+1];
floaty[SIZE+1][SIZE];
inti,j;
for(i=0;
i<
SIZE;
i++){
for(j=0;
SIZE+1;
j++)
{scanf("
x[i][j]);
y[j][i]=x[i][j];
for(j=0;
printf("
x[%d][%d]=%.2f\t"
i,j,x[i][j]);
}
for(i=0;
i++)
y[%d][%d]=%.2f\t"
j,i,y[j][i]);
实验心得与体会
通过编译,调试,从错误中学习各种细节,补充自己平时没注意的知识。
并了解到一个好的设计思路不仅能处理一些实用的问题,还能节约设计程序所用的时间和运行程序所花的时间。
并且掌握了带参数的宏定义、条件编译的使用,掌握了字符串数组和字符数组在输入数字存储时的区别,和数组输入输出的大致使用,掌握了一维数组作为函数参数时实参和形参的用法。
选做题
给定n位(n≤100)正整数a,去掉其中任意k个数字(k≤n)后,剩下的数字按原次序排列组成一个新的正整数。
对于给定的n位正整数a和正整数k,设计一个算法找出剩下数字组成的新数最大的删除方案。
具体任务为,对于给定的正整数a,编程计算删除k个数字后得到的最大数。
数据输入:
由键盘输入两个数据,两个数据之间以空格隔开,前面一个数据是正整数a,第2个是正整数k。
结果输出:
程序运行结束时,将计算出的最大数输出到屏幕
#include<
intf_max(chara[],intb,inti)
intj,k=0;
charc;
c=a[0];
for(j=1;
=b;
if(c<
a[j])
{
c=a[j];
k=j;
returnk+i+1;
intm=0,i=0,j=0,k;
chara[100];
charb[100];
inputa,k:
while((a[m]=getchar())!
'
m++;
a[m]='
k);
while((m-i)>
(m-k-j))
i=f_max(&
a[i],k+j-i,i);
b[j]=a[i-1];
j++;
for(;
=m-k;
b[j]=a[i];
i++;
b[j]='
puts(b);