c初阶检测题(下)

简介: c初阶检测题(下)

16.以下 C 程序的输出结果是(A)

#include <stdio.h>
#include <stdlib.h>
int a = 1;
void test(){
 int a = 2;
 a += 1;
}
int main(){
 test();
 printf("%d\n", a);
 return 0;
 }

A. 1

B. 2

C. 3

D. 4

test()函数内的常量无法在该函数范围外使用,所以打印出的a是1。

17.下列描述中正确的是(C)

A. 表示m>n为true或者m<n为true的表达式为m>n&&m<n

B. switch语句结构中必须有default语句

C. 如果至少有一个操作数为true,则包含“||”运算符的表达式true

D. if语句结构中必须有else语句

这道题很明显选C,就不再过多解释

18.C 语言规定,在一个源程序中,main函数的位置(C)

A. 必须在最开始

B. 必须在系统调用的库函数的后面

C. 可以任意

D. 必须在最后

很明显答案是C

19.以下叙述不正确的是(D)

A. 一个C源程序可由一个或多个函数组成

B. 一个C源程序必须包含一个main函数

C. C程序的基本组成单位是函数

D. 在C程序中,注释说明只能位于一条语句的后面

很明显选择D

20.以下叙述正确的是(C)

A. 在C程序中,main函数必须位于程序的最前面

B. C程序的每行中只能写一条语句

C. C语言本身没有输入输出语句

D. 在对一个C程序进行编译的过程中,可发现注释中的拼写错误

21.在上下文及头文件均正常的情况下,执行如下代码, c 的值是(C)

int a = 0, c = 0;
do{
 --c;
 a = a-1;
}while(a > 0);

A. 0

B. 1

C. -1

D. 死循环

很明显c的值是-1,不过多解释了。

22.假定 x 和 y 为 double 型,则执行 x=2; y=x+3/2; 后y的值为(D)

A. 3.500000

B. 3

C. 2.000000

D. 3.000000

double类型确实可以存储浮点型数据,但是别忘了c语言中整形数字相除默认舍弃余数。

23.以下for循环的执行次数是(C)

for(int x = 0, y = 0; (y = 123) && (x < 4); x++);

A. 是无限循环

B. 循环次数不定

C. 4次

D. 3次

注意看for循环的条件中是给y赋值为123,而不是判断123,所以能进行四次循环

24.若有定义语句:int year=1009,*p=&year;以下不能使变量 year 中的值增至 1010 的语句是(D)

A. *p+=1;

B. (*p)++;

C. ++(*p)

D. *p++

可以理解为解引用,p此时代表year值的地址,也就是1009这个数字的地址,那么ABC都可以,D选项则是p这个地址加1,之后解引用,不太理解也可以看调试过程

执行
p++前p的地址是0x006ffc04储存的值则是1009,p-1地址则是比p的地址少4

执行完后可以看到原本属于p地址的0x006ffc04变成了p-1的地址,相信大家这次明白了吧。

25.选择表达式 11|10 的结果(本题数值均为十进制)(A)

A. 11

B. 10

C. 8

D. 2

按位或是二进制上,只要有一个为1,那么就为1,11的二进制是:1011,10的二进制是1010,所以为1011,即11。

26char a; int b; float c; double d;

则表达式 a*b+d-c 值的类型为(D)

A. float

B. int

C. char

D. double

首先字符型和整形相乘变成整形,之后加双精度浮点型减去浮点型还为双精度浮点型,故选D

编程题

1.求最小公倍数:

题目描述:正整数 a 和正整数 b 的最小公倍数,是指能被 a 和 b 整除的最小的正整数。请你求 a 和 b 的最小公倍数。

比如输入5和7,5和7的最小公倍数是35,则需要返回35。

输入描述:输入两个正整数。

输出描述:输出最小公倍数。

法一:

#include<stdio.h>
int main()
{
  int a, b = 0;
  scanf("%d %d", &a, &b);
  int c = ((a > b) ? a : b);
  while (1)
  {
    if ((c % a == 0 && c % b == 0 ))
    {
      break;
    }
    c++;
  }
  printf("a和b的最小公倍数是:");
  printf("%d", c);
  return 0;
}

首先输入a和b,然后设置公倍数c为a和b的较大值,之后在死循环中c++,如果符合c能整除a和b说明为最小公倍数,跳出死循环即可,但这种方法在ACM编译器会超出时间限制,我们看另一种方法。

法二:

#include <stdio.h>
int main()
{
  int a = 0;
  int b = 0;
  scanf("%d %d", &a, &b);
  int i = 0;
  for (i = 1;; i++)
  {
    if (a * i % b == 0)
    {
      printf("%d\n", a * i);
      break;
    }
  }
  return 0;
}

