提 个C语言卷子上的题目。回答的详细、好懂,奖四十分。

重要注释:题中"________"下划线是用来填正确答案的。
1.若定义函数char*fun( ){...},则该函数的返回值类型是
________字符指针或字符型地址。
我的想法:是不是定义的是什么,返回什么。还不懂C中为什么要返回值,这里返回*fun( ){...}对不?

2.若函数调用语句为f(a,b,f(a+b,a-b,b));则函数f的参数个是________ 3。
我的想法:数据类型里有几个表达式,就有几个参数对吗?

3.设int a=10;则执行语句a+=a-=a+a;后a的值是________ -20。
我的想法是:a+=a-=(a+a) ,最后等于0。请问错在哪里?

4.int f(int n)
{static int m=5;
return ++m+n;
}
main( )
{int i:
for(i=0;i<3;i++)printf("%5d",f(i));
printf("\n");
}

这题的输出是6,8,10。不懂的问题是int f(int n);{static int m=5;
return ++m+n;
}
这些句子。

5.#define SIZE 4
main( )
{int n[SIZE]={8,3,4,1};
int i,j;
for (i=0;i<SIZE;i++)
{printf("%d",n[i]);
for(j=1;j<=n[i];j++)printf("*");
printf("\n");
}
}
这题的输出是8********
3***
4****
1*
对#define SIZE 4
main( )
{int n[SIZE]={8,3,4,1};这些句子不懂,对输出结果意外,这结果是怎么输出的啊?

6.对程序填充提,摸不着头脑。
(1).从键盘输入一串字符(”#“作为结束标志),将其写入文本文件file.dat中保存。
#include<stdio.h>
#include<stdlib.h>
main( )
{char ch;
FILE*fp;
if((fp=fopen("file.dat","________w"))= =NULL)
{printf("Can not open file\n");exit(0);}
ch=getchar( );
while (ch!=‘#’)
{fputc(________ch,fp);
ch=getchar( );
}
fclose(________fp);
}
请讲解一下这个程序。

7.从键盘输入100个整数,计算并输出大于等于零的数的平均值(保留小数点后两位)
#include<stdio.h>
#define N 100
main0
{int a[N],i,n=0;
float sum=0,aver;
for(i=0;i<N;i++)scanf("%d",&a[i]);
for(i=0;i<N;i++)
if(a[i]>=0)
{
sum=sum+a[i];
n++;
}
if(n= =0)printf("All numbers are negative!\n");
else
{aver=sum\n;
printf("aver=%7.2f\n",aver);
}
}
此题的得分点是:宏定义、变量和数组定义及初始化;数字输入; if(a[i]>=0)
{
sum=sum+a[i];
n++;
};aver=sum\n。
对这种程序设计题不懂,对要分的几个要点都不懂设计。

8.(1)编写一个计算梯形面积的函数。函数头是:float area(float t,float b,float h)
其中变量t、b和h分别表示梯形的上底、下底和高。
(2)编写主函数从键盘输入梯形的上底、下底和高的值,调用上述函数输出梯形面积(保留小数点后两位)。
#include<stdio.b>
float area(float t,float b,float h)
{
return(t+b)*h*0.5;
}
main( )
{float t1,b1,h1;
scanf("%f%f%f",&t1,&b1,&h1);
printf("area=%7.2f\n",area(t1,b1,h1));
}
此题的得分点是:函数定义;主函数定义变量正确;输入正确;输出、调用正确;
唉,,我该怎么做这种题啊。

1, //返回值的类型是和函数原型定义一致的;如:int argc(){...}函数返回 int类型
2,//你的想法是对的,另外这样的函数为递归函数
3,//步骤a+=a-=a+a;此时a=10;执行 a-=a+a后,a=-10(注意此时a被赋值);接着a+=a; a=-20;
//结合性为从右到左,所以a先被赋值为-10;

4,.int f(int n)
{static int m=5; //static表示 m变量为静态变量,就是一直保持在内存里的意思
return ++m+n;
}
main( )
{int i:
for(i=0;i<3;i++)
printf("%5d",f(i));
//i=0时,m=6; i=1时,m=7;i=2时m=8;此题考察的是static关键字
printf("\n");
}

5,.#define SIZE 4 //宏定义
main( )
{int n[SIZE]={8,3,4,1};//声明并初始化数组;等同于:n[0]=8;n[1]=3,n[2]=4;n[3]=1;
int i,j;//声明变量
for (i=0;i<SIZE;i++)
{printf("%d",n[i]);//打印n数组
for(j=1;j<=n[i];j++)
printf("*");//打印结果取决于int数组的初始化
printf("\n");
}
}

6.#include<stdio.h>
#include<stdlib.h>//头文件
main( )
{char ch;
FILE*fp;//定义文件指针
if((fp=fopen("file.dat","________w"))= =NULL) // "w"为 fopen函数的参数,表示打开一个文件,可//以写入文件,先将文件的长度截为0,如果“file.dat"不存在,则先创建文件。
{printf("Can not open file\n");exit(0);}
ch=getchar( );
while (ch!=‘#’)
{fputc(________ch,fp);
//这空是考察fputc(io库函数)的参数的,这个函数表示把指定的字符写到指定的流中,此题是
//写到 file.dat 文件中
ch=getchar( );
}
fclose(________fp); //关闭指针指定的文件,这里是fp对应的”file.dat"文件
//同样是考察fclose(IO库函数)的参数
}

7.
#include<stdio.h>
#define N 100 //宏定义
main0
{int a[N],i,n=0;
float sum=0,aver; //上面两行是声明变量、数组;
for(i=0;i<N;i++)scanf("%d",&a[i]); //读取键盘输入100个整数
for(i=0;i<N;i++)
if(a[i]>=0)
{
sum=sum+a[i]; //用来计算正整数之和。
n++; //用来计算整数的总个数;
} //上面5行为一个循环,用来得到正整数的和 与正整数与零的总个数
if(n= =0)printf("All numbers are negative!\n");//看是否输入的数字全为小于零的数
//或者不合法,如输入的不是数字
else
{aver=sum\n;
printf("aver=%7.2f\n",aver);
} //计算所有大于等于零的数的平均值,保留2位小数点,占7位空间
}

8.
#include<stdio.b>
float area(float t,float b,float h)//三个参数(上底t,下底b,高h)
{
return(t+b)*h*0.5;//(上底+下底)*高/2就是梯形面积公式,返回面积
}
main( )
{float t1,b1,h1;
scanf("%f%f%f",&t1,&b1,&h1);//读取键盘输入梯形上底、下底和高的值
printf("area=%7.2f\n",area(t1,b1,h1));// %7.2f 为函数 float area();函数返回的值
//同样面积输出为占7位,保留2位小数点;
}

综上,看的出来你们考察C语言的试题不是很难,我觉得这个应该不是大学里面的考试吧?
同时也可以看出你C语法不是很好,不客气的说,你应该什么也没学,最多学到变量声明循环附近
所以,你还是老老实实的把那本谭浩强老师的《C语言程序设计》好好翻翻吧。
不是你该怎么去做那种题,而是你基础根本没打好~~追问

呵呵,请添加为好友好追问。
呵呵,这题我整理了一下。baiduhi的提问还没懂。请看一下。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-11-24
1.返回的是char*型 fun是函数名 定义什么类型就返回什么类型 void是空 不返回 返回值很常用 做判断的标志位 返回计算结果 返回程序运行情况等 一般都要返回
2.对的 有几个表达式就有几个参数 而且每个函数的参数是固定的 定义了几个参数就要写几个 不能少
3.a=10 a+a=20 这个不是很确定 我的想法是把它还原 a-=a+a 就是a-=20它的含义是a-20=20,则a=40 ,关键是连等的第二步不确定 如果这格式正确的 可以这样理解 整体等于20是确定的 那么a+=20的含义就变成a+40=20 因为前一个第二回等是去掉后一部分 a+=a 等号后面的算出来是40 这样 a=-20
4.这个题邪恶的地方在于static 结构体 被初始化以后就不会被重置 它等于上一次被调用时的值 也就是说 这里的m初始为5第一次计算后是6那么第二次调用时它被修改为6 这就不难理解++m+n会得出8 10 了 我看了半天才看出门道 你去了解一下结构体 可能明白的更快点
5.#define SIZE 4 是一个替换 其实SIZE就是4 等价的 看不懂可以直接把SIZE换成4省的它干扰视线 这题意思是一次输出数组里的值 然后在它后面加相同个数的星号 第一个循环控制的是数组的下标 第二个循环的作用是输出相同个数的星号 要是还不理解可以追问
6.第一个判断语句 如果关键字W为空 也就是fp为空 输出一个语句 否则
ch=getchar( );键入一个字符
while (ch!=‘#’)在这里 如果键入的字符不是# 则进入循环 如果是# 则不能进入循环 程序跳过循环执行
fclose(________fp);实现以# 结束的功能
{fputc(________ch,fp);
ch=getchar( );
}
向文件内写入字符
7.宏定义上面有解释 就是替换 不是太难理解 对于变量的设计 sum 求和sum=0; sum=sum+a[i];这是按步求和的一般做法 i控制数组的下标 依次输出数组里的值
sum=sum+a[i];
n++;这个是依次求和 每一次n都做自加 那么n是加的次数 sum是这些数的和 aver=sum\n;
这个就不难理解了吧 平均值
8.这个题 怎么解释呢 你看看形参实参 自定义函数 这方面的资料 上面定义的函数有一个返回值
printf("area=%7.2f\n",area(t1,b1,h1));
这里调用area(t1,b1,h1)这个自定义函数 则程序调到这个函数处进行处理
float area(float t,float b,float h)
{
return(t+b)*h*0.5;
}
这里用到的参数从主函数里面得到 然后计算 得到值(t+b)*h*0.5 这个表达式 明白吧 它就是一个值 ruturn返回 跳出这个函数 回到原来处执行 就是printf("area=%7.2f\n",area(t1,b1,h1));
这里 这回 这个值被输出 我只能这么解释 具体有多少不理解 你在追问吧 我也不知道你明白了多少 我学的时候也是理解了好长时间才懂的追问

呵呵,请加为好友。好追问哦。
呵呵,这题我整理了一下。baiduhi的提问还没懂。请看一下。

第2个回答  2011-12-02
1.返回的是 char* 类型,函数名是fun,因此前面的就是它的返回类型

2.参数个数以逗号来分隔,两个逗号证明有 3 个参数

3.先算 (a + a) 为 20
a -= (20) 就是 a = a - 20 = 10 - 20 = -10,这时 a 为 -10
最后算 a += (-10) = a + (-10) = -10 + (-10) = -20

4.这个下面解释了,不再解释

5.这个下面解释了,不再解释

6.解释如下:
#include<stdio.h>
#include<stdlib.h>
main( )
{
char ch;
FILE*fp;
if((fp=fopen("file.dat","________w"))= =NULL) //如果打开文件失败就打印错误信息
{printf("Can not open file\n");exit(0);}
ch=getchar( ); //先个ch赋值
while (ch!='#') //当输入的为 '#' 结束输入
{fputc(________ch,fp); //将输入的字符写到文件中
ch=getchar( ); //继续读下一个字符
}
fclose(________fp); //关闭文件
}

7.这个下面解释了,不再解释

8.这个下面解释了,不再解释

/////////////////////////////////////////////////////////////////////////////////////////////////////
下面是追问给出的回答
/////////////////////////////////////////////////////////////////////////////////////////////////////

1.首先static不是函数,是定义为静态变量。所谓静态变量就是在main函数前就已经初始化的了,并且只初始化一次。
函数里面定义static int m = 5;
也就是说,m 初始值为 5,再调用这个函数的时候,也不会再给它赋值 5 的了
重新看回这道题,main函数里面一共调用 f 函数 3 次
第一次,m = 5, 返回 6 + 0 = 6
第二次,m 不再赋值,在第一次循环时 m 已经变成 6,所以 m 现在就是 6,返回 7 + 1 = 8
第三次,同理,m 已经是 7 了,返回 8 + 2 = 10

2.这个问题要看你放printf的位置了
for (i=0;i<SIZE;i++)
{
printf("%d",n[i]); //1
for(j=1;j<=n[i];j++) //2
printf("*");
printf("\n");
}
很明显是先打印n[i]的值,注释 1,再打印n[i]个星号,问题应该不大吧

3.定义时定义了int n[SIZE]={8,3,4,1};
也就是说
n[0] = 8;
n[1] = 3;
n[2] = 4;
n[3] = 1;
下面打印星号的数目跟这些值有关,因为 for(j=1;j<=n[i];j++) 说明了要从 1 循环到 n[i]

4.因为你要将输入的字符串保存到文件中,写入文件用的就是 w,如果是读就是 r,查下MSDN可以知道更多fopen函数的用法

5.你要知道两个for的作用分别是什么,第一个for是用来输入100个整数,保存到数组 a 里面的
而第二个for的意思就是先判断那个数是否大于 0,如果大于 0 就求和,赋值给 sum,sum 初始值是0,但是加了a[i]后就不是 0 了,sum = sum + a[i]就是求所有a[i]的和

6.函数返回值,不一定是返回到主函数里,而是返回在调用的地方,当然,如果在主函数里面调用,那么就是返回主函数调用的地方,例如:
float a = area(t1, t1, h1);
函数area里面的return的值就返回赋值给 a 了
%7.2f 的意思就是输出的宽度为 7,如果宽度不足则用空格填充,小数点后面保留 2 位小数,例如返回的小数为" 3.14",注意3.14前面有3个空格,因此宽度一共是7,小数点后面保留 2 位小数本回答被提问者采纳
第3个回答  2011-11-21
答1:不对,char *是返回类型,fun是自定义的函数名称,返回值是指函数体({……})里面的return语句后面的东西,若函数的返回类型是char *,则返回值的类型也必须为char *,即字符指针。

答2:三个参数。你后面是不是打错字了?(你的想法是对的,另外,这里的情况特殊,f(a+b,a-b,b)是一个表达式,或者准确地说,f(a+b,a-b,b)是f(a,b,f(a+b,a-b,b))的一个表达式)

答3:a+=a-=a+a等价于(a=a+(a=a-(a+a))),你应该是忽略了算术复合运算符的结合方向,算术复合运算符的结合方向是从右到左,不是从左到右。也就是先运算-=,然后才到+=。

答4:++m+n等介于(m=(m+1))+n。还是运算符的问题,建议你好好看看运算符的优先级与结合性。

答5:#define SIZE 4 这是无参宏指令,SIZE为宏名,4是宏体。嗯,你可以简单理解为把4赋值给SIZE。另外,对输出结果有什么不明的?

答6: FILE*fp; //定义文件指针
if((fp=fopen("file.dat","________w"))= =NULL) //判断文件是否正常打开(以“写”的方式打开)
{printf("Can not open file\n");exit(0);}
ch=getchar( ); //从键盘读入第一个字符
while (ch!=‘#’) //如果输入字符不是#,执行循环
{fputc(________ch,fp); //将刚读入的字符写入流(文件)
ch=getchar( ); //从键盘读入字符
}
fclose(________fp); //关闭文件

唉,有位已经回答得很好了,后面的就不献丑啦,另外我很赞同他的两句话“你应该什么也没学”、“你还是老老实实的把那本谭浩强老师的《C语言程序设计》好好翻翻吧”。追问

呵呵,请添加为好友好追问。

相似回答