1 单项选择题(15⼩题,每⼩题2分,共30分)

1.1

 解析:【传值调用】,实参和形参之间传递的是“地址”


1.2

 解析:【优先级】:算术运算符 > 关系运算符  >   赋值运算符   

    【结核性】:赋值运算符(从右至左)   算数运算符和关系运算符(从左至右)

      相当于: ( k > i ) <  j   , ( i < j ) == ( j < k  )   


1.3

解析:指针数组是指数组的每一个元素都是一个指针变量的数组

           相当于: point[2] 一样

此题不合适之处:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6. char *point[] = {"one","two","three","fourth"};
  7. point[2] = point [3];
  8. point[2] += 2;
  9. printf("%s",point[2]++); // 输出的是字符串,不用point[2]++
  10. return 0;
  11. }

例如:


1.4

解析:数组定义时,常量表达式中不允许包含变量


1.5

解析:【函数递归】,相当于 fib (2) + fib (1)


1.6

解析:【do 循环】


1.7


1.8

解析:【数组传参】:传过去的是地址,实参和虚参都改变


1.9

 题目有错!!!

 

解析:【运算优先级】:“ * ”和“ ++ ”  高于 " = ",“ * ”和“ ++ ”优先级相同,结合性:从右往左

    *p1 += *p2++  相当于: *p1 = *p1 + *(p2++)

    *p2 =  p1++ 相当于: *p1 =  (p1++)


1.10