相对于法一循环次数过多,法二先为一个数的整数倍,之后判断是不是另一个数的整数倍,是跳出循环即可。

2.题目描述:将一句话的单词进行倒置,标点不倒置。比如 “I like beijing.”,经过处理后变为:“beijing. like I”。

字符串长度不超过100。

输入描述:输入一个仅包含小写字母、空格、‘.’ 的字符串,长度不超过100。

‘.’ 只出现在最后一个单词的末尾。

输出描述:依次输出倒置之后的字符串,以空格分割。

法一:

#include<stdio.h>
void resever(char* pc)
{
  char str[100][100] = {0};
  int i = 0;
  int j = 0;
  while (*pc != '\0')//pc为\0停止循环
  {
    while (*pc != ' '&&*pc!='\0')//进入赋值单词循环
    {
      str[i][j] = *pc;//pc所指向的内容赋值给第i行第j个元素
      j++;//继续赋值第i行的元素
      pc++;//同上
    }
    i++;//第一个单词赋值完毕,进入下一行
    j = 0;//下一行把j进行归0,从0开始赋值
    if (*pc != '\0')//如果到最后一个单词,再pc++的话就会跳过\0,指向位置地址
    {
      pc++;//跳过空格
    }
  }
  for ( i = i-1; i >= 0; i--)//赋值完毕会发现i此时指向下一行,所以进行-1操作倒着打印二维数组
  {
    printf("%s ", str[i]);
  }
}
int main()
{
  char str[100] = {0};
  gets(str);
  resever(str);
  return 0;
}

这里我们首先把str传给resever,之后在里面设置一个二维数组,把一个单词当作一个字符串的一维数组放到二维数组里面,之后倒着打印即可,具体解释看注释即可。

法二:

#include<stdio.h>
void resever(char* left, char* right)//反转函数
{
  while (left<right)
  {
    char temp = *left;
    *left = *right;
    *right = temp;
    left++;
    right--;
  }
}
int main()
{
  char str[100] = { 0 };
  gets(str);
  int len = strlen(str);
  resever(str, str+len-1);//先将整个字符串反转
  char* cur = str;
  char* left;
  char* right;
  while (*cur)//反转单词循环
  {
    left = cur;//先将首单词地址赋给left
    while (*cur != ' ' && *cur != '\0')//如果cur指向的不是空格和\0,则进入循环
    {
      cur++;//cur++
    }
    right = cur-1;//此时为空格或\0跳出循环,-1,则是空格或者\0前一个单词字母地址
    resever(left, right);//反转单词
    if (*cur != '\0')//若此时为\0,在进行cur++操作,则会跳出该英文句子
    {
      cur++;//cur++,跳过空格,指向下一个单词首字母
    }
  }
  printf("%s", str);
  return 0;
}

第二个方法则是先对整个字符串反转,之后再将每个单词反正即可。具体解释看注释。

今天就分享到这里谢谢大家。

目录
相关文章
|
11月前
|
机器学习/深度学习 自然语言处理 搜索推荐
深度学习中的多头注意力机制及其应用探索
深度学习中的多头注意力机制及其应用探索
711 2
|
12月前
|
JavaScript 前端开发 索引
探索JavaScript数组:基础
探索JavaScript数组:基础
80 3
|
Web App开发 开发工具 数据库
0031Java程序设计-基于B2C的网上拍卖系统—秒杀与竞价毕业设计论文
0031Java程序设计-基于B2C的网上拍卖系统—秒杀与竞价毕业设计论文
194 0
|
缓存 监控 前端开发
函数计算操作报错合集之tagger插件报错error一般是什么导致的
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
198 1
|
Linux 开发工具 数据安全/隐私保护
【Linux】git操作 - gitee
【Linux】git操作 - gitee
126 1
【Linux】git操作 - gitee
|
传感器 敏捷开发 自动驾驶
|
存储 算法 Java
深入探索Java中的数组操作:从基础到高级的技巧与应用
深入探索Java中的数组操作:从基础到高级的技巧与应用
245 0
|
存储 消息中间件 缓存
操作系统面试总结
进程是资源分配的基本单位,线程是 CPU 调度的基本单位。进程拥有独立的地址空间,线程是共享内存地址的。进程切换的开销比线程要大。
257 0
操作系统面试总结
|
算法
蓝桥杯-开灯游戏(算法提高)
蓝桥杯-开灯游戏(算法提高)
|
SQL 关系型数据库 数据库
有Mysql数据库的情况下为什么要用Hive?
最近接到公司的一个需求,要求使用Hive做数据查询。当时第一反应就是What?Hive是什么鬼?一脸懵逼状。(请原谅一个刚开始实习的Java实习生见识短浅)然后发现了hive的一些问题。下面简单介绍一下Hive
9562 0