程序设计基础C离线作业.docx
《程序设计基础C离线作业.docx》由会员分享,可在线阅读,更多相关《程序设计基础C离线作业.docx(28页珍藏版)》请在冰豆网上搜索。
程序设计基础C离线作业
浙江大学远程教育学院
《程序设计基础(C)》课程作业
—————————————————————————————
第1章C语言的基本构成
程序调试题
1.编辑、调试以下程序
步骤1:
在VisualC++环境下新建文件可用[开始]→[程序]→[MicrosoftVisualC++6.0]→[MicrosoftVisualC++6.0]→[文件]→[新建]→[文件]→[C++SourseFile],输入文件名ex1-1.c,程序代码如下:
#include/*文件预处理,包含标准输入输出库,程序可调用输入、输出函数*/
intadd(intx,inty)
{
intz;
z=x+y;
returnz;
}
intmain()
{
intadd(int,int);/*函数的说明,告诉系统在主函数中要调用add函数*/
inta,b,c;/*变量的定义*/
scanf("%d%d\n",&a,&b);
c=add(a,b);/*函数调用*/
printf("%d+%d=%d\n",a,b,c);
/*调用系统输出函数printf,%d为格式控制符,依次用后面的变量值填充,以整数形式输出*/
}
请思考文件ex1-1.c由几个函数构成?
调用了那几个系统函数?
此程序中用到了哪几个保留字?
哪几个用户自定义标识符?
答:
文件ex1-1.c由两个函数构成,分别是add()和主函数main()。
调用了两个系统函数,分别为scanf和printf。
程序中用到如下几个保留字:
int,return。
使用了如下几个用户自定义标示符:
x,y,z,a,b,c.
步骤3:
编译并运行程序,程序运行时输入两个整数,2040,观察程序运行的结果。
答:
程序运行结果,20+40=60
2.编辑、调试以下程序
步骤1:
在VisualC++环境下新建文件可用[开始]→[程序]→[MicrosoftVisualC++6.0]→[MicrosoftVisualC++6.0]→[文件]→[新建]→[文件]→[C++SourseFile],输入文件名ex1-2.c
步骤2:
在文本编辑器中输入以下C程序
#include/*文件预处理,包含标准输入输出库,程序可调用输入、输出函数*/
#include
intmain()
{
intand(int,int);/*函数的说明,告诉系统在主函数中要调用and函数*/
intor(int,int);/*函数的说明,告诉系统在主函数中要调用and函数*/
inta,b,c;/*变量的定义*/
scanf("%d%d",&a,&b);
c=and(a,b);/*函数调用*/
printf("%d&&%d=%d\n",a,b,c);
/*调用系统输出函数printf,%d为格式控制符,依次用后面的变量值填充,以整数形式输出*/
c=or(a,b);/*函数调用*/
printf("%d||%d=%d\n",a,b,c);
}
步骤3:
[文件]→[新建]→[文件]→[C++SourseFile],输入文件名ex1-2-2.c,源程序代码为:
intand(inta,intb)
{
intc;
c=a&&b;
returnc;
}
步骤4:
[文件]→[新建]→[文件]→[C++SourseFile],输入文件名ex1-2-3.c,源程序代码为:
intor(inta,intb)
{
intc;
c=a||b;
returnc;
}
步骤5:
点击编译图标
,编译程序1-2.c
步骤4:
点击执行图标
,执行程序1-2.c,当程序运行时,键盘输入2040,按回车。
2040
20&&40=1
20||40=1
您可以输入其它的整数,观察程序的执行结果。
第2章 输入输出程序设计
1.用printf输出一个中空的五角星。
2.仿照例子2.2,定义一个字符数组,从键盘输入一字符串,然后输出的程序。
3.从键盘输入十六进制整数,转化为八进制数输出。
4.只定义两个整型数据并赋值,实现两个整型数的互换。
5.从键盘上输入一个整数,分别输出8、16进制数的程序。
6.从键盘上输入一个整数,分别输出它的个位数,十位数,百位数。
7.以下程序输出结果是()。
#include
voidmain()
{
inti=010,j=10;
printf("%d,%d\n",++i,j--);
}
8.运行程序,屏幕提示“您是一个学生吗”,您输入’y’或’n’进行回答,屏幕输出您的选项。
9.从键盘输入一个角度x,求10*sin(x)的值。
第3章 循环程序设计
1.以下for语句的循环次数是多少?
inti,j=3;
for(;i=j;i--,j--)printf("%d",i);
2.下面的语句显示输出6行6列的整数数组h的主对角线上的所有元素,请补充完整:
for(inti=0;i<;)
printf("%d",)
3.写出以下程序运行的结果,此程序实现了什么功能?
#include
voidmain()
{inta[10]={2,4,0,-5,10,6,-8,9,6,7};
inti,count=0;
for(i=0;i<10;i++)
if(a[i]==0)count++;
elsecontinue;
printf("%d\n",count);
}
4.写出以下程序的功能。
#include
voidmain()
{
inta[10]={2,4,0,-5,10,6,-8,9,6,7},tmp,k;
for(k=0;k<10/2;k++)
{
tmp=a[k];
a[k]=a[10-k-1];
a[10-k-1]=tmp;
}
}
5.写出以下程序运行后的输出结果。
#include
voidmain()
{
inti,j;
for(i=0;i<6;i++)
{
for(j=0;j
printf("");
for(j=0;j<2*(5-i)-1;j++)
printf("*");
printf("\n");
}
}
6.请改正下列程序的错误,改正后的程序写在右边的空白处,并上机调试检验。
(1)
#include
voidmain()
{
inti,s;
i=1;s=0;
while(i<=100);
s=s+i;
i++;
printf(“1+2+3+….+99+100=%d\n”,s);
}
(2)
#include
voidmain()
{
inti,s;
i=1;
s=0;
while(i<=100)
s=s+i;
i++;
printf(“1+2+3+….+99+100=%d\n”,s);
}
(3)
#include
voidmain()
{
inti=1,s;
while(i<=100);
{
s=s+i;
i++;
}
printf(“1+2+3+….+99+100=%d\n”,s);
}
7.输入一个基数,例如输入9,输出为:
求1*3*……*9的值。
输出为:
1*3*5*7*9=945
8.输入一个5~10之间的整数n,求1!
+2!
+3!
+…+n!
。
例如输入5,输出为:
1!
+2!
+3!
+…+5!
=153
9.在屏幕上输出以下内容
1
12
123
1234
12345
123456
1234567
12345678
123456789
10.求2+4+6+……+98+100的和,用多种for表达式来完成。
11.输入一行字符,统计它有多少个字母?
第4章 分支程序设计
1.输入若干整数给x,使用if语句输出x的绝对值,当输入0时结束。
2.输入一批数,输出比相邻数大的数,当输入0时结束。
3.将输入字符的大写字符转换成小写字符输出,小写字符原样输出。
4.输入一批字符,按回车时结束,统计小写字符、大写字符、数字字符、或其它字符的个数。
5.编写程序,计算分段函数:
6.根据输入的百分制按五分制的成绩输出。
百分制与五分制之间的关系见下表。
百分制
五分制
90~100
5
80~89
4
70~79
3
60~69
2
<60
1
7、用switch完成:
读入一个实数x,再输入一整数,若输入是1,则计算sin(x),若输入2,则计算cos(x),若输入3,则计算tan(x),若输入其他值,则显示错误信息。
8、用switch完成:
输入星期1到星期5,输出它们对应的颜色
星期1:
blue
星期2:
red
星期3:
white
星期4:
yellow
星期5:
green
9、用switch完成:
从键盘输入A、B、C、D四个等级中的一个,转化输出
等级
输出
A
优秀
B
良好
C
中等
D
及格
E
不及格
第5章 数组及其应用
1.从键盘输入12个数,分别为:
900,2,3,58,34,76,87,72,90,20,78,30,找出最大和最小数。
2.采用遍历查找,在数组a[SIZE]={2,3,20,58,72,76,78,87,90,900}中,找出偶数。
3.采用折半查找,在数组a[SIZE]={2,3,20,58,72,76,78,87,90,900}中,找到87,然后进行删除。
第6章 函数及其应用
练习与实践
一、阅读程序,写出程序运行的结果。
1.写出以下程序的执行结果。
#include
floataver(inta[])
{
intk,sum=0;
floatave;
for(k=0;k<10;k++)
sum+=*(a+k);
ave=(float)sum/10;
return(ave);
}
intmain()
{
floatave;
staticb[]={78,89,98,76,78,45,88,81,92,85};
ave=aver(b);
printf("ave=%f\n",ave);
}
提示:
数组b的首地址传递给形参a,*(a+k)就是数组元素b[k].
2.阅读程序,写出程序的执行结果。
#include
voidabc(charstr[])
{inta,b;
for(a=b=0;str[a]!
='\0';a++)
if(str[a]!
='c’)
str[b++]=str[a];
str[b]='\0';
}
intmain()
{
charstr[]="abcdef";
abc(str);
printf("str[]=%s",str);
return0;
}
提示:
数组str的首地址传递给形参str,str[a]就是实参中的数组元素str[a],当数组元素不为’c’时进行复制。
3.写出以下程序的执行结果。
#include
intsort(intb[],intn,intx)
{
intk;
for(k=n-1;k>=0;k--)
if(b[k]b[k+1]=b[k];
else
break;
b[k+1]=x;
return0;
}
intmain()
{
inti,j;
staticinta[5]={8,5,4,1,6};
intb[8];
b[0]=a[0];
for(i=1;i<5;i++)
{
sort(b,i,a[i]);
for(j=0;j<=i;j++)
printf("%d",b[i]);
printf("\n");
}
return0;
}
提示:
循环体中
if(b[k]b[k+1]=b[k];
else
break;
如果b[k]4.写出以下程序的执行结果。
#include
intfun(intx)
{intp;
if(x==0||x==1)
return3;
else
p=x-fun(x-2);
returnp;
}
intmain()
{
printf("\n%d",fun(9));
return0;
}
提示:
fun(9)=9-fun(7),...,fun
(1)=3
5.写出以下程序的执行结果,并说明其作用是什么?
#include
intf(intn)
{
if(n>=10)
f(n/10);
printf("%d",n%8);
return0;
}
intmain()
{
f(1234);
printf("\n");
return0;
}
提示:
在函数f中,程序运行借助了堆栈,依次入栈的数据分别为1234、123、12,最后n=1,n对8取余输出,然后数据依次出栈对8取余输出。
二、程序设计
1.编写一个函数,计算x的n次的平方。
提示:
for(y=1,i=0;iy=y*x;
2.编写一个函数,计算对角线上元素之和。
提示:
for(s=0,i=0;ifor(j=0;jif(i==j)
s=s+a[i][j];
3.编写一个函数intinvert(charstr[]),将一个字符串的内容颠倒过来。
提示:
先求字符串str的长度n,for(i=0;i4.编写函数,删除字符串中,从指定位置m开始的n个字符。
删除成功,函数返回被删除字符串;否则返回空的值。
提示:
for(k=m,i=0;str[i];i++)
str[m+i]=str[m+n+i];
str[m+i]=’\0’;
5.编写一个程序,从键盘输入的字符串,删去非数字字符,转换成整型数输出。
提示:
for(s=0,i=0,j=0;str[i];i++)
if(str[i]>=’0’&&str[i]<=’9’)
s=s*10+str[i]-‘0’;
6.用递归的方法编写一个函数sum(intn),求1至n的累加和。
提示:
f(n)=n+f(n-1)
第7章 变量存储类型与多文件系统
1.写出以下程序的执行结果。
#include
intx;
voidfun()
{
printf("%d",x++);
}
voidmain()
{
intx=1;
{
externintx;
printf("%d,",++x);
}
fun();
}
提示:
在函数fun中及语句块
{
externintx;
printf("%d,",++x);
}
中使用的x是外部变量,在语句块:
if(x==1)
{intx=2;
printf("%d,",x++);
}
中使用的是刚刚定义x=2的变量。
2.写出以下程序的执行结果。
#include
intkk()
{intx=4;
staticinty;
y=5;
x*=2;
y*=2;
return(x+y);
}
voidmain()
{intj,s=0;
for(j=0;j<2;j++)
s=kk();
printf("s=%d\n",s);
}
提示:
虽然两次调用函数kk(),但变量定义语句staticinty;只执行一次,而变量赋值语句每次都要执行。
3.写出以下程序的执行结果。
#include
intt()
{
intx=0;
staticinty=4;
y+=++x;
returnx+y;
}
voidmain()
{
printf("%d\n",(t(),t()));
}
提示:
语句printf("%d\n",(t(),t()));中(t(),t())属于“,”号表达式,即两次调用函数t(),在函数t()中,y为静态内部变量,因而语句staticinty=4;只执行一次。
第8章 文件
1.下述程序从终端读入文本(用$作为文本结束标志)复制到一个名为out.dat的新文件中,请补全程序。
#include
intmain()
{
FILE*fp;
charcx;
if((fp=fopen(
(1)))==NULL)
return0;
while((cx=getchar())!
='$')
fputc(cx,fp);
(2);
return1;
}
提示:
第1个空格是打开文件读,第2个空格是关闭文件。
2.下面的程序用来统计文件中字符的个数,请补全程序。
#include
intmain()
{FILE*fp;
longnum=0;
if((fp=fopen("fname.dat","r"))==NULL)
{
printf("Can'topenfile!
\n");
exit(0);
}
while(
(1))
{
fgetc(fp);
num++;
}
printf("num=%d\n",num);
fclose(fp);
return1;
}
提示:
第1个空格表示文件没有结束,循环将持续。
3.以下程序由终端键盘输入一个文件名,然后把从终端键盘输入的字符,依次存放到该文件中,用#作为结束输入的标志,请补全程序。
#include
voidmain()
{
FILE*fp;
charch,fname[10];
printf("Inputthenameoffile\n");
gets(fname);
if((fp=)==NULL)
{
printf("Cannotopen\n");
exit(0);
}
printf("Enterdata\n");
while((ch=getchar())!
='#')
fputc(,fp);
fclose(fp);
}
提示:
文件名是从键盘读入的,因而文件名是用变量表示的,文件是打开写。
4.下述程序从一个二进制文件中读入结构体数据,并把读出的数据显示在屏幕上。
请补全程序。
#include
structrec
{inta;
floatb;};
voidrecout(FILE*fp)
{structrecr;
do
{fread(
(1),sizeof(structrec),
(2),fp);
if((3))
(4);
printf("%d,%f",r.a,r.b);
}while
(1);
}
voidmain()
{FILE*fp;
fp=fopen("file.dat","rb");
recout(fp);
fclose(fp);
}
提示:
在fread语句中,
(1)中为存放所读出结构数据的内存地址,当然此数据是赋给变量r,
(2)中是读出结构体变量数据的个数,(3)是与循环中止有关的判断,(4)为中止循环。
5.从键盘输入一个字符串,并逐个将字符串的每个字符传送到磁盘文件"l1.txt"中,字符串的结束标记为"#"。
6.有一文本文件l1.txt,请编写一个程序将文件中的英文字母及数字字符显示在屏幕上。
提示:
7.把文本文件l1.txt中的数字字符复制到文本文件l2.txt中。
8.x从0到360度的sin(x)值写入到文件l6.txt中,并将大于0的值显示在屏幕上。
第9章指针与数组
程序阅读与填空题
1.分析下列程序,输出结果是()。
#include
voidmain()
{
int*p1,x=10;
float*p2,y=2.5;
p1=&x;
p2=&y;
printf("%d,%f\n",++(*p1),(*p2)++);
}
提示:
++都作用在内容上,前一项是先++再输出,后一项是先输出再++。
2.下列程序输出结果是()。
#include
voidmain()
{
inta[]={1,2,3,4,5,6},*p=a;
printf("%d,%d\n",*p,*(p+3));
}
提示:
语句*(p+3)+=2;指p+3的地址上的内容加2,然后输出p及p+3的地址上内容。
3.下列程序输出结果是()。
#include
voidmain()
{
inta[]={1,2,3,4,5,6};
intx,y,*p;
p=&a[0];
x=*(p+2);
y=*(p+4);
printf("*p=%d,x=%d,y=%d\n",*p,x,y);
}
提示:
p+2是指&a[2]。
4.下列程序输出结果是()。
#include
voidmain()
{
inta[]={10,20,30,40,50,60};
int*p;
p=a;
printf("*%d,\n",*p);
printf("*%d,\n",*(++p));
printf("*%d,\n",*++p);
printf("*%d,\n",*(p--));
p+=3;
printf("*%d,%d\n",*p,*(a+3));
}
提示:
*(++p)、*++p都表示指针p向大地址方向移动,然后再取内容,要注意的是后一语句的输出受前一语句的影响。
5.下列程序输出的结果是()。
#include
voiddel(char*str)
{
inta,b;
for(a=b=0;str[a]!
='\0';a++)
if(*(str+a)!
='c’)
*(str+b++)=*(str+a);
str[b]='\0';
}
voidmain()