解析:【运算优先级】+ 【结合性】

    i = 3 / 2 + 7 / 2 == 5   相当于: i =  ( ( (3 / 2) + (7 / 2) )  ==  5 )

    j = 45 % 11 + (((7 > 8) ? 15: 14) == 14   相当于:j = (45 % 11) + ((((7 > 8) ? 15: 14) == 14 )


1.11

解析:!x是逻辑非操作,当x为0时,值为真,否则值为假。 在这里x = 8,即!x = 0,故while (!x) 为假,退出循环

例如:


1.12

解析:(i * j) / k + 6 - 15 % k    相当于   ((i * j) / k) + 6 - (15 % k)   :  “+”和“-”  结合性从左向右


1.13

 解析: while()是循环语句。while(expr)表示当逻辑表达式expr为真时,循环运行循环体,直到expr值为假或遇到break语句时退出 

由 316 = 13 * i +  11 * j 得:k 一定得是11的倍数

 例:


1.14

 解析:【字符数组的定义】:

char cc[ ]  = {'1','2','3','4','5'}, 数组长度为5,字符串长度为5

char cc[ ]  =”12345“,数组长度为6,字符串长度为5,自动在字符串结尾加上一个终止符 \0 ,

[strlen()]函数:测试字符串长度,不包括 \0


1.15

解析: 【指针与结构数组】:指向结构 的 指针 要先定义,后赋值

p 指向结构第一个字节,*p 相当于 stu 

  第一种方式:(*p).num    【由于结构成员引用符 "."的优先级比间接运算符 “ *” 高,故必须加括号】

  第二种方式:p->num 

  第二种方式:stu.num     三种方式等价!!!


2 指出程序段中的错误:分析原因并修改。(每题15分,共30分)

2.1

改正后:

  1. int main()
  2. {
  3. char *src = "HELLO,UESTC"; //指向字符串常量的指针
  4. char *dest = NULL;
  5. int len = strlen(src);
  6. dest = (char *)malloc(len + 1);
  7. char *d = dest;
  8. char *s = &src[len - 1];
  9. while ( len-- != 0 )
  10. *d++ = *s--;
  11. *d = '\0';
  12. printf("%s\n", dest); // 使用printf()输出时,%s 表示输出一个字符串,src指向字符串的第一个字符,然后src自动加1
  13. free(dest);
  14. return 0;
  15. }

知识点:

【指向字符串常量的指针】:不是将字符串存放在指针src中,而是将指向字符串的指针赋给指针变量,src指针指向字符串的首地址


2.2

改正后:

  1. int func()
  2. {
       //函数功能:复制字符数组data到array中
  3. char data[50] = "welcome to CHENGDU and UESTC";
  4. char *point;
  5. char array[200]=""; //初始化为空传
  6. int i = 0, length = 0;
  7. point = array;
  8. while (data[length] != '\0') //1处
  9. length++;
  10. for (; i < length; i++)
  11. {
  12. *point = data[i]; //2处
  13. point++;
  14. }
  15. puts(array); //3处
  16. }

3 问答题(共70分)

3.1 C语⾔的单词符号除关键字外,还包括其他哪四类?存储类型关键字是哪4个?(每个1分,共8分)

答:  标识符【只能由字母、常量、下划线、数字组成,且第一个字符必须是字母或者下划线】、运算符、常量和分隔符【空格、制表符、换行符】。
       存储类型关键字:anto、extern、register、static

C语言变量有四种存储类型:

自动型(auto)

外部型(extern)

静态型(static)

寄存器型(register)

3.2 函数中,如何使⽤与局部变量同名的全局变量?(3分)

答:使⽤::(作⽤域区分符)(3分)

如何将一个内部变量或者是在函数后定义的外部变量,在该函数中使用:extern 变量名  (进行引用声明,这时是不分配存储空间的)

3.3 如何使⽤1个表达式将float类型变量f的值四舍五⼊ 转换为long类型的值?(3分)

答:(long)(f + 0.5) (3分)

3.4 参数传递的⽅式分别是什么?(6分)

数组作为函数参数有三种形式:
1. 实参是数组元素;  传(数据)值(2分)
2. 形参是指针,实参是数组; 传地址值(2分)
3. 函数的形参和实参都是数组。 传地址(2分)

3.5 C程序运⾏时,不对数组进⾏越界检查,可能导致什么问题?(5分)

答:编译通过,但可能导致运⾏出错(访问不可访问的存储单元)(3分)或访问和修改
其他⾮数组元素的数据。(2分)

3.6 C语⾔的隐式类型转换发⽣在哪4种情况下?转换规则分别是什么?(6分)

混合运算: 级别低的类型向级别⾼的类型值转换。 1分
将表达式的值赋给变量: 表达式的值向变量类型的值转换。 1分
实参向函数形参传值: 实参的值向形参的值进⾏转换。 2分
函数返回值: 返回值向函数返回类型的值进⾏转换。 2分

3.7 程序⽚段为: (14分)

当程序执⾏进⼊fun函数时,请列出各个数据(包括常量、变量)在内存中对应存储区的名称和数据的存储顺序以及所占⽤的存储空间的字节数。

假设整数占2个字节,字符占2个字节,指针占4个字节;⽽内存按2个字节进⾏编址。存储区名称1分,其他每3个1分

  1. int n = 2018;
  2. void main() {
  3. char * p=”COMPUTER”, *q;
  4. int mm, arr[2018];
  5. char ch2;
  6. ...
  7. fun(mm);
  8. ...
  9. }
  10. void fun(int nn) {
  11. int mm = 10;
  12. static int snum;
  13. ...
  14. }

 

3.8 下⾯的程序的功能是什么?(5分)

  1. void main ()
  2. {
  3. int d, i, j, k, flag1, flag2;
  4. scanf("%d", &d);
  5. for (i = 1; i <= 100; i++)
  6. {
  7. j = i;
  8. flag1 = 0;
        // 该数是否含有 d
  9. while ((j > 0) && (!flag1))
  10. {
  11. k = j % 10;
  12. j = j / 10;
  13. if (k == d)
  14. flag1 = 1;
  15. }
        // 该数的平方是否含有 d
  16. if (flag1)
  17. {
  18. j = i * i;
  19. flag2 = 0;
  20. while ((j > 0) && (!flag2))
  21. {
  22. k = j % 10;
  23. j /= 10;
  24. if (k == d)
  25. flag2 = 1;
  26. }
  27. if(flag2)
  28. printf("%-5d %-5d\n", i, i * i);
  29. }
  30. }
  31. }

功能:输⼊数字d=0~9,找1~100中满⾜条件的数:该数的本⾝及它的平⽅中都含有数字d。

3.9 采⽤Eratasthenes筛选法求2-200之间的素数   

链接:https://www.cnblogs.com/pam-sh/p/12384776.html      请对第6、7、8、9⾏的代码进⾏修改,使得程序执⾏效率得到提⾼。(8分)

  1. void main()
  2. {
  3. int prime[201] = {0}; //用于存储200以内的数是否已筛去
  4. int d, i,k;
  5. for (d = 2; d < 200; d++)
  6. if (prime[d] == 0)
  7. for (k = d + 1; k <= 200; k++)
  8. if (k % d == 0)
                prime[k] = 1;
  9. for (i = 2; i <= 200; i++)
  10. if(prime[i]==0)
  11. printf("%d\t", i);
  12. }
  1. // 改为:
  2. for (d=2; d < sqrt(200); d++)
  3. if (prime[d] == 0)
  4. for (k = 2*d; k<=200; k = k+d) //筛去d的所有倍数
  5. prime[k]=1; 

要点:

为提高筛选效率:

  一个合数n必有一个不大于sqrt(n)的正因子,故一个数若是没有小于sqrt(n)的正因子,则说明它是一个素数

3.10 为提⾼程序执⾏效率,C语⾔除了提供指针、宏定义、位运算、不检查数组下标外,简述C语⾔还采取了其他哪些措施及原因(12分)

参考链接


程序填空(每空2.5分,共50分)

4.1 快排找第K⼩

  1. low = 0; // 该空为填空
  2. high = n - 1; // 该空为填空
  3. do
  4. {
  5. do
  6. {
  7. i = low;
  8. j = high; // 该空为填空
  9. t = a[i]; // 该空为填空
  10. }while(i < j); // 该空为填空
  11. a[i] = t; // 该空为填空
  12. if(i == k)
  13. return t; // 该空为填空
  14. if(i > k)
  15. high = i - 1; // 该空为填空
  16. if(i < k)
  17. low = i + 1; // 该空为填空
  18. }while(low < high);
  19. return a[low]; // 该空为填空

 此题错误!!! 

改正后:还是有错!!!

  1. low = 0;
  2. high = n - 1;
  3. do
  4. {
  5. i = low;
  6. j = high;
  7. t = a[i];
  8. do
  9. {
  10. while (a[j--] > t) ;
  11. while (a[i++] < t) ;
  12. if(i < j) swap(a[j], a[i]);
  13. }while(i < j);
    // 折半查找
  14. if(i == k)
  15. return t;
  16. if(i > k)
  17. high = i - 1;
  18. if(i < k)
  19. low = i + 1;
  20. }while(low < high);
  21. return a[low];

参考:215

4.2 ⼀个包含9个数的⾮降序【升序】数列存储在数组中,现在插⼊⼀个数到合适位置,使序列保持⾮降序(插⼊的数⼤于第⼀个数,⼩于第九个数)。

 

  1. #define N 10
  2.  
  3. void main()
  4. {
  5. int a[N] = {1,2,4,8,16,32,64,128,256};
  6. int m,i,d;
  7. scanf("%d",&d);
    //找到插入点
  8. for(i = 0; i < 9 ; i++) //这里填N-1也行
  9. if( d < a[i] )
  10. {
  11. m = i ; // m记录插入点
  12. break ;
  13. }
    // m之后的往后移
  14. for(i = 8; i >= m; i--) //这里填N-2也行
  15. a[i + 1] = a[i];
    // 插入
  16. a[m] = d;
    // 打印
  17. for(i = 0;i < N;i++)
  18. printf("%d\t",a[i]);
  19. }

补充:把一个整数按从大到小顺序插入到已经排好序的数组中

代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void insert(int a[],int n)
  5. {
  6. int i,s;
  7. // 类似于 “直接查找排序”
  8. for(i = 0; i < 10; i++)
  9. {
  10. // 找插入位置
  11. if(n > a[i])
  12. {
  13. for(s = 9; s >= i; s--)
  14. {
  15. a[s + 1] = a[s]; // 将插入位置后的元素后移
  16. break;
  17. }
  18. }
  19. }
  20. a[i] = n; // 插入数字
  21. } 
  1. void main()
  2. {
  3. int i,j,temp = 0,n,p,q,s,a[10] = {127,3,6,28,54,68,87,105,162,18};
  4.  
  5. //排序(从大到小)
  6. //1.1 冒泡排序 ,从后向前
  7. for(i = 0;i < 9;i++) // n - 1趟
  8. {
  9. for(j = 9;j > i;j--) // n - i 次交换
  10. {
  11. if(a[j] > a[j - 1])
  12. {
  13. temp = a[j - 1];
  14. a[j - 1] = a[j];
  15. a[j] = temp;
  16. }
  17. }
  18. }
  19. //1.2冒泡排序 ,从前向后
  20. for(i = 0;i < 9;i++) // n - 1趟
  21. {
  22. for(j = 0;j < 9 - i ;j++) // n - i 次交换
  23. {
  24. if(a[j] < a[j + 1])
  25. {
  26. temp = a[j + 1];
  27. a[j + 1] = a[j];
  28. a[j] = temp;
  29. }
  30. }
  31. }
  32. // 从大到小输出:
  33. printf("排好序的数:\n");
  34. for(i = 0;i < 10;i++)
  35. {
  36. printf("%d\t",a[i]);
  37. }
  38. printf("\n");
  39.  
  40. // 2、简单选择排序:假设排序表为L[1....n-1],第i趟排序即从L[1....n-1]中选择一个最大的元素与L[i]交换,每趟可以确定一个元素,经过n - 1趟就ok了
  41. for(i = 0; i < 10; i++)
  42. {
  43. p = i;
  44. q = a[i];
  45. for(j = i + 1; j < 10; j++)
  46. {
  47. if(q <a[j])
  48. {
  49. p = j;
  50. q = a[j];
  51. }
  52. }
  53. if(p != i)
  54. {
  55. s = a[i];
  56. a[i] = a[p];
  57. a[p] = s;
  58. }
  59. printf("%d\t",a[i]);
  60. }
  61. printf("\n");
  62.  
  63. printf("请输入数字:\n");
  64. scanf("%d",&n);
  65. insert(a,n);
  66.  
  67. // 插入后从大到小输出:
  68. for(i = 0; i <=10; i++)
  69. {
  70. printf("%d\t",a[i]);
  71. }
  72. printf("\n");
  73.  
  74. }

4.3 凯撒密码

这道题是⼀道加密解密问题,⼤致的意思就是通过主函数输⼊两个字符串,第⼀个字符串作为加密解密的⽬标
字符串,第⼆个字符串通过函数转换为整型数据作为解密加密的key,这道题也不难推导,以上是我在⽹络上找到
的⼀个相似版本。
凯撒加密(Caesarcipher)是⼀种简单的消息编码⽅式:它根据字母表将消息中的每个字母移动常量位k。
举个例⼦如果k等于3,则在编码后的消息中,每个字母都会向前移动3位:
a会被替换为d;b会被替换成e;依此类推。字母表末尾将回卷到字母表开头。
于是,w会被替换为z,x会被替换为a。

代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main ()
  5. {
  6. char small_letter[26] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
  7. 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
  8. };
  9. char big_letter[26] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
  10. 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
  11. };
  12. char text[1000], result[1000];
  13. int c, count = 0, k, p,i;
  14. char function;
  15. printf("Insert Text:");
  16. c = getchar();
  17. while (1) // 读取字符串
  18. {
  19. if (c == '\n')
  20. break;
  21. text[count] = c;
  22. printf("%c", text[count]);
  23. count++;
  24. c = getchar(); //读取下一个字符
  25. }
  26. printf("\n");
  27. printf("Encrypt or Decrypt? E or D :");
  28. scanf("%c", &function);
  29. // 解密
  30. if (function == 'D')
  31. {
  32. printf("Insert Key :" );
  33. scanf("%d", &k);
  34. for (i = 0; i < count; i++)
  35. {
  36. if (text[i] >= 'A' && text[i] <= 'Z')
  37. {
  38. result[i] = big_letter[((text[i] - 'A') + k) % 26]; // 向后挪k位
  39. }
  40. //找出加密后字符在字符数组里的对应位置
  41. else if (text[i] >= 'a' && text[i] <= 'z')
  42. {
  43. result[i] = small_letter[((text[i] - 'a') + k) % 26]; // 向后挪k位
  44. }
  45. else
  46. result[i] = text[i];
  47. printf("%c", result[i]);
  48. }
  49. }
  50. // 加密
  51. else
  52. {
  53. printf("Insert Key :" );
  54. scanf("%d", &k);
  55. for (i = 0; i < count; i++)
  56. {
  57. if (text[i] >= 'A' && text[i] <= 'Z')
  58. {
  59. p = ((text[i] - 'A') - k);
  60. // 解码涉及 字母表末尾将回卷到字母表开头
  61. while (p < 0)
  62. p += 26;
  63. result[i] = big_letter[p]; // 向前挪k位
  64. }
  65. //找出解密后字符在字符数组⾥里里的对应位置
  66. //这里要注意不要让它超出范围(下表位置为负数)
  67. else if (text[i] >= 'a' && text[i] <= 'z')
  68. {
  69. p = ((text[i] - 'a') - k);
  70. while (p < 0)
  71. p += 26;
  72. result[i] = small_letter[p]; // 向前挪k位
  73. }
  74. else
  75. result[i] = text[i];
  76. printf("%c", result[i]);
  77. }
  78. printf("\n");
  79. }
  80. return 0;
  81. }

