c语言问题

一、 选择题
1.若需建立如图所示的存储结构,且以说明float*p,m=1.234;则正确的赋值语句是()

P↓
1.234
A)p=m; B)p=&m; C)*p=m; D)*p=&m;
2.对两个数组A和B进行如下初始化,则以下叙述正确的是()
char A[]=”ABCDEG”;
char B[]={‘A’,’B’,’C’,’D’,’E’,’G’};
A) A与B数组完全相同 B)A与B完全相同
C) A和B都存放字符串 D)A数组比B数组长度长
3.以下在任何情况下计算平方数时都不会引起二义性的宏定义是()
 A) #define POWER(x)x*x B) #difine POWER(x)(x)*(x)
 C) #define POWER(x)(x*x) D) #difine POWER(x)((x)*(x))
4.语句int(*ptr)();的含义是()
A) ptr是指向一维数组的指针变量;
B) ptr 是指向int型的指针变量
C) ptr 是指向函数的指针,该函数返回一个int型数据
D) ptr 是一个函数名,该函数的返回值是指向int型数据的指针
5.语句while(!E);中的表达式!E等价于()
A) E==0; B) E!=1; C) E!=0; D) E==1;
6.在32位4字节对齐环境下,sizeof(struct tagTest)等于()
Struct tagTest
{
Short lA;
Char cB;
}
  A) 4 B) 8 C) 3 D) Unknown
7.请选择以下代码输出结果()
int Arr[3]={1,2,3};
int *p=(int *)(&Arr+1);
printf(“%d %d”, *(Arr+1),*(p-1));
A)21 B)22 C)23 D)未知
8.程序输出结果()
void funcA(){
int lRet = 0;
for(i=0;i<3;i++)
{
lRet = FuncA(i);
}
Printf(“lRet = %d”,lRet);
}
A)34 B) 33 C) 21 D)未知
9. sizeof(str)等于()
void func(char str[100])
{
Printf(“%d”,sizeof(str));
}
A) 100 B) 4 C) 8 D) 未知
10. strlen(aa)等于()
void main()
{
Char aa[10];
Printf(“%d”,strlen(aa));
}
A) 10 B) 4 C) 12 D)未知
二、 判断题
1. 全局变量(global)和初始化了的静态变量(static)放在代码段中 ()
2. 堆(heap)就是通常我们说的动态内存分配,它用来管理动态内存的 ()
3. 函数的局部变量和参数在stack中()
4. switch(c)语句中c可以是int,long,char,float,unsigned int类型。()
5. 在嵌入式32位CPU环境下,四字节对齐能提高访问效率。()

三、程序改错题
1. int main(void)
{
Unsigned char index = 0;
While(index < 256)
{
index +=index;
index++;
}
Printf(“index value %d\n”,index);
Return 0;
}
2. char*f()
{
Char s[4]={‘1’,’2’,’3’,’0’};
Return s;
}
Void main()
{
Char *s;
s=f();
printf(“%s”,s);
}

3. void GetMenory(char**p)
{
*p = (char*)malloc(100);
}
Void Test(void)
{
char*str = NULL;
GetMemory(&str);
strcpy(str,”hello morld”);
printf(str);
}
4. void main(void)
{
char src_str[10]=
{‘T’,’H’,’I’,’S’,’I’,’S’,’t’,’h’,’e’,’s’};
char dest_str[10];
strcpy(dest_str,src_str);
}
5. void main(void)
{
char src_str[10],dest_str[10];
for(int i=0;i<10;i++)
{
src_str[i]=i+’0’;
}
strcopy(dest_str,src_str);
printf(“%s”,src_str);
}

四. Struct TEMP_TAG
{
int nCount;
struct TEMP_TAG*next;
}
往链表PstHead位置k后面增加一个nCount为10的节点,头节点位置为1,成功返回0,失败返回非0,int InsertNode(struct TEMP_TAG*PstHead,int k);

五. 写一个函数,判断一个正数是否为对称数,如果是返回0,不是返
第五题题目
五. 判断一个正数是否为对称数,如果是返回0,不是返回1,(不允许调用c库字符串转换相关函数),如11,121,1221就是对称的。

1
答案应该是B,这个没什么好解释的(就是指针变量指向变量的地址)
2
答案应该是D 如果直接用字符串对字符数组初始化的话字符数组的长度要比实际字符串长度大1的
因为字符串在字符数组中是以'\0'结束的,这个你也可以用sizeof() 分别测试一下
我已经测试过了A比B大1的
3
答案应该是D,这个没的说,括号的作用就是避免二义
4
答案应该是C,不要把 int *ptr();搞混了,题上的是返回一个整形数据的指针函数,后者是一个
返回指针的函数
5
答案是A,呵呵,这个你好好想一下就明白了
6
答案是A 4
7
答案是23 这个你要好好看一看,特别是(&Arr+1)它和(Arr+1)区别很大,前者在地址上加了
1而后者在地址上加了1*sizeof(int);
8.
这道题你是不是搞错了,你仔细看看有很多错误的。
9.
答案是 B 为了帮助你理解,对此程序我写了段代码
#include<stdio.h>
void main()
{
void func(char str[100]);
char str[100];
printf("%d\n",sizeof(str));//答案是100
func(str);

}
void func(char str[100])
{
printf("%d\n",sizeof(str));//答案是4

}
为什么会出现这种情况呢,原因是因为两者有着本质性的区别,第一个sizeof(str)中的str是一个
地址常量,它索引着一段大小为100的内存堆,而第二个sizeof(str)中的str是一个字符指针变量
sizeof(str)的结果就是一个字符指针变量所具有的内存,它的内存应该是为4的
10
答案是D
二:
1.
错,应该放在静态存储区(或全局数据区的)
2

