
int aaa(char s)
{char t=s;
while(t++);
t--;
return(t-s);
}
为什么是求字符串s的长度呢?
1这个你可以分析出来穿来的可定是字符串。然后while(t++)赋空语句;表示循环到t=\n位置;然后t--;移到前面的位置,就是abcd的d位置那d和第一个字符a来做比较大小。t与s两个指针只能做一个字符的指向然后通过++或者--来往后一个字母或是前一个字母这题主要目的他是把第一个字母和最后个字母来做比较
2若有定义语句:int a[2][3],p[3];则为什么p[0]=&a[1][2];
2首先&a[1][2]这个是地址吧,那你意思就是p0为什么是地址对吧。p[3]是个二维指针。也可以转换为二维数组表现方法有很多。p[0]是0行0列的首地址,写全应该是p[0]+0,p[0]+1。。。这样
3#include
void fun(int a,int n)/fun函数的功能是将a所指数组元素从大到小排序/
{int t,i,j;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if ((a[i]<a[j]) {t=a[i];a[i]=a[j];a[j]=t;}
main()
{int c[10]={1,2,3,4,5,6,7,8,9,0},i;
fun(c+4,6);
for (i=0;i<10;i++) printf("%d,",c);
printf("\n");
}
结果是:1,2,3,4,9,8,7,6,5,0,
3这个答案是对的呀,fun(c+4,6);这个1,2,3,4,5,6,7,8,9,0的a[4]地址转到形参去void fun(int a,int n)那int a指向是a[4]=5的地址上for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
n也是传上去的6就看做是i<6-1;j<6;从5,6,7,8,9,0一共是6个数字没什么不对。然后for(i=0;i<n-1;i++)for(j=i+1;j<n;j++)利用双for语句进行比较邻近的两个如果前面比后面小就,相互换下。也就是从大排到小。
5,6,7,8,9,0进行处理后应该是9,8,7,6,5,0吧。9最大0最小依次下来
。返回到main方法。中加上前面的4个值1,2,3,4并且加上处理过的9,8,7,6,5,0那就变成1,2,3,4,9,8,7,6,5,0吧。
4
#include
int fun(char s[])
{int n=0;
while(s<=’9’&&s>=’0’) {n=10n+s-’0’;s++;}
return(n);
}
main()
{char s[10]={’6’,’1’,’’,’4’,’’,’9’,’’,’0’,’’};
printf("%d\n",fun(s));
}
为什么是61?
4这个就是说遇到了不是数字就跳出while循环6,1,所以跳出来用return返回他只读到61
while(s<=’9’&&s>=’0’) {n=10n+s-’0’;s++;}第一个6符合条件。然后100+6指向下个。然后是1进去符合条件。n此时已经等于6了106+1=61吧。然后进去不符合条件。立即将61用return返回!
5
有以下程序:
#include
void fun(char t,char s)
{
while(t!=0)t++;
while((t++=s++)!=0);
}
main()
{
char ss[10]=”acc”,aa[10]=”bbxxyy”;
fun(ss,aa);
printf(“%s,%s\n”,ss,aa);
}
程序运行结果是accbbxxyy,bbxxyy
5
有以下程序:
#include
void fun(char t,char s)
{
while(t!=0)t++;
while((t++=s++)!=0);
}
main()
{
char ss[10]=”acc”,aa[10]=”bbxxyy”;
fun(ss,aa);
printf(“%s,%s\n”,ss,aa);
}
程序运行结果是accbbxxyy,bbxxyy
5while((t++=s++)!=0);这个其实是赋值语句呀。ss=“acc”,aa=“bbxxyy”先while(t!=0)t++;循环到acc\0最后字符的时候t++=s++然后这样t=s然后++一直到s==0的时候,t不是等于acc连接了s里面的字符“bbxxyy”然后返回来给ss,aa没变呀输出的是accbbxxyy,bbxxyy
6#include <stdioh>
#include <stringh>
void fun(char s[][10],int n)
{
char t;int i,j;
for(i=0;i<N-1;I++)
for(j=i+1,j<N;J++)
/比较字符串的首字符大小,并交换字符串的首字符 /
if(s[0])>s[j][0]{t=s[0];s[0]=s[j][0];s[j][0]=t;}
}
main()
{
char ss[5][10]={“bcc”,”bbcc”,”xy”,”aaaacc””aabcc”}
fun(ss,5); printf(“%s,%s\n”,ss[0],ss[4]);
}
为什么是aaaacc,xy
6这题他注释已经告诉你为什么答案是这个了。首先我们不看其他函数,没有预处理文件,我们按规程办事,看main()方法一直到fun(ss,5)这里将5个字符串和5附到fun形参里并已经开始调用了,然后看fun函数接受过来以后for(i=0;i<N-1;I++)for(j=i+1,j<N;J++)又是双for进行比较前面的和后面的比大小if(s[0])>s[j][0]{t=s[0];s[0]=s[j][0];s[j][0]=t;}如果前面的比后面的大,相互互换,那前面肯定到最后是最小咯。那后面我也不看了。你就看他最小的字符串是多少。按ASKII来比,又都是小写的,较头字母a最小吧。那只有aaaacc和aabcc吧。那第三个字母一个是a一个事b哪个最小不是出来了吗。在看最大的。x头字母没有比他大的了,所肯定是x带头的字符串是最大的。所以要求输出a[0]最小是aaaacc,a[4]是最上标也就是最大不就是xy吗?
7有以下程序
#include
int a=1;
int f(int c)
{static int a=2;
c=c+1;
return (a++)+c;}
main()
{ int i,k=0;
for(i=0;i<2;i++){int a=3;k+=f(a);}
k+=a;
printf(“%d\n”,k);
}
程序运行结果是14
7这题有点陷阱了,先是3到f函数定义了个static int a=2;就是说第一次调用好以后a=a++吗,返回的是3+1+2=6第二次调用的时候a!=2了而是3返回的是3+1+3=7然后k=6+7=13然后k+a=13+3=16 这题目有点不对。首先在main()函数里面没有定义过a,而你在for循环a=3就会出现异常。即使定义了,最后结果也不是14
8有以下程序
#include
void fun(int n,int p)
{ int f1,f2;
if(n==1||n==2) p=1;
else
{ fun(n-1,&f1); fun(n-2,&f2);
p=f1+f2;
}
}
main()
{ int s;
fun(3,&s); printf("%d\n",s);
}
程序的运行结果是2
8首先是将3和没有值的s地址赋给fun函数里的形参3!=1!=2所以执行else语句里面有递归fun(n-1,&f1)先再调用此,可是第一次调用还没有结束,先挂在这边都结束了再来。
n-1=3-1=2就符合if语句了p=1=f1也就是说f1=1然后后面的调用结束,在来看没有完成的第一调用的地方。结束了一个递归,又来了,第二波不要被他吓到,(一波未平一波又起,但是最后还是死在沙滩上)进去第二次循环此时n=3不是n=2因为n=2是第二次的循环,还这里还是3所以3-2=1和f2的地址再调用同样符合条件p=1=f2 f2也等于1 ,最后p=1+1=2返回给最初的调用s的地址上所有s=2
9有以下程序
#include
struct tt
{int x;struct tt y;} p;
struct tt a[4]={20,a+1,15,a+2,30,a+3,17,a};
main()
{ int i;
p=a;
for(i=1;i<=2;i++) {printf("%d,",p->x); p=p->y;}
}
程序的运行结果是20,15
9struct tt {int x;struct tt y;} p; /定义结构体吧。成员变量为int x 和 tt y类型的指针相当于next为了指向下一个的/
struct tt a[4]={20,a+1,15,a+2,30,a+3,17,a};在函数体外,就是全局变量咯
p=a; /p指向a也就是说p是头指针/
for(i=1;i<=2;i++) {printf("%d,",p->x); p=p->y;}/循环2次,都输出py也即是p的下一个指向/
我画个图应该可以理解了
|---------| |---------| |---------| |---------| |---------|
| p | ====== | a[0] | -----> | a[1] | -----> | a[2] | ----> | a[3] |
|---------| |---------| |---------| |---------| |---------|
这就是这个图形p和a[0]是一个地址其他4个a[0]-a[3]都是有int x;struct tt y;的struct tt y表示图上的----》指向下个位置x为里面的值第一次循环px也就是a[0]x是首地址吧20然后p=p->y;y就是a+1就是----》知道a[1]了然后第二次循环输出a[1]x=15吧。
所以最后答案就是20,15
10有以下程序
#include
#include
typedef struct{ char name[9];char sex; float score[2]; } STU;
STU f(STU a)
{ STU b={"Zhao",'m',850,900}; int i;
strcpy(aname,bname);
a sex=bsex;
for(i=0;i<2;i++) ascore=bscore;
return a;
}
main()
{STU c={"Qian",'f',950,920},d;
d=f(c); printf("%s,%c,%20f,%20f\n",dname,dsex,dscore[0],dscore[1]);
}
程序的运行结果是Zhao,m,85,90
10这个就是简单利用拷贝关系,先定义了结构体STU类型,然后在main函数里定义了STU c={"Qian",'f',950,920},d;变量并赋值了,这个我们叫初始化。然后放到f()函数里的形参去也就是STU a然f()方法里面也定义了STU b={"Zhao",'m',850,900};变量并赋值
strcpy(aname,bname);这个事字符串里的拷贝把b里面的name全部覆盖掉a里面的name并拷贝。aname这时候是zhao和b是一样的了。asex=bsex将b的性别赋给a的性别,也就是改掉原来的值了。a和b现在一样了,最后循环两次,ascore=bscore;一样将成绩也改成b的了。所以现在a不是原来的a了,而是b的数据了。
11。
有以下程序
#include
main()
{ int a=1,b=2,c=3,x;
x=(a^b)&c; printf("%d\n",x);
}
程序的运行结果是3
11这个是位于运算符,^和&异或然后与得运算先将1,2,3转换成2进制1=00000001,2=00000010,3=00000011异或是有一个1(真)就是1(真),00000001^00000010=00000011而00000011&00000011是与运算遇到都是1(真)才是真否则都是0(假)那么那个都是一样的地方有1所以答案还是原来的00000011再转换成10进制1+2的1次方=3
12有以下程序
#include
main()
{FILE fp; int a[10]={1,2,3,0,0},i;
fp=fopen("d2dat,"wb");
fwrite(a,sizeof(int),5,fp);
fwrite(a,sizeof(int),5,fp);
fclose(fp);
fp=fopen("d2dat","rb");
fread(a,sizeof(int),10,fp);
fclose(fp);
for(i=0;i<10;i++) printf("%d",a);
}
为什么是:1,2,3,0,0,1,2,3,0,0,
12这题是关系到文件fwrite(a,size(int),5,fp)函数是将a里面的数据1,2,3,0,0写到fp指向的d2。dat中去然后又出现了一遍fwrite(a,size(int),5,fp)照前面在执行此,就是在12300后面再写一遍12300所以最后,用fread(a,sizeof(int),5,fp)将fp的东西放到a里面去也就是是拷贝了。所以1230012300
啊这个都是基础的问题。不过很烦,希望你努力分析,不管什么,考试还好,还是分析程序还好,看有没有预处理的。就先看预处理的。然后看有没有全局变量或者结构体的,没有就看main()函数,这个就是不变的步骤,没有其他的变数。
这三题主要的考查点就是:结构体的值传递和地址传递的区别。
值传递:不管怎么传,原来的实参的值都不会改变。
地址传递,原来的实参的值可能被改变。
值传递就好象你告诉别人你的帐户里有多少钱 帐户里的钱不会改变。
地址传递就好象你告诉别人你的帐户密码 帐户里面的钱可以被改变。
第一题:f(s[0]); 把结构体数组的第一个元素传递给函数f,都不用看函数f是怎么写的了,
printf("%d %30f\n", s[0]num, s[0]TotalScore);输出的就是原来s[0]的数据,因为值传递不可能改变实参的值。
第二题:
p=&s[1];相当于p=s+1; p指向s[1]这个结构体
f(p->name, p->num);//p->name是地址传递,形参name=p->name,
在函数f中用strcpy改变了name的值,也就改变了p->name的值
至于p->num跟第一题意思一样,也是值传递,不可能被改变。
第三题:也是地址传递 } ++p,所以p指向s[1] 也就是{"LiSiGuo",20042,580 }
++q,所以q指向{"Penghua",20045,537 }
p=q 是把结构体直接复制给另一个结构体 //这种写法也是正确的,不过我们习惯了一个成员,一个成员的逐一赋值。
首先要明确结构体数组初始化的结果为:
num[0]x=1
num[0]y=3
num[1]x=2
num[1]7=7
其次人,还不要忘了二个int的商仍是一个int。所以,输出的结果为:
3/12=6
即输出:
6
你给的程序有几个问题,WTU应为STU,且其末尾应加分号结束,200f太长,改为20f
因为y=x所以y的初始化值被x的值覆盖,y的值与x的值相同,因此输出的是x初始化的值,
输出的是x的名字lin,性别f,成绩725和830
s表示输出字符串
c表示输出一个字符
因为725是double型,所以缺省保留6位小数,
20f表示输出整个数占20个字符(包括小数点),不够在前面用空格补足
20f表示输出整个数占2个字符(包括小数点),超过2个以实际长度输出,其中0表示没有小数部分
因此输出下面结果
以上就是关于C语言题,求解释全部的内容,包括:C语言题,求解释、那位仁兄可以帮忙解决一下 05年9月二级c真题的选择题46、47、48 要有解题过程 在下感激不尽、若有以下程序 #include"stdio.h" void main() { struct com等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)