




已阅读5页,还剩30页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
上嵌教育上海通信协会人才实训基地、华东科研委员会嵌入式人才孵化基地 1、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局,要用全局变量,需要使用:。 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。 对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的 局部变量,而那个局部变量的作用域就在那个循环体内。 2、如何引用一个已经定义过的全局变量? 答:extern。 可以用引用头文件的方式,也可以用extern 关键字,如果用引用头文件方式来引用某个在头文件中声明的 全局变量,假定你将那个变写错了,那么在编译期间就会报错;如果你用extern 方式引用,假定你犯了同样的 错误,那么在编译期间不会报错,而在连接期间报错。 3、全局变量可不可以定义在可被多个.C 文件包含的头文件中?为什么? 答:可以,在不同的C 文件中以static 形式来声明同名全局变量。 可以在不同的C 文件中声明同名的全局变量,前提是其中只能有一个C 文件中对此变量赋初值,此时连接 不会出错。 4、语句for ( ; 1; ;)有什么问题?它是什么意思? 答:无限循环,和while(1)相同。 5、dowhile 和whiledo 有什么区别? 答:前一个循环一遍再判断,后一个判断以后再循环。 6、请写出下列代码的输出内容。 #include int main(void) int a, b, c, d; a = 10; b = a+; / b = 10、a = 11 c = +a; / c = 12、a = 12 d = 10*a+; / d = 120、a = 13 printf(b, c, d: %d, %d, %d, b, c, d); return 0; 答:b, c, d: 10, 12, 120 7、static 有什么用途?(请至少说明两种) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中只能被初始化一次,以后调用该函数时, 该静态变量的值维持和上调用结束时一致。 2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其 它函数访问。它是一个本地的全局变量。 3)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在 声明它的模块的本地范围内使用。 8、引用与指针有什么区别? 1)引用必须被初始化,指针不必。 2)引用初始化以后不能被改变,指针可以改变所指的对象。 3)不存在指向空值的引用,但是存在指向空值的指针。 9、描述实时系统的基本特性。 答:在特定时间内完成特定的任务,实时性与可靠性。 上嵌教育上海通信协会人才实训基地、华东科研委员会嵌入式人才孵化基地 10、全局变量和局部变量在内存中是否有区别?如果有,是什么? 答:全局变量存储在静态数据库,局部变量在堆栈 11、什么是平衡二叉树? 答:左右子树都是平衡二叉树,且左右子树的深度差的绝对值不大于1。 12、堆栈溢出一般是由什么原因导致的? 答:没有回收垃圾资源。 13、什么函数不能声明为虚函数? 答:constructor(构造)函数不能被声明为虚函数。 14、冒泡排序算法的时间复杂度是什么? 答:时间复杂度是O(n2)。 15、写出float x 与“零值”比较的if 语句。 if(x=-0.000001 do printf(input m n: ); scanf(%d %d, while (m = 0 | n = 0); for (i = 0; i n; +i) arri = i + 1; for (i = j = 0; i n; +i) k = (j + m) % n; printf(%d , 0=k?n:k); for (j = k; k n - 1; +k) arrk = arrk + 1; printf(n); return 0; 运行结果: 上嵌教育上海通信协会人才实训基地、华东科研委员会嵌入式人才孵化基地 20、不能做switch()的参数类型是: 答:switch 的参数不能为实型。 21、找错 void test1() char string10; char *str1=0123456789; strcpy(string, str1); / 溢出,结束标记0 void test2() char string10, str110; for(i=0; i10;i+) str1i =a; strcpy(string, str1); / str1 无结束标记,string 数组溢出 void test3() char string10; if (strlen(str1)=10) strcpy(string, str1); /当strlen(str1)=10 时,string 溢出 22、写出程序运行结果 int sum(int a) auto int c = 0; static int b = 3; c += 1; b += 2; return (a + b + c); void main(void) int i; int a = 2; for (i = 0; i 5; +i) printf(“%d,”, sum(a); 上嵌教育上海通信协会人才实训基地、华东科研委员会嵌入式人才孵化基地 运行结果: 8,10,12,14,16, #include int sum(int a) int b; switch (a) case 1: b = 30; case 2: b = 20; case 3: b = 16; default: b = 0; return b; 则func(1) = ? / func(1) = 0 int a3; a0 = 0; a1 = 1; a2 = 2; int *p, *q; p = a; q = 则aq-p = ? / 2 23、定义int *a34,则变量占有的内存空间为: 48 。 24、编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。如输入2004 年12 月31 日23 时 59 分59 秒,则输出2005 年1 月1 日0 时0 分0 秒。 #include int main() int year, mon, day, hour, min, sec, daytable13 = 365, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31; do printf(input year mon day hour min sec: ); scanf(%d %d %d %d %d %d, while (year1 | mon12 | daydaytablemon | hour23 | min59 | sec59); if (sec 58) +sec; else sec = 0; if (min 58) 上嵌教育上海通信协会人才实训基地、华东科研委员会嵌入式人才孵化基地 +min; else min = 0; if (hour 23) +hour; else hour = 0; if (2 = mon if (day daytablemon) +day; else day = 1; if (mon 12) +mon; else mon = 1; +year; printf(%d-%d-%d, %d:%d:%dn, year, mon, day, hour, min, sec); return 0; 25、用变量a 给出下面的定义。 a)一个整型数(An integer) / int a; b)一个指向整型数的指针(A pointer to an integer) / int *a; c)一个指向指针的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer) / int *a; d)一个有10 个整型数的数组(An array of 10 integer) / int a10; e)一个有10 个指针的数组,这些指针指向一个整型数(An array of 10 pointers to integer) / int *a10; f)一个指向有10 个整型数数组的指针(A pointer to an array of 10 integers) / int (*a)10; g)一个指向函数的指针,该函数有一个整型数参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer) / int (*a)(int); h)一个有10 个指针的数组,这些指针指向一个函数,该函数有一个整型数参数并返回整型数(An array of ten pointers to functions that take an integert argument and return an integer) / int (*a10)(int); 26、有三个线程ID 分别为A、B、C,请用多线程编程实现在屏幕上循环打印10 次ABCABC / posix 多线程 #include #include #include pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond = PTHREAD_COND_INITIALIZER; int k = 0; void *routine_A(void *arg) int i; 上嵌教育上海通信协会人才实训基地、华东科研委员会嵌入式人才孵化基地 char ch = (int) arg; pthread_detach(pthread_self(); for (i = 0; i 10; +i) pthread_mutex_lock( while (A = ch printf(%c, ch); fflush(stdout); k = (k + 1)%3; pthread_cond_broadcast( pthread_mutex_unlock( return (void *) 0; void *routine_B(void *arg) int i; char ch = (int) arg; pthread_detach(pthread_self(); for (i = 0; i 10; +i) pthread_mutex_lock( while (B = ch printf(%c, ch); fflush(stdout); k = (k + 1)%3; pthread_cond_broadcast( pthread_mutex_unlock( return (void *) 0; void *routine_C(void *arg) int i; char ch = (int) arg; pthread_detach(pthread_self(); for (i = 0; i 10; +i) pthread_mutex_lock( while (C = ch printf(%c, ch); fflush(stdout); k = (k + 1)%3; pthread_cond_broadcast( 上嵌教育上海通信协会人才实训基地、华东科研委员会嵌入式人才孵化基地 pthread_mutex_unlock( return (void *) 0; int main(void) pthread_t tid; pthread_create( pthread_create( pthread_create( sleep(1); printf(n); return 0; 运行结果(posix): 27、将一个字符串逆序 #include #include #define Swap(p, q) do *p = *q; *q = *p; *p = *q; while (0) int main() char str128; int i, len; printf(input string: ); fgets(str, 128, stdin); for (i = 0, len = strlen(str) - 1; i ch = ch; tail-next = ele; tail = ele; tail-next = NULL; void print_link(const link *h) const link *p = NULL; if (NULL = h) return; p = h-next; while (p != NULL) putchar(p-ch); p = p-next; putchar(n); void reverse_link(link *h) link *prev = NULL, *cur = NULL, *ne = NULL; if (NULL = h) return; prev = h-next; cur = h-next; while (cur != NULL) ne = cur-next; cur-next = prev; prev = cur; cur = ne; h-next-next = NULL; h-next = prev; int main() 上嵌教育上海通信协会人才实训基地、华东科研委员会嵌入式人才孵化基地 link *head = NULL; printf(input to create list: ); create_link_tail( printf(original link is: ); print_link(head); reverse_link(head); printf(after reversed, the link is: ); print_link(head); return 0; 运行结果: 29、计算一个字节里(byte)里面有多少bit 被置1。 #include int main(void) char ch, i, counter = 0; printf(input a char(byte): ); scanf(%c, for (i = 7; i = 0; -i, ch = 1) if (ch printf(%d 1(s) in total.n, counter); return 0; 运行结果: / 0 = 0 x30 = 0011 0000 30、搜索给定的字节(byte)。 / ? nonsence 31、在一个字符串中找到可能的最长子串。 #include #define MAX_STRING 1024 int Strlen(const char *str) if (str) const char *p = str; while (*p != 0) +p; return (p - str); return 0; / end Strlen int main() char strMAX_STRING; int len, maxlen = 0; 上嵌教育上海通信协会人才实训基地、华东科研委员会嵌入式人才孵化基地 char *p_start = NULL, *p_end = NULL, *ptr = NULL, *maxstr_ptr = NULL; printf(input a string with black-char: ); fgets(str, sizeof(str), stdin); strStrlen(str) - 1 = 0; / drop n p_start = p_end = maxstr_ptr = ptr = str; while (*ptr+ != 0) if ( = *ptr | 0 = *ptr) p_end = ptr - 1; if (len = p_end - p_start + 1) maxlen) maxlen = len; maxstr_ptr = p_start; p_start = p_end = ptr + 1; *(maxstr_ptr + maxlen) = 0; printf(max string is: %s, len = %dn, maxstr_ptr, maxlen); return 0; 运行结果: 32、字符串转换为整数 / here is just the function int str2int(const char *str) int res, i; bool bPositive; res = i = 0; if ( = str0) bPositive = FALSE; +i; while (stri != 0) res = (res 1) + (res 3); / res *= 10; res += stri+ 0; if (!bPositive) res = res; return res; /* end str2int */ 运行结果: 33、将整数转换为字符串 / here is just the function Status int2str(int n, char *str) 上嵌教育上海通信协会人才实训基地、华东科研委员会嵌入式人才孵化基地 int j; if (NULL = str) return ERROR; j = 0; if (n =-epsinon stri; +i) 或 for (i = 0; stri != 0; +i) / 我较常见 / 我是少数人 两种写法,孰是孰非? 37、以下为windows nt 下的32 位C+程序,请计算sizeof 的值。 void func(char str100) sizeof(str) = ? / 4,数组名退化为指针 void *p = malloc(100); sizeof(p) = ? / 4,p 是指针,指针只占4 个字节 38、写一个“标准”的宏min,这个宏输入两个参数并返回较小的一个。另外,当你写下面的代码时会发生什 么问题? #define min(a, b) (a) (b) ? (a) : (b) 示例代码如下: min(*p+, b); / 会产生宏的副作用,指针p 做2 次自增 验证例子: #include #define min(a, b) (a) (b) ? (a) : (b) int main() 上嵌教育上海通信协会人才实训基地、华东科研委员会嵌入式人才孵化基地 int a = 3, b = 10, c; c = min(a+, b); printf(a = %d, b = %d, c = %dn, a, b, c); return 0; 运行结果: / a 自增了2 次 39、为什么标准头文件会有如下的结构? #ifndef _MY_CONIO_H #define _MY_CONIO_H / 以上2 句是为防止出现此头文件被多次包含的情况 #ifdef _cplusplus / 若为C+编译器,对于标准C,它也会定义一个宏:_STDC_ extern “C” /为实现c 和c+的混合编程,c+提供与c 连接交换指定符号extern C来解决名字匹配 /问题,函数声明前加上extern c后,则编译器就会按照c 语言的方式将该函数编译为 /_foo,这样c 语言中就可以调用c+的函数了。 #endif /* . */ #ifdef _cplusplus #endif #endif /* _MY_CONIO_H */ 40、编写一个函数,作用是把一个char 组成的字符串循环右移n 个字符。比如原来是“abcdefghi”,如果n = 2, 移位后就应该是“hiabcdefg”。 解法(1): #include #include typedef int Status; #define OK 0 #define ERROR -1 #define MAX_STRING 1024 Status reverse_str(char *p_start, char *p_end) if (NULL = p_start | NULL = p_end) return ERROR; while (p_start p_end) *p_start = *p_end; *p_end = *p_start; *p_start = *p_end; +p_start; -p_end; return OK; Status roll_str(char *str, int n) 上嵌教育上海通信协会人才实训基地、华东科研委员会嵌入式人才孵化基地 int len; if (NULL = str) return ERROR; len = strlen(str); if (n L = 3, 2, 1, 0, 7, 6, 5, 4 3.整个数组逆序 - L = 4,5,6,7,0,1,2,3 这里我们需要现将右移操作等效转换为左移操作。 解法(2): 上嵌教育上海通信协会人才实训基地、华东科研委员会嵌入式人才孵化基地 Status loopmove(char *pstr, int steps) if (NULL = pstr | steps 0) / 撇开花架子,关键是要看以下原理性的内容 if (popSqStack( 上嵌教育上海通信协会人才实训基地、华东科研委员会嵌入式人才孵化基地 else while (!isSqStackEmpty( pushSqStack( if (popSqStack( else usr_cprintf(X ); usr_cprintf(nr); textcolor(LIGHTGRAY); / 恢复到黑底白字状态 /* end SqStackToQueue */ 运行结果: 说明:若对这个库有兴趣,我已把它挂到网上,可down 来看看。 25、对于一个频繁使用的短小函数,在C语言中应用什么实现,在C+中应用什么实现? 答:C中宏,C+中inline。 26、用预处理指令#define声明一个常数,用以表示1年中有多少秒(忽略闰年问题)? 答:这是个老问题,网上流传的答案是 #define SECONDS_PER_YEAR (60*60*24*365)UL 我试了一下,发现不能通过编译 正确的应该是: #define SECONDS_PER_YEAR (365 * 24 * 60 * 60UL) 27、typedef 在C 语言中频繁地用以声明一个已经存在的数据类型的同义字,当然亦可用宏定义来做类似的事情。 例如: #include #define dpChar char * typedef char * tpChar; int main(void) dpChar p1, p2; tpChar p3, p4; printf(sizeof(p1) = %dn, sizeof(p1); printf(sizeof(p2) = %dn, sizeof(p2); printf(sizeof(p3) = %dn, sizeof(p3); printf(sizeof(p4) = %dn, sizeof(p4); return 0; /* end main */ 运行结果: sizeof(p1) = 4 sizeof(p1) = 1 sizeof(p1) = 4 sizeof(p1) = 4 上嵌教育上海通信协会人才实训基地、华东科研委员会嵌入式人才孵化基地 分析:可以看到上述p1,p3,p4 都为指针,而p2 独为字符变量。实际上上述 dpChar p1, p2; 被扩展成 char *p1, p2; 所以p2 当然是字符变量了;而 tpChar p3, p4; 被扩展成 char *p3, *p4; 所以p3, p4 都是指针。 综上所述:若碰到以上情况时,用typedef 显然更好。 28、以下程序输出什么? int main(void) int a5 = 1, 2, 3, 4, 5; int *ptr = (int *) ( / 此时ptr指向a5,越界了 printf(“%d, %d”, *(a+1), *(ptr-1); / ptr1正好指向数组的最后一个元素 return 0; 29、请问以下程序片段有什么错误? int a234, i, j, k; for(k = 0; k 4; +k) for(j = 0; j 3; +j) for(i = 0; i 6”) : puts(“ 6) ? puts(“6”) : puts(“6。 对于后面若b=6,尽管b 被转换为一个很大的数,但再加上6 的话正好溢出,故结果是等于0。 答: 上嵌教育上海通信协会人才实训基地、华东科研委员会嵌入式人才孵化基地 6 =6 36、评价下面的代码片段 unsigned int zero = 0; unsigned int compzero = 0 xffff; 答: 对于一个int 型不是16 位的处理器来说,上面的代码是不正确的。应该编写如下: unsigned int compzero = 0; 37、尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆(heap)中动态分配内存的过程。那么在嵌入 式系统中,动态分配内存可能发生的问题是什么? 答: 内存碎片、碎片收集、变量的持行时间等等。 再来分析以下代码片段输出的是什么? #include #include int main(void) char *ptr = NULL; if (NULL = (ptr = (char *) malloc(0) puts(Got a NULL pointer!); else puts(Got a valid pointer!); return 0; /* end main */ 运行结果: Got a valid pointer! 38、实现二分查找的算法。 int bin_search(int arr, int key, int n) int low, high, mid; if (NULL = arr | n = 0) return 1; low = 0; high = n 1; while (low key) high = mid 1; else if (arrmid key) low = mid + 1; else return mid; return 1; 39、请编写一个C 函数,该函数在给定的内存区域内搜索给定的字符,并返回该字符的位置索引。 int search(const char *source, int n, char ch) if (NULL = source | n = 0) return 1 上嵌教育上海通信协会人才实训基地、华东科研委员会嵌入式人才孵化基地 else int i; for (i = 0; i n +i) ; if (i = n) return 1; return (i + 1); 40、编写一个C 函数,该函数在一个字符串中找到可能的最长子字符串,该字符串由同一字符组成。 int ChildString(char*p) char *q=p; int stringlen=0, i=0,j=1,len=0,maxlen=1; while(*q!=0) /不能用strlen,求得长度stringlen Stringlen+; q+; while( iN2-N3-N4-N5-N2 其中环的开始节点是N5。 提供一个简单的算法:设置两个指针p1,p2。每次循环p1 向前走一步,p2 向前走两步,直到p2 碰到NULL 指针或者两个指针相等结束循环。如果两个指针相等则存在环。 bool isLoop(LinkList *L) LinkList *p1 = NULL, *p2 = NULL; if (NULL = L | NULL = Lnext) 上嵌教育上海通信协会人才实训基地、华东科研委员会嵌入式人才孵化基地 return FALSE; p1 = p2 = L; do p1 = p1next; p2 = p2nextnext; while (p2 return (p1 = p2); /* end isLoop */ 运行结果:第一个测试的是初始的链表,第二个是将首尾元素连接起来的环形链表。 / 尾插法建立链表不存在倒序现象 42、定位链表的中间节点 分析:对于这个问题我们可以借鉴上面的经验,分别定义两个指针指向链头,然后让p1每次向后移动一 次,p2 每次向后移动两次,最后当p2 指向链尾时,p1 正好在中间位置。 中间节点定位算法: LinkList *locateMiddleLinkList(LinkList *L) LinkList *p1 = NULL, *p2 = NULL; if (NULL = L | NULL = Lnext) return NULL; p1 = p2 = L; do p1 = p1next; p2 = p2nextnext; while (p2 re
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 变压器线圈绕制质量检测工艺考核试卷及答案
- 特种气体知识培训课件
- 贵金属轧延抛光工艺考核试卷及答案
- 包装设备环保材料应用工艺考核试卷及答案
- 2025年焊工证考试题库(附答案+解析)
- 丙纶纤维卷绕设备故障预防工艺考核试卷及答案
- 油气井防砂作业自动化改造工艺考核试卷及答案
- 2025年焊工(初级)考试题库及答案
- 毕加索与梵高课件
- 2025年国企财务知识试题及答案
- 2025云南昆明巫家坝建设发展有限责任公司招聘23人笔试备考题库及答案解析
- 2024年山东省节能与双碳促进中心招聘真题
- 热电厂锅炉安全知识培训课件
- 2025年汽车驾驶员技师资格证书考试及考试题库含答案
- 化工防护用品知识培训课件
- 高二奋发+勇攀高峰+课件-2025-2026学年高二上学期开学第一课主题班会
- KTV突发事件安全应急预案
- 中资企业在非洲的安全风险应对策略与启示
- 2025年高考(陕西、山西、青海、宁夏卷)历史真题及答案
- 役前训练考试试题及答案
- 中职中专入学开学第一课正视职业教育开启未来征程课件
评论
0/150
提交评论