3.

4.
错,不可能是float 型的
5.


1. int main(void)
{
Unsigned char index = 0;//这个地方应该是unsigned int index=0;注意第一个u不能大写
While(index < 256)
{
index +=index;
index++;
}
Printf(“index value %d\n”,index);
Return 0;
}
2.
char*f()
{ //应该是static char s[4]={'0','1','2','3','\0'};
Char s[4]={‘1’,’2’,’3’,’0’};//关键字的开头是不能大写的,还有就是符号‘也不对
Return s;//ruturn 第一个字母也不能大写,
}

Void main()
{
Char *s;//应该是char 第一个字母不能大写
s=f();
printf(“%s”,s);
}
//你这道题的本意是想通过函数调用来获得一个字符串的首地址从而在主函数中输出,
//但是,有一点这个程序没有考虑到那就是当被调函数结束后那个char s[4] 所占内存将自动
//操作系统回收,因为它只是个动态局部变量,所以要想达到目的应该是声明成静态变量的
//static char s[4],还有一点错误就是字符串都要'\0'结尾否则输出的字符串的将不会是你想要的那样

3.
这道题没什么错误,能达到预期的效果,除了有几处拼写错误,例如你第一个是GetmMnory而第二个是
GetMemory这一点你注意一下就可以了
void GetMenory(char**p)
{
*p = (char*)malloc(100);
}
Void Test(void)
{
char*str = NULL;
GetMemory(&str);
strcpy(str,”hello morld”);
printf(str);
}
4.
这道题没什么语法错误,除了单引号格式不对,还有就就违反了字符串都要以'\0'结尾这一约定
5.
这道题没有什么语法错误,就是有个字符串函数写错了strcopy,应该写成 strcpy的
四:
你这道题具体是让做什么的,我不是太明白,是让建一个动态链表啊还是静态链表啊,
请你把问题写详细点
五。

int judgment(int a[],int length )//这个函数是判断是否对称的

{
for(int i=0;i<=length/2;i++)
if(a[i]!=a[length-i])

break;
if(i==length/2+1)
return 1;
else
return 0;

}
void main(void)
{
int a[10];
int num;
printf("请输入你要检测的数\n") ;
scanf("%d",&num);
int length=0;

//这个循环是为了把整数拆开放到一个整形数组中,拆开以后放进数组里面的刚好是和正常的数
//反序的,不过这个不会影响结果的,因为只要数对称反序后一样对称,如果数不对称反序后依然不对称
do
{
int temp=num%10;
a[length]=temp;
num=num/10;
length++;
} while(num>=10);
a[length]=num;
if( judgment(a,length))
printf("是\n");
}
如果这个程序有什么不懂得话,可以提出来,随时帮你解析

希望我的答案对你有点帮助……追问

谢谢哈,第8题的题目有点问题,
就是第四大题能不能帮我写下,动态和静态哪个简单就写哪个,
还有第四和第五的代码能帮我带点语句后面的注释吗
非常感谢

追答

int judgment(int a[],int length )//这个函数是判断是否对称的

{
for(int i=0;i=10);//当整数被程序截成一个一位数的时候循环结束,但此时那个一位数我们还没有保存到数组中来,所以通过下面一个语句来保存
a[length]=num;//保存被do-while循环遗漏的那一位数字
if( judgment(a,length))
printf("是\n");
}
//////////////////////////////////
关于第四大题,你再追问一次吧,因为这次我回答的字数被限制了,我怕问题不能很完整的给你写出来。我对第四大题的理解是这样的,就是已经存在了一个链表,我们需要做的就只是在这个链表的第K个节点去增加一个节点,并且增加的那个节点ncount 值为10,对吗?
同时,关于第五题的叙述方面如果有什么不清楚的地方,你可以继续提出来,毕竟只有彻底的理解程序的思想才能掌握相应的知识。

追问

恩,非常感谢呵呵

追答

int insertHead(struct TEMP_TAG *pstHead,int k)
{
struct TEMP_TAG *p=pstHead;

if(knext;
}
if(k>i)//如果K的值大于当前链表的总结点个数,就无法完成第K的结点的插入,返回0
return 0;
p=pstHead;//使指针P再次指向链表的头结点
for(i=0;inext;
struct pstHead *q;
q=(struct pstHead*)malloc(sizeof(struct TEMP_TAG));//新建一个结点
q->nCount=10;//对新建结点中的nCount成员变量赋值为10
//以下两个语句是完成结点的插入
q->next=p->next;
p->next=q;
return 1;//成功完成插入返回值1
}
如果这道题有什么不懂的地方或者程序本身存在不妥之处,请随时指出,最后问一句,你是什么专业的啊?

追问

我是学信息工程的,呵呵谢谢你啦

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-07-07
五. 判断一个正数是否为对称数,如果是返回0,不是返回1,(不允许调用c库字符串转换相关函数),如11,121,1221就是对称的。

首先把正数(没有考虑浮点数)存放到字符数组中a【100】,
len记录正数长度
while(num>=10)
{
int temp=num%10;//获得数据最低位置
a[len]=char(temp+'0');//数据字符化
num=num/10;
len++;
}
然后比较判断就可以了。

}
第2个回答  2011-07-07
第一题的数据存储形式看不懂到底是啥意思。求解……
第3个回答  2011-07-07
第一题应该选B吧
第4个回答  2011-07-07
选择题:
1、C
2、D
3、B
4、C
5、A
6、A
7、C
8、D
9、B
10、D

判断题:
1、错
2、对
3、对
4、错
5、对