C语言题,求解释 c语言题目,求解释!谢谢

作者&投稿:包彩 (若有异议请与网页底部的电邮联系)
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]这个是地址吧,那你意思就是p【0】为什么是地址对吧。*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=10*n+*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=10*n+*s-’0’;s++;}第一个6符合条件。然后10*0+6指向下个。然后是1进去符合条件。n此时已经等于6了10*6+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
5.while((*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 <stdio.h>
#include <string.h>
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
9.struct 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次,都输出p.y也即是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为里面的值第一次循环p.x也就是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',85.0,90.0}; int i;
strcpy(a.name,b.name);
a. sex=b.sex;
for(i=0;i<2;i++) a.score=b.score;
return a;
}
main()
{STU c={"Qian",'f',95.0,92.0},d;
d=f(c); printf("%s,%c,%2.0f,%2.0f\n",d.name,d.sex,d.score[0],d.score[1]);
}
程序的运行结果是Zhao,m,85,90
10.这个就是简单利用拷贝关系,先定义了结构体STU类型,然后在main函数里定义了STU c={"Qian",'f',95.0,92.0},d;变量并赋值了,这个我们叫初始化。然后放到f()函数里的形参去也就是STU a然f()方法里面也定义了STU b={"Zhao",'m',85.0,90.0};变量并赋值
strcpy(a.name,b.name);这个事字符串里的拷贝把b里面的name全部覆盖掉a里面的name并拷贝。a.name这时候是zhao和b是一样的了。a.sex=b.sex将b的性别赋给a的性别,也就是改掉原来的值了。a和b现在一样了,最后循环两次,a.score=b.score;一样将成绩也改成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("d2.dat,"wb");
fwrite(a,sizeof(int),5,fp);
fwrite(a,sizeof(int),5,fp);
fclose(fp);
fp=fopen("d2.dat","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()函数,这个就是不变的步骤,没有其他的变数。

确实你的问题不少啊,第一,二题,楼上那位已经解决了

第三题:if (a(a[i]<a[j])这是什么意思?是if (a[i]<a[j])吧!
明白了a[0]=5解决这个问题就应该不难了

第四题:
第一次执行while循环时,*s='6',执行n=10*n+*s-’0’;s++;后n=6,s指向数组的下一位即*s='1',再次执行while循环,n就等于61啦,*s指向'*',不能满足while循环的条件,结束

第五题:
fun()里的第一个while循环结束时t指向数组的尾部(b的后一位);*t++=*s++的意思可分解为*t=*s(赋值),t++,s++,这条语句使得s数组全体连接到t数组的后面(s数组仍在)

第六题:
if(s[0])>s[j][0]是什么意思

第七题:
注意全局变量,局部变量和static变量的区别
for()第一次循环后k=6;第二次循环时注意f(a)的返回值是7,因为f()函数里的a是static变量,它的值是三了(因为在第一次循环里执行了a++),最后执行k+=a(a是全局变量等于1),所以k=6+7+1

第八题:
注意递归调用
先n=3,执行fun(n-1,&f1)(递归调用fun()),使得f1=1;再执行 fun(n-2,&f2),使得f2=1;

第九题:
注意结构体的内部定义
a[4]是4个结构体元素的数组,a[0]={20,a+1},a[1]={15,a+2},以此类推
先输出p->x是20,再p=p->y=a+1使得p指向a[1],再输出p->x时自然是15

第十题:
函数STU f(STU a)的作用是使得啊等于b,所以d等于b

第十一题:
^是按位或运算符,&是按位与运算符,a^b是0000000000000001^0000000000000010结果是0000000000000011再与c进行&运算结果还是0000000000000011,即十进制3

第十二题:
fwrite(a,sizeof(int),5,fp);是从a数组里取出5个int型的数据写入fp中,两次写入之后,fp中的数据是1,2,3,0,0,1,2,3,0,0;fread(a,sizeof(int),10,fp);是从fp中读10个int型数据写入a中,所以最后的输出是那样的

哎,你问的问题也太多了,先给你解两个吧:
第一个:
字符串末尾都有“\0”
while(*t++);执行这一句,如果指针t未指向末尾则继续向后移动,因为后面直接写了一个“;” 所以t不到字符串末尾,执行空语句,而不是执行:t--。
当t到末尾时,退出循环,执行 t--,因为最后的“\0”不计入字符串的长度,所以其值要再减1!
首地址末地址之差就是实际长度。

第二个:
int a[2][3],*p[3];则为什么p[0]=&a[1][2];
p为指针数组,即其里面的元素p[0],p[1]等都代表的是地址,所以对于数组a中的元素a[1][2]要取地址。

关于 用 指针,指针数组,数组指针 访问 一维数组 二维数组 的程序,看下面的几个程序吧:

用指针,指针数组,数组指针 访问一维数组和二维数组,指针的初始化和数组元素的输出容易混淆。分析一下几个小例子:

/*
#include<iostream>
using namespace std;
int main()
{
int a[3] ={0,1,2};
int *p;//int 型指针访问一维数组
p = a;
int i;
for(i=0;i<3;i++)
cout<<*(p)++<<endl;
}
*/

/*
#include<iostream>
using namespace std;
int main()
{
int a[3] ={0,1,2};
int (*p)[3];//用数组指针访问一维数组
p = &a;
int i;
for(i=0;i<3;i++)
cout<<*(*(p)+i)<<endl;//这里使用*((*p)++)输出元素师不正确的
}
*/

#include<stdio.h>
int main()
{
int a[3]={0,1,2};
int *p[1];//用指针数组访问一维数组
p[0] = a;
int i;
for(i=0;i<3;i++)
printf("%d\n",*(*p+i));//或者printf("%d\n",*((*p)++));
}

/*
#include<iostream>
using namespace std;
int main()
{
int a[2][3]={0,1,2,3,4,5};
int *p;//int 指针访问二维数组
for(p =a[0];p<a[0]+6;) // for(i=1,p =a[0];p<a[0]+6;p++,i++) cout<<*p<<endl;
cout<<*p++<<endl;
}
*/

/*
#include<iostream>
using namespace std;
int main()
{
int a[2][3] ={0,1,2,3,4,5};
int (*p)[3];// 数组指针访问二维数组
p = a;
int i,j;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
cout<<*(*(p+i)+j)<<endl;
}
*/
/*#include<iostream>
using namespace std;
int main()
{
int a[2][3]={0,1,2,3,4,5};
int i,j,*p[2];//指针数组访问二维数组
p[0] = a[0];p[1]=a[1];//*p[2] = {a[0],a[1]};
for(i=0;i<2;i++)
for(j=0;j<3;j++)
cout<<*(*(p+i)+j)<<endl;
}*/

其他的自己慢慢分析吧,就那几行,想必不是很困难,学着调试,看看每执行一步各个变量的变化情况~,仔细分析出来,比问别人而学会更好。

愉快~

蚝油难度

c语言题目,求解释,谢谢了!!~

梅森素数是由梅森数而来。所谓梅森数,是指形如2p-1的一类数,常记为Mp 。如果梅森数是素数,就称为梅森素数。
输入3,
那我们就寻找找p<=3梅森数的个数
当p=3时,2的三次方-1=7是梅森素数
当p=2时,2的二次方-1=3是梅森素数
所以n=3是我们可以找到2个梅森数,所以输出2
程序是这样的:
#include
int power(int m,int p)
{
if(p == 1)
return m;
else
return power(m,p-1)*m;

}
int is_prim(int n)
{
int i;
for(i = 2; i < n; i++)
{
if(n % i == 0)
break;
}
if(i == n)
return 1;
else
return 0;
}
void main()
{
int p,n;
int count = 0;//计数器
scanf("%d",&n);
for(p = n;p > 1; p--)
{
if(is_prim(power(2,p)-1))//判断2^p-1是否是素数,是的话count就加1
{

count++;
}

}
printf("%d
",count);
}

第一题,函数fun的两个参数第一个是传指针(传入了&b也就是b的地址),第二个参数是传值,所以调用fun后main函数中的变量b的值被fun修改了,而变量a保持不变。
第二题,变量r是个指向数组a首地址的指针,f(r)中r赋值给了p也就是说p也指向a的首地址,p = p+3后p移动到a数组的第4位也就是*p = 4,所以第一个输出为4。而f中的局部变量p并不改变r的值,所以f(r)之后r仍然指向a的首地址,所以*r依然为1。

C语言编程题,求解释。第二题。
答:k*=n%10即 k=k*(n%10),初始值,k=1,n=263,所以k=3,n=26, while(n)判断n为真,所以继续循环,此时k=3*6=18 n=2; while(n)再次判断n为真,再次循环,此时k=18*2=36,n=0,判断n为假,所以退出循环, while(n)表示判断n的值是否为真,程序中认为0为假,其他值为真。若...

c语言,题目如图第22到27题。求解释不要只说答案,谢谢大家!
答:22.\x是转义字符代表转16进制,\x4a代表ASCII码为16进制的4A的字符;\\\n解释为"\\"+"\n",是消除转义的'\'符号再加转义字符'\n';\102代表ASCII码为102的字符,因此最后字符组成是'm'+'\x4a'+'\'+'\n'+'p'+'\102'+'q'一共7个字符(字符串长度不含结尾标识'\0')。23.strlen...

C语言问题,求原因解!
答:X代表十六进制,p代表a数组的首地址 第一个printf()输出194就是说数组a的首地址是十六进制的194 p+9就是指向0的位置,a中每一个元素占用2个字节,那么从a的开始到0共占用2*9 = 18个字节18的十六进制是12,所以194 + 12 = 1a6故选D ...

C语言题:求结果,要给出步骤解释
答:main函数中printf语句在执行前会调用funs函数,参数=4,调用:funs(4)funs(n),n=4: 由于条件不成立执行else,在返回值前调用funs(n-1),调用funs(3)funs(n),n=3: 由于条件不成立执行else,在返回值前调用funs(n-1),调用funs(2)funs(n),n=2: 由于条件成立执行return 2;返回值是2,回到...

有关C语言的几道题,求答案及解释
答:1、题目倒数第二句改为“输入字符A后”的话,ch的值是'A',getchar()是从标准输入流读取一个字符,并返回这个字符,赋值给了ch,所以ch的值就是你输入的那个字符,你输入A,它的值就是A 2、暂时还不是很明白,C和D都能在win-tc下编译通过,值都存在变量str3,和str4里面,可以通过printf("...

C语言简单循环问题,求解释每一步
答:int k=0,m=0,i,j;//定义变量及赋初值 for (i=0; i<2; i++)//for循环,i初值0,跑2次 { for (j=0; j<3; j++)//for循环,j初值0,跑3次 k++ ;//最后k=3 k-=j ;//由于此时j=3,k=0 } m = i+j ;//i=2,j=3,m=5 printf("k=%d,m=%d",k,m) ;//输出k=...

一道C语言的题目,跪求大神解答,拜托能不能解释一下运行过程
答:include<stdio.h>int main(){ int i,p[3][3]={1,2,3,4,5,6,7,8,9},*p1[3],(*p2)[3];// 二维数组p有3行,每行有3个整数.// 应该写成int p[3][3]={ {1,2,3}, {4,5,6}, {7,8,9} };// p等于0x28fee4,这是十六进制数,是内存地址,从这个内存地址开始,连续...

C语言的一道题,求解释
答:输出的结果是:4294967293 分析如下:变量i是有符号数,i=-3,而负数在内存中是以其补码的形式存放的,-3的补码(int型的占4个字节32位):1,111 1111 1111 1111 1111 1111 1111 1101,其中最高位是符号位(0为正,1为负),而变量ud是无符号位的,那么就不存在符号位了,当将变量...

c语言题目,求解释!谢谢
答:第一题,函数fun的两个参数第一个是传指针(传入了&b也就是b的地址),第二个参数是传值,所以调用fun后main函数中的变量b的值被fun修改了,而变量a保持不变。第二题,变量r是个指向数组a首地址的指针,f(r)中r赋值给了p也就是说p也指向a的首地址,p = p+3后p移动到a数组的第4位也就是...

求两道C 语言题目解释,谢谢
答:2.在C语言中,不正确的int类型的常数是A A) 32768 B) 0 C) 037 D) 0xAF 3 设有如下定义:int x=l,y=-1;,则语句:printf("%d\n",(x--&++y));的输出结果是B A) 1 B) 0 C) -1 D) 2 //分析 2.这个题是早期的TC等16位编译系统中的题,在16位编译...