C语言练习题解析(4)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: C语言练习题解析(4)

🎈前言:

  • 本专栏每篇练习将包括 5个选择题 + 2个编程题,将涵盖C语言的不同方面,包括基础语法、数据类型、控制结构、数组、指针和函数等。通过练习,你将逐步掌握C语言的基础知识和常见问题,提高你的编程技巧和解决问题的能力。
  • 我希望这个博客能够为你提供有价值的练习资源,让你在实践中不断进步。同时,我们也鼓励你在练习过程中进行思考和创新,尝试使用不同的编程方法和技巧。
  • 让我们一起挑战C语言练习题,攻克每一个难点,不断提升自己的编程技能!在评论区分享你的练习心得和问题,与我们一起交流和成长。

🌴选择题

  1. 设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是( )

A: n=0;while(ch=getchar()!=‘\n’)n++;

B: n=0;while(getchar()!=‘\n’)n++;

C: for(n=0;getchar()!=‘\n’;n++);

D: n=0;for(ch=getchar();ch!=‘\n’;n++);

🔎正确答案:D

【解析】:

对于for循环,其中 第一项初始化表达式只执行一次 ,因此D选项中 ch 只从输入流中取一个字符,之后就再不会取字符,因此会死循环。

  1. 运行以下程序后,如果从键盘上输入 65 14<回车> ,则输出结果为( )
int main()
{
  int m, n;
  printf("Enter m,n;");
  scanf("%d%d", &m, &n);
  while (m != n) //1
  {
    while (m > n) m = m - n; //2
    while (n > m) n = n - m; //3
  }
  printf("m=%d\n", m);
  return 0;
}

A: 3   B: 2   C: 1   D: 0

🔎正确答案:C

【解析】:

此题技巧是耐心,考查while循环和循环嵌套的理解,初值m=65,n=14循环1判断m!=n为真,来到循环2判断m>n为真,执行m=m-n;直到m=9,n=14循环2结束来到循环3判断n>m为真,执行n=n-m;直到m=9,n=5循环3结束回到循环1,如此往复直到m==n时,循环结束。

  1. 若运行以下程序时,从键盘输入 ADescriptor<回车> ,则下面程序的运行结果是( )
#include <stdio.h>
int main()
{
  char c;
  int v0 = 0, v1 = 0, v2 = 0;
    do
    {
      switch (c = getchar()) //ADescriptor<回车>
      {
      case'a':case'A':
      case'e':case'E':
      case'i':case'I':
      case'o':case'O':
      case'u':case'U':v1 += 1;
      default:v0 += 1; v2 += 1;
      }
    } while (c != '\n');
    printf("v0=%d,v1=%d,v2=%d\n", v0, v1, v2);
    return 0;
}

A: v0=7,v1=4,v2=7   B: v0=8,v1=4,V2=8   C: v0=11,v1=4,v2=11   D:v0=12,v1=4,v2=12

🔎正确答案:D

【解析】:

代码switch语句中没有break,则每次找到入口进入后,顺序执行到代码块结束为止。例如当c'A'时,从case 'A'进入,先后执行v1+=1;v0+=1;v2+=1;,而当c'p'时,从default进入,先后执行v0+=1;v2+=1;,容易看出最终v0v2是相等的。

  1. 如下函数是求两个int数字最大公约数的,指出其中存在的问题【多选】( )
int gcd(char x, char y)
{
  int min = x < y ? x : y;
  for (min = 0; min > 0; min--)
    if (x% min = 0 && y % min = 0)
      return min;
}

A: 参数类型不对B: 循环变量min初值不对C: 判断等于的符号不对   D: 返回类型不对

🔎正确答案:ABC

【解析】:

  1. 函数实参是int,形参用char不对,会发生截断丢失数据;
  2. minfor循环开始时更新为0,不再是两个形参中的较小值;
  3. 判断是否整除的时候误将==写成=赋值运算符;
  4. 函数最终要返回一个int值,返回值类型没问题,但是这里要强调一个选项中没写出的问题,如果是牛客网上的题,会报编译错误,说该函数不是在所有情况下都有返回值,只有在if条件成立的情况下有返回值,一般在vs上这种情况能通过,编译器会给一个默认的返回值。
  1. 执行下面的程序段,语句3的执行次数为( )
for (i = 0; i <= n - 1; i++) // (1)
  for (j = n; j > i; j--) // (2)
       state; // (3)

A: n(n+2)/2   B: (n-1)(n+2)/2   C: n(n+1)/2   D: (n-1)(n+2)

🔎正确答案:C

【解析】:

外循环有n次,当i=0,内循环为n次,当i=1,内循环为n-1次,当i=2时,内循环为n-2次,以此类推,总次数为n+(n-1)+(n-2)+......+2+1,就是个等差数列,等于n(n+1)/2


🌴编程题

📌错误的集合

【力扣链接:645. 错误的集合

【题目信息】:

【答案解析】:

  • 使用标记的方式就可以找出重复的数字,数组中出现过哪个数字就把对应数字作为下标在对应位置 1 ,表示已经标记出现过,如果哪个数据对应位已经置 1 ,则表示就是重复的数字。有了重复的数字,拿 [1, n] 的总和减去去掉重复数据的数组总和就是丢失的数据。
  • 其实使用标记法时出现的数字对应位每次 ++ ,则最后出现 0 次的就是丢失,出现 2 次的就是重复的,这样的方式也可以,不过需要多次遍历。