5 程序设计(共20分) 

5.1 输⼊若⼲个整数(以0结束)如何逆序构建双向链表

代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //双链表结构定义
  4. typedef struct DNode
  5. {
  6. int data;
  7. struct DNode *pre;
  8. struct DNode *next;
  9. } DNode;
  10.  
  11. int main()
  12. {
  13. DNode *head, *s;
  14. int t;
  15. // 定义头节点
  16. head = (DNode*)malloc(sizeof(DNode));
  17. head->pre = NULL;
  18. head->next = NULL;
  19. // 输入
  20. scanf("%d", &t);
  21. while (t != 0)
  22. {
  23. s = (DNode*)malloc(sizeof(DNode));
  24. s->data = t;
  25. s->next = NULL;
  26. s->pre = NULL;
  27. if (head->next == NULL)
  28. {
  29. head->next = s;
  30. s->pre = head;
  31. }
  32. else
  33. { // 头插法【逆序】
  34. s->next = head->next;
  35. head->next->pre = s;
  36. head->next = s;
  37. s->pre = head;
  38. }
  39. scanf("%d", &t);
  40. }
  41. s = head->next;
  42. while (s)
  43. {
  44. printf("%d ", s->data);
  45. s = s->next;
  46. }
  47. return 0;
  48. }

