一、填空
1、设a=3,b=4,printf("%d,%d",(a,b)(b,a));输出什么:4,3
2、
二、选择
1、以下字符常量合法的是(B)
A.’\084’ B. ’\x43’ C.’ab’ D.”\0”
解析:A. 不合法,八进制没有8。 C.不合法,字符只能是一个。 D.不合法,字符串不需要写结束符。
2、若变量都正确定义,下面表达式中非法的是(B)
A. a/=b+c B. a%4.0 C. a=1/2*(x=y=10,x*3) D. a=b=c
解析:%运算对象必须是整型数
3、表达式10!=9的值是(D)
A. true B. 非零值 C. 0 D. 1
解析:第一,题目说的是值;第二,用gcc编译器编译器打印出来结果也是1。
4、以下为非法的字符串常量为(C)
A、"\\ \\"; B、"It' s"; C、"m=\abc"; D、"$12.8";
解析:A是转义字符串,打印出\ \; B和D都能正常打印出来; C选项打印结果为m=bc,printf(“\a”);执行效果是蜂鸣器滴的一声。
5、
三、综合
1、下面函数有什么问题,怎么改?
void swap2(int *a,int *b)
{
int *p;
*p=*a;
*a=*b;
*b=p;
}
问题:*p本身没有空间存放*a的值
方法1:将*p改为p,定义变量p直接存放*a。
方法2:将int *p;改成int *p=(int*)malloc(0);申请空间存放*a//注意这里申请0个控件也可以,内存碎片知识。
拓展:交换两个数的值还有一个比较好的方法,用异或:#define SWAP(a,b) {a^=b;b^=a;a^=b;}
2、下面函数有什么问题,怎么改?
void test(void)
{
char *str="123456789";
char str2[10]="Summer";
printf("%s\n",strcpy(str,str2));
}
问题:char *str="123456789";是定义的字符串常量,不能修改。
方法:将char *str="123456789";改成char str[10]="123456789";
3、找出下面代码中的所有错误
1 void test() 2 { 3 char *src="abcdefg"; 4 char *dest=NULL; 5 int len=strlen(src); 6 dest=(char*)malloc(len); 7 char *d=dest; 8 char *s=&src[len]; 9 while(len--!=0) 10 d++=s--; 11 printf("%s\n",dest); 12 }
解析:
1 void test() 2 { 3 char *src="abcdefg"; 4 char *dest=NULL; 5 int len=strlen(src); 6 dest=(char*)malloc(len+1); //要为\0分配一个空间 7 char *d=dest; 8 char *s=&src[len-1]; //指向最后一个字符 9 while(len--!=0) 10 *d++=*s--; 11 *d='\0'; //尾部要加\0 12 printf("%s\n",dest); 13 free(dest); //使用完要释放空间,防止内存泄露。 14 }
四、问答
1、strlen和sizeof之间的区别是什么?
(1)strlen是字符串函数,用来计算字符串长度;sizeof是关键字,用来计算数据类型和变量的长度。
(2)strlen 计算字符串长度不需要计算 \0
sizeof 计算字符串长度需要计算 \0
void test() { char str[]={'a','b','c','d','e','\0'}; //单个字符组成的字符串要以 \0 结束 char str2[]="abcde"; //直接字符串表示不用 \0 结束 printf("%d\n",strlen(str)); // 5 printf("%d\n",sizeof(str)); // 6 printf("\n"); printf("%d\n",strlen(str2)); // 5 printf("%d\n",sizeof(str2)); // 6 }
2、队列和栈有什么区别?
(1)队列先进先出,栈先进后出。
(2)对插入和删除操作的"限定"。栈是限定只能在表的一端进行插入和删除操作的线性表,队列限定只能在表的一端进行插入和在另一端进行删除操作的线性表。
(3)遍历数据速度不同。栈只能从头部取数据,而且在遍历数据的时候还得为数据开辟临时空间。队列可以从头或尾部开始遍历,但不能同时遍历,无需开辟临时空间,速度要快的多。
五、编程题
1、题目描述:给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号","隔开。现在请计算A+B的结果,并以正常形式输出。输入:输入包含多组数据数据,每组数据占一行,由两个整数A和B组成(-10^9 < A,B < 10^9)。输出:请计算A+B的结果,并以正常形式输出,每组数据占一行。样例输入:(1)-234,567,890 123,456,789 (2)1,234 2,345,678样例输出:(1)-111111101 (2)2346912
1 #include <stdio.h> 2 #include <string.h> 3 int StringDataAdd(char str[20]); 4 int main(void) 5 { 6 char str1[20], str2[20]; 7 int a,b; 8 #if 1 9 //可以输入一次 10 scanf("%s%s", str1, str2); 11 a = StringDataAdd(str1); 12 b = StringDataAdd(str2); 13 printf("%d\n", a + b); 14 #endif 15 #if 0 16 //可以输入多次 17 while (scanf("%s%s", str1, str2) != EOF) //EOF是文件stdio.h中定义的特殊值,一般,#define指令把EOF 的值定义为-1。 18 { 19 a = StringDataAdd(str1); 20 b = StringDataAdd(str2); 21 printf("%d\n", a + b); 22 } 23 #endif 24 return 0; 25 } 26 int StringDataAdd(char str[20]) 27 { 28 int a = 0; 29 int i; 30 for (i=0; i<strlen(str); i++) 31 { 32 if(str[i] == '-' || str[i] == ',') //处理数字字符 33 {continue;} 34 a = a*10 + str[i]-48; 35 } 36 if(str[0] == '-') 37 { a = -a; } 38 return a; 39 }
2、题目描述:输入n,求y1=1!+3!+...m!(m是小于等于n的最大奇数)y2=2!+4!+...p!(p是小于等于n的最大偶数)。输入描述:每组输入包括1个整数;n输出描述:可能有多组测试数据,对于每组数据,输出题目要求的y1和y2;输入例子:4;输出例子:7 26。
1 #include<stdio.h> 2 unsigned int Class(unsigned int n); 3 unsigned int GetOddOrEvenClassSum(unsigned int n,unsigned int OddEvenChoice); 4 unsigned int GetResult(unsigned int n,unsigned int OddEvenChoice,unsigned int *p); 5 int main(void) 6 { 7 unsigned int y1,y2; 8 y1= GetResult(4,1,&y2); 9 printf("%d,%d\n",y1,y2); 10 return 0; 11 } 12 //递归求n的阶层 13 unsigned int Class(unsigned int n) 14 { 15 if(n<=1) 16 { 17 return 1; 18 } 19 else 20 { 21 return n*Class(n-1); 22 } 23 } 24 //求奇数的阶层的时候,OddEvenChoice赋值1。求偶数的阶层的时候,OddEvenChoice赋值2。 25 unsigned int GetOddOrEvenClassSum(unsigned int n,unsigned int OddEvenChoice) 26 { 27 int i=0; 28 unsigned int OddOrEvenClassSum=0; 29 for(i=OddEvenChoice;i<=n;i=i+2) 30 { 31 OddOrEvenClassSum=OddOrEvenClassSum+Class(i); 32 } 33 return OddOrEvenClassSum; 34 } 35 //指针实现函数返回多个值 36 unsigned int GetResult(unsigned int n,unsigned int OddEvenChoice,unsigned int *p) 37 { 38 unsigned int OddClassSum; 39 OddClassSum=GetOddOrEvenClassSum(n,OddEvenChoice); 40 *p=GetOddOrEvenClassSum(n,OddEvenChoice+1); 41 return OddClassSum; 42 }
3、找出N个数中最大的那个数,并打印它是第几个。
1 #include<stdio.h> 2 int FindMax(int *p1,int ArrayLength,int *p2); 3 int main() 4 { 5 int i; 6 int a[]={1,3,5,7,9,2,4,6,8}; 7 int Max; 8 int FirstFew; 9 Max=FindMax(a,9,&FirstFew); 10 printf("%d,%d\n",Max,FirstFew); 11 return 0; 12 } 13 int FindMax(int *p1,int ArrayLength,int *p2) 14 { 15 int max=*p1; 16 int i; 17 for(i=1;i<=ArrayLength-1;i++) 18 { 19 if((*(p1+i))>=max) 20 { 21 max=(*(p1+i)); 22 *p2=i+1; 23 } 24 } 25 if(max==(*p1)) 26 *p2=1; 27 return max; 28 }
六、小结
1、在if后的圆括号中的表达式可用任意表达式
2、全局变量可以定义在函数以外的任何位置
3、16进制转8进制数的时候可以先转化成2进制,然后由2进制再转8进制。例如16进制数0x30转化为8进制的时候,0x30=0011 0000(2),0011 0000分为00 110 000,00 110 000分别对应的值为0 6 0,所以16进制的0x30转化成8进制就是60。
//要为\0分配一个空间