//使用的vc6.0调度“//”后面为注释
#include
using namespace std;
struct STU
{
char name[10];
int num;
float TotalScore;
};
void f(struct STU *p)
{
struct STU s[2]={{"SunDan",20044,550},{"Penghua",20045,537}}, *q=s;//q指向s[0]
++p;//指针下移
++q;//到这里,p, q 分别指向主函数s[1],和f中的s[1]
*p=*q; //将f中的s[1]赋给主函数s[1]
}
void main()
{
struct STU s[3]={{"YangSan",20041,703},{"LiSiGuo",20042,580}};
f(s);//传递的是数组名,即指针,指针可以改变形参
printf("%s %d %3.0f\n", s[1].name, s[1].num, s[1].TotalScore);
}
///////////////////////////////////////第2题
struct STU
{
int num;
float TotalScore;
};
void f(struct STU p)
{
struct STU s[2]={{20044,550},{20045,537}};
p.num = s[1].num;
p.TotalScore = s[1].TotalScore;
}
main()
{
struct STU s[2]={{20041,703},{20042,580}};
f(s[0]);//传送的变量名,无法改变形参,不多说了
printf("%d %3.0f\n", s[0].num, s[0].TotalScore);
}
///////////////////////////////////////////////////////////////第3题//////
struct STU
{
char name[10];
int num;
};
void f(char *name, int num)
{
struct STU s[2]={{"SunDan",20044},{"Penghua",20045}};
num = s[0].num;
strcpy(name, s[0].name);
}
void main()
{
struct STU s[2]={{"YangSan",20041},{"LiSiGuo",20042}},*p;
p=&s[1];
f(p->name, p->num);//name为指针(数组名),num不是,所以只改变name(输出SunDan)
printf("%s %d\n", p->name, p->num);
}
//main函数改成这样结果一样
void main()
{
struct STU s[2]={{"YangSan",20041},{"LiSiGuo",20042}},p;
p=s[1];
f(p.name, p.num);//name为指针(数组名),num不是,所以只改变name(输出SunDan)
printf("%s %d\n", p.name, p.num);
}
///////////////////////////////////////////////////////////////////第4题
/*函数名: rewind
功 能: 将文件指针重新指向一个流的开头
用 法: int rewind(FILE *stream);
程序例:
*/
void main()
{
FILE *fp; int i, k, n;
fp=fopen("data.dat", "w+"); //创建一个名为data.dat的文件
for(i=1; i<6; i++) //输入1,2,3,4,5
{
fprintf(fp,"%d ",i);
if(i%3==0) fprintf(fp,"\n"); //为3是换行
}
rewind(fp);
fscanf(fp, "%d%d", &k, &n); printf("%d %d\n", k, n);//从头开始读文件,读两数当然是1 ,2了
fclose(fp);
}
///////////////////////////////////////////////////////////////////////////第5题
int a=2;//全局变量
int f(int n)
{
static int a=3;
int t=0;
if(n%2){ static int a=4; t += a++; } //这里的a只有块作用域
else { static int a=5; t += a++; }
return t+a++; //使用的是函数和一行的a,++在后时,先用后加
}
void main()
{
int s=a, i;//这里a为全局变量,故s为2
for( i=0; i<3; i++)
s+=f(i);
printf("%d\n", s);
}
/*
还是分析一遍吧:
注意f里面的a都是静态的只赋值一次,下次作用时值不变。
先算f(0): 0%2为零 执行 esle,自增运算“++”在后,先加后自增,所以t为5;随后a为6,return 时else里的a无效,
这里的a为函数第一行为3的a,返回5+3,a自增为4;
f(1): 执行if t ==4 a为5(下次不用它,不管它也行)return时,因上次a自增为4为,所以返回 4+4,这时a自增为5
f(2):执行else 此时else中a为6了(执行f(0)时自增的)t = 6;return时加上第一行的a(5) 返回11
2+8+8+11 == 29没错吧!
*/
第一题应该是选B,main中先赋值s[0]={"YangSan",20041,703} s[1]={"LiSiGuo",20042,580}.之后调用f(s)这个函数,,这时s[0]={"SunDan",20044,550},s[1]={"Penghua",20045,537}.之后是指针的自增,但是++p是在本函数执行完之后才自增的,所以这里的s[1]的值就被赋值给了main中的s[1],答案就是B喽。
第二题很容易迷惑人,但细心点你就会发现,f(s[0]),这里的s[0]于main函数中的s[2]是同类的东西,都是结构体,而不是s[2]结构体中的s[0]。关键看参数的传递。f函数中参数的定义就是struct STU。f中的s[0]是说这个结构体中并没有给分配空间。所以答案是D。
第三题,这里的p是结构体指针,先是指向main中的s[1],然后在f函数中把f函数中s[0]的值赋给了p所指向的地址,所以最后p最后输出的值就是f中s[0]的值。答案是A
第四题,创建了一个文件,然后i从1开始循环,想ftp中写入数据i,如果i能被3整除,就向fp中输入文件的结束符。然后把fp中的值分别给了k和n,再把k和n输出。所以结果就是1,2,答案是D
第五题,static变量也就是静态变量,在程序运行过程中被声明后就会一直保存在内存里,所以只能声明一次,第二次再访问那个函数时,给静态变量声明同时赋值的语句就不再执行了,而静态变量的值始终保存在内存里,也就是上次改变以后的值。所以,第一次循环s=s+f(0)=2+f(0),而f(0)=t+a++,而else中t=5,(先运算再自增,+的优先级高,这里的a和外面的a不一样,),return值是5+3,a自增为4.所以第一次循环,s=2+8=10
同理,第二次循环,t=4,return=4+4,s=10+8=18 a自增为6 第三次循环,t=5,return值为5+6 s=18+11=29.
这样的回答可以给分了么,嘿嘿。
1.b 2.d 3.a 4.d 5.29