1、学校________________班级____________姓名____________考场____________准考证号 …………………………密…………封…………线…………内…………不…………要…………答…………题………………………… 同济大学 《C程序设计与算法基础》2023-2024学年第一学期期末试卷 题号 一 二 三 四 总分 得分 批阅人 一、单选题(本大题共15个小题,每小题1分,共15分.在每小题给出的四个选项中,只有一项是符合题目要求的.) 1、C 语言中的
2、输入输出函数 scanf 和 printf 用于与用户进行交互。假设要从用户输入中读取一个整数和一个浮点数,以下关于输入输出的描述,哪一项是错误的?( ) A. 使用 scanf("%d %f", &num1, &num2); 可以实现 B. 输入的数据格式必须与 scanf 中的格式控制字符串匹配,否则可能导致错误 C. printf 函数可以使用不同的格式控制符来输出各种类型的数据 D. scanf 函数会自动处理输入数据中的空格和换行符 2、在 C 语言中,关于指针和数组的关系是一个复杂但重要的概念。假设我们有一个整型数组 int arr[10]
3、 ,同时有一个整型指针 int *ptr 。以下对于指针和数组关系的描述,哪一项是不准确的?( ) A. 数组名可以看作是一个指向数组首元素的常量指针 B. 可以通过指针来遍历数组的元素,就像通过数组下标一样 C. 对指针进行加减运算时,移动的步长取决于指针所指向的数据类型的大小 D. 数组和指针在内存中的存储方式完全相同,没有任何区别 3、C 语言中的循环结构(如 for 、 while 、 do-while )各有特点。假设有一个循环要执行至少一次,以下哪种循环结构最合适?( ) A. for 循环 B. while 循环 C. do-whil
4、e 循环 D. 都可以 4、在 C 语言中,关于字符串的处理是常见的操作。假设有以下代码: char str1[] = "Hello"; char *str2 = "World"; ,以下关于这两个字符串的描述,正确的是:( ) A. str1 和 str2 在内存中的存储方式相同,都可以通过指针进行修改 B. str1 是字符数组,可以修改其元素的值; str2 是字符串常量,不能修改其内容 C. 数组 str1 的长度是 5,字符串 str2 的长度是 5 D. 可以使用 strcpy(str1, str2); 将 str2 的内容复制到
5、 str1 ,而无需考虑 str1 的空间是否足够 5、C 语言中的联合( union )是一种特殊的数据类型。假设我们有 union Data { int num; float fnum; }; ,并且创建了一个 union Data 类型的变量,以下关于这个联合变量的使用,哪一个是正确的?( ) A. 可以同时存储 int 和 float 类型的值 B. 在同一时间只能存储 int 或 float 类型的值 C. 可以存储多个不同类型的值 D. 以上都不对 6、C 语言中,关于递归函数,假设有以下定义: int factorial(in
6、t n) { if (n == 0 || n == 1) return 1; else return n * factorial(n - 1); } ,那么 factorial(5) 的值是多少?( ) A. 5 B. 15 C. 120 D. 程序会出错 7、C 语言中,对于以下代码: int num = 5; int *ptr1, *ptr2; ptr1 = # ptr2 = ptr1; ,如果通过 *ptr2 将 num 的值修改为 10 ,那么 *ptr1 的值会变成多少?( ) A. 5 B. 10 C. 不确定 D. 程序会出错
7、 8、在 C 语言中,关于函数指针的使用,假设有函数 int add(int a, int b) { return a + b; } ,定义一个函数指针 int (*funcPtr)(int, int) = add; ,通过这个函数指针调用函数,以下哪种方式是正确的?( ) A. funcPtr(2, 3); B. (*funcPtr)(2, 3); C. 以上两种都对 D. 以上两种都不对 9、在 C 语言中,指针数组和数组指针是不同的概念。假设定义了 int *ptr1[5]; 和 int (*ptr2)[5]; ,以下关于它们的描述,哪一项是错误的
8、 ) A. ptr1 是一个指针数组,每个元素都是一个指针 B. ptr2 是一个数组指针,指向一个包含 5 个整数的数组 C. 对 ptr1 和 ptr2 的赋值和使用方式是相同的 D. 可以通过 ptr2 来访问数组中的元素 10、在 C 语言中,关于字符串的比较,假设有 char str1[] = "hello"; char str2[] = "hello"; ,使用 strcmp(str1, str2) 比较的结果是什么?( ) A. 0 B. 1 C. -1 D. 不确定 11、在 C 语言的函数指针使用中,假设我们定义了一
9、个函数指针 int (*func_ptr)(int, int); ,并且有两个函数 int add(int a, int b) { return a + b; } 和 int subtract(int a, int b) { return a - b; } ,如何通过函数指针调用这两个函数?( ) A. 直接使用函数名调用 B. 将函数名赋值给函数指针,然后通过函数指针调用 C. 无法通过函数指针调用 D. 以上都不对 12、C 语言中,关于函数指针,设有以下代码: int (*func_ptr)(int, int); ,以下哪种说法是正确的?( ) A. fu
10、nc_ptr 是一个指向返回值为 int ,有两个 int 类型参数的函数的指针 B. func_ptr 是一个返回值为指针的函数,该指针指向 int 类型 C. func_ptr 是一个 int 类型的指针 D. 以上都不对 13、C 语言中的文件操作是重要的知识点。假设要以只读方式打开一个文本文件 data.txt ,以下哪个函数调用是正确的?( ) A. FILE *fp = fopen("data.txt", "r"); B. FILE *fp = fopen("data.txt", "w"); C. FILE *fp = fo
11、pen("data.txt", "a"); D. FILE *fp = fopen("data.txt", "rb"); 14、若有以下函数调用语句:func((a1, a2), (a3, a4, a5)); 在此函数调用语句中,含有的实参个数是( ) A. 2 B. 3 C. 4 D. 5 15、C 语言中的文件操作是常见的操作之一。假设我们要从一个文本文件中读取数据,并将其存储到一个数组中。文件中的数据每行都是一个整数,以下哪种方式是正确且高效的读取方式?( ) A. 使用 fscanf 函数逐行读取 B. 使用 fgets 函数读取整行,然后进行字符串处
12、理 C. 使用 fread 函数一次性读取整个文件 D. 以上方式都不正确 二、判断题(本大题共15小题,每小题2分,共30分.有多个选项是符合题目要求的.) 1、在 C 语言中,使用位运算符可以对结构体中的联合体(union)类型的成员变量进行操作。( ) 2、 strlen 函数计算字符串长度时不包括字符串结束符 '\0' 。( ) 3、在 C 语言中,函数的参数传递可以是值传递或地址传递,值传递时函数内部对参数的修改不会影响到实参,地址传递时函数内部对参数的修改会影响到实参。( ) 4、在 C 语言中,共用体变量所占的内存空间大小等于其最大成员所占的空间
13、大小。( ) 5、C 语言中的 gets 函数用于从标准输入读取一行字符串,但存在缓冲区溢出的风险。( ) 6、C 语言中的枚举类型中的枚举常量的值可以由用户指定。( ) 7、C 语言中的字符常量是用单引号括起来的单个字符,字符串常量是用双引号括起来的字符序列。( ) 8、在 C 语言中, strcmpi 函数用于不区分大小写地比较两个字符串。( ) 9、在 C 语言中,全局变量的作用域是整个程序,从定义的位置开始到程序结束都可以访问。( ) 10、在 C 语言中, mktime 函数用于将时间结构体转换为时间戳。( ) 11、在 C 语言中,使用 s
14、witch 语句时,default 分支是可选的。( ) 12、在 C 语言中,使用 toupper 函数可以将字符串中的所有小写字母转换为大写字母。( ) 13、在 C 语言中, typedef 定义的新类型名可以增强代码的自解释性。( ) 14、C 语言中的数组名实际上是一个指向数组首元素的指针,通过对数组名进行指针运算,可以方便地访问数组中的各个元素。( ) 15、C 语言中的指针可以指向一个不存在的内存地址,但访问这样的指针会导致程序出错。( ) 三、编程题(本大题共5个小题,共25分) 1、(本题5分)编写一个 C 语言程序,实现将用户输入的两个字符串
15、中的相同字符提取出来,并组成一个新的字符串输出。 2、(本题5分)编写一个 C 语言程序,实现输入一个整数数组和一个整数 k,在数组中查找所有与 k 之和为给定值 m 的元素对,并输出这些元素对的下标。 3、(本题5分)设计一个 C 语言程序,输入一个字符串,判断其是否为有效的电话号码(假设只考虑 11 位数字的情况),如果是则输出“有效”,否则输出“无效”。 4、(本题5分)编写一个 C 语言程序,用户输入一个整数 n,程序打印出 n 层的等腰三角形图案,使用'*'字符。 5、(本题5分)编写一个 C 语言程序,创建一个包含 10 个学生成绩的结构体数组,计算并输出平均成绩。 四、论述题(本大题共3个小题,共30分) 1、(本题10分)假设编写一个C语言程序,实现一个双向链表的删除操作。论述双向链表删除节点的特殊处理。 2、(本题10分)深入论述 C 语言中如何进行指针的有效性检查,分析其重要性。 3、(本题10分)论述 C 语言中如何实现希尔排序算法,解释其特点和适用场景。 第6页,共6页