2018 C笔试题的更多相关文章

  1. 1~n的全排列--阅文集团2018校招笔试题

    题目大意:给定整数n,求出1~n的全排列 示例 输入:n=3 输出:[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1] import java.util.S ...

  2. 华为2018软件岗笔试题之第一题python求解分享

    闲来无事,突然看到博客园首页上有人写了篇了华为2018软件岗笔试题解题思路和源代码分享.看了下题目,感觉第一题能做出来,就想着用刚刚学的python试着写一下,花费的时间有点长~~,看来又好长时间没练 ...

  3. 2018春招-今日头条笔试题-第四题(python)

    题目描述:2018春招-今日头条笔试题5题(后附大佬答案-c++版) #-*- coding:utf-8 -*- class Magic: ''' a:用于存储数组a b:用于存储数组b num:用于 ...

  4. 2018春招-今日头条笔试题-第三题(python)

    题目描述:2018春招-今日头条笔试题5题(后附大佬答案-c++版) 解题思路: 本题的做法最重要的应该是如何拼出‘1234567890’,对于输入表达试获得对应的结果利用python内置函数eval ...

  5. 2018春招-今日头条笔试题-第二题(python)

    题目描述:2018春招-今日头条笔试题5题(后附大佬答案-c++版) 解题思路: 利用深度优先搜索 #-*- coding:utf-8 -*- class DFS: ''' num:用于存储最后执行次 ...

  6. 2018春招-今日头条笔试题-第一题(python)

    题目描述:2018春招-今日头条笔试题5题(后附大佬答案-c++版) 解题思路: 要想得到输入的数字列中存在相隔为k的数,可以将输入的数字加上k,然后判断其在不在输入的数字列中即可. #-*- cod ...

  7. python面试笔试题汇总

    Python面试攻略(嗨谈篇) 110道python面试笔试题汇总,你能答对几道? Python 面试问答 Top 25 2018 年最常见的 Python 面试题 & 答案

  8. Hive 笔试题

    Hive 笔试题 考试时间: 姓名:____________ 考试成绩:____________ 考试时长:180 分钟 注意事项: 1. 自主答题,不能参考任何除本试卷外的其它资料. 2. 总成绩共 ...

  9. 对Thoughtworks的有趣笔试题实践

    记得2014年在网上看到Thoughtworks的一道笔试题,当时觉得挺有意思,但是没动手去写.这几天又在网上看到了,于是我抽了一点时间写了下,我把程序运行的结果跟网上的答案对了一下,应该是对的,但是 ...