int* findErrorNums(int* nums, int numsSize, int* returnSize) 
{
  *returnSize = 2;
  //遍历nums数组,将其中数据对应的位置1, 哪一位如果已经重置过则意味着数据重复了
  int* arr = (int*)calloc(numsSize + 1, sizeof(int));//申请numsSize+1个整形空间,并初始化为0
  int* ret = (int*)calloc(*returnSize, sizeof(int));//申请2个整形空间,并初始化为0
  int cur_sum = 0, old_sum = 0;
  for (int i = 0; i < numsSize; i++) 
  {
    if (arr[nums[i]] == 1) //这个数字在上边数组的对应位置已经置过1了,则重复
    { 
      ret[0] = nums[i]; //找到重复的数字
    }
    arr[nums[i]] = 1; //将标记数组的对应数据位置1
    old_sum += i + 1; // 1~n的求和
    cur_sum += nums[i]; //当前数组中的数据求和(多了一个重复的,少了一个丢失的)
  }
  ret[1] = old_sum - (cur_sum - ret[0]);//原始总和,减去去掉重复后的当前总和就是丢失的数字
  free(arr); //释放内存
  return ret;
}

【拓展】:calloc 函数

下面的实例演示了 calloc() 函数的用法。

#include <stdio.h>
#include <stdlib.h>
int main()
{
  int i, n;
  int* a;
  printf("要输入的元素个数:");
  scanf("%d", &n);
  a = (int*)calloc(n, sizeof(int));
  printf("输入 %d 个数字:\n", n);
  for (i = 0; i < n; i++)
  {
    scanf("%d", &a[i]);
  }
  printf("输入的数字为:");
  for (i = 0; i < n; i++) 
  {
    printf("%d ", a[i]);
  }
  printf("\n");
  free(a);  // 释放内存
  return(0);
}

运行结果:

要输入的元素个数:3
输入 3 个数字:
22
55
14
输入的数字为:22 55 14


📌密码检查

【牛客网链接:OR141 密码检查

【题目信息】:

【答案解析】:

  • 这道题只需要将字符串从头到尾的每种字符(大写字符小写字符数字其他字符)分别统计出来后。然后逐个判断是否符合条件即可。而条件的判断包含有:
  1. 字符串密码长度不小于8
  2. 不能以数字开头
  3. 只能包含字母和数字
  4. 大小写和数字字符必须具备两种以上
#include <stdio.h>
#include <string.h>
int main()
{
  int n;
  while (~scanf("%d", &n)) //多组输入
  {
    for (int i = 0; i < n; i++) 
    {
      char password[101] = { 0 };
      int upper = 0, lower = 0, digit = 0, other = 0;
      scanf("%s", password);//捕捉输入的密码
      if ( ( strlen(password) < 8 ) || (password[0] >= '0' && password[0] <= '9')) //密码长度小于8 or 密码以数字开头
      {
        printf("NO\n");
        continue; //直接跳出本次循环,执行下一次循环
      }
      char* ptr = password;
      while (*ptr != '\0') //统计各种字符个数
      { 
        if (*ptr >= 'a' && *ptr <= 'z') lower++; //统计小写字母的个数
        else if (*ptr >= 'A' && *ptr <= 'Z') upper++; //统计大写字母的个数
        else if (*ptr >= '0' && *ptr <= '9') digit++; //统计数字的个数
        else other++; //统计其他字符的个数
        ptr++; 
      }
      if (other > 0) // 有其他字符(注意:密码只能由数字和字母组成)
      { 
        printf("NO\n");
        continue; //直接跳出本次循环,执行下一次循环
      }
      //大写,小写,数字,必须具有两种以上,而比较运算真则1,假则0
      if ((upper > 0) + (lower > 0) + (digit > 0) < 2) // 密码只有一种字符
      { 
        printf("NO\n");
        continue; //直接跳出本次循环,执行下一次循环
      }
      printf("YES\n");
    }
  }
  return 0;
}

🔥今天的内容就到这里了,有什么问题的话欢迎大家在评论区讨论,也可以私信博主为你解答,如果觉得博主的文章还不错的话, 请👍三连支持一下博主哦🤞

目录
相关文章
|
5天前
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
52 14
|
2月前
|
程序员 编译器 数据处理
【C语言】深度解析:动态内存管理的机制与实践
【C语言】深度解析:动态内存管理的机制与实践
|
2月前
|
Serverless 编译器 C语言
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
|
4月前
|
程序员 C语言
位操作在C语言中的解析与应用
位操作在C语言中的解析与应用
95 0
|
5月前
|
存储 C语言
C语言中static关键字的作用与用法解析
C语言中static关键字的作用与用法解析
|
6月前
|
C语言
C语言实现猜数字游戏:代码详解与函数解析
C语言实现猜数字游戏:代码详解与函数解析
266 0
|
2月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
37 3
|
9天前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
34 6
|
26天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
31 6
|
2月前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
44 10

推荐镜像

更多