随机推荐

  1. 使用java获取手机号归属地等信息httpClient实现

    java获取手机号归属地 一般想获取手机号归属地等信息个人是无法获取的,但是可以通过调用第三方接口获取,具体百度搜索很多这里例子提供一个淘宝的接口 ,该功能已经发布到网站作为一个在线小工具,拿走不谢: ...

  2. android打飞机游戏、MVP句子迷App、悬浮窗、RxJava+Retrofit、加载动画、定制计划App等源码

    Android精选源码 微信打飞机 android进度设置加载效果源码 Android新手引导库EasyGuide MVP-好看又好用的句子迷客户端 XFloatView 一个简易的悬浮窗实现方案 a ...

  3. Notes_STL_List_And_Map

    //Description: 使用STL遇到的问题 //Create Date: 2019-07-08 09:19:15 //Author: channy Notes_STL_List_And_Map ...

  4. mui弹出输入法遮住input表单元素

    转自https://www.cnblogs.com/devilyouwei/p/6293190.html mui弹出输入法遮住input表单元素   问题如下:当我用mui开发app时,在mui-sc ...

  5. python学习笔记(22)-os文件操作模块

    疑问: 如果打开操作一个文件,是用绝对路径好还是相对路径好? os模块,在lib下面,可以直接引入的,直接使用import. 一.新建一个目录,新建一个文件夹 import os #新建一个文件夹 o ...

  6. php获取mysql大小

      查看指定数据库大小:  SELECT sum(DATA_LENGTH)+sum(INDEX_LENGTH) FROM information_schema.TABLES where    TABL ...

  7. C语言数据转换

    1.在我们编码的时候可能一个表达式中的数字类型是不同的,所以我们的首要的工作就是要把它们转换成相同的类型,然后在进行计算.这个转换的过程就就做隐式类型转换,完全由计算机完成. 2.隐式类型转换有一定的 ...

  8. Docker Dockerfile基本配置

    1.dockerfile介绍 Dockerfile是Docker用来构建镜像的文本文件,包含自定义的指令和格式.可以通过docker build命令从Dockerfile中构建镜像.这个过程与传统分布 ...

  9. Spring+Mybais整合

    简单的来说,Spring主要用于在业务层(当然spring也有数据库交互的模块,个人觉得spring在这方面有一点不如mybatis),而mybatis主要用于数据持久化,在一个完整的项目中无论是业务 ...

  10. HttpClient学习笔记

    HttpClient相关的实体类官方文档地址:http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/ 使用HttpClien ...