C语言作业详解【一】

本文涉及的产品
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: C语言作业详解【一】

✅1. 下面代码执行的结果是:( )
A.1 2 3 4 5 6 7 8 9 10
B.5 5 5 5 5 5 5 5 5 5
C.死循环的打印5
D.0 1 2 3 4 5 6 7 8 9

include <stdio.h>

int main()
{

int i = 0;
for (i = 0; i<10; i++)
{
    if (i = 5)
        printf("%d ", i);
}
return 0;

}
1
2
3
4
5
6
7
8
9
10
11
12
答案:C
解析:if (i = 5)中i = 5 是一次赋值而不是一次判断,所以每次循环 i 都被重新赋值为5,会死循环的打印5

✅ 2.关于if语句说法正确是:( )
A.if语句后面只能跟一条语句
B.if语句中0表示假,1表示真
C.if语句是一种分支语句,可以实现单分支,也可以实现多分支
D.else语句总是和它的对齐的if语句匹配

答案:C
解析:
A:错误,if之后可以跟多条语句,跟多条语句时需要使用{}括起来
B:错误,0表示假,非零表示真,即除了1其它的数字也能表示真
D:不一定,要看具体的代码,如果代码不规范,可能没有对齐,比如:

if()
if()
else
;
1
2
3
4
上述else虽然是和外层if对齐,但是会和内部if进行匹配

✅3.关于switch说法不正确的是:( )
A.switct语句中的default子句可以放在任意位置
B.switch语句中case后的表达式只能是整形常量表达式
C.switch语句中case子句必须在default子句之前
D.switch语句中case表达式不要求顺序

答案:C
解析:

A:正确,可以放在任意位置,但是一般建议最好还是放在最后

B:正确,case语句后一般放整形结果的常量表达式或者枚举类型,枚举类型也可以看成是一个特殊的常量

C:错误,没有规定case必须在default之前,一般case最好放在default之前

define _CRT_SECURE_NO_WARNINGS

include<stdio.h>

int main()
{

int n = 0;
scanf("%d", &n);
switch (n)
{
default:
    printf("0\n");
    break;
case 1:
    printf("1\n");
    break;
case 2:
    printf("2\n");
    break;
}
return 0;

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

我们看到default在case语句前面,但是还是优先匹配case语句,不会因为default语句在前面就先匹配它

D:正确,但一般还是按照次序来

✅4.func(1) = ( )

A.30
B.20
C.16
D.0

int func(int a)
{

int b;
switch (a)
{
    case 1: b = 30;
    case 2: b = 20;
    case 3: b = 16;
    default: b = 0;
}
return b;

}
1
2
3
4
5
6
7
8
9
10
11
12
答案:D
switch的每个case之后如果没有加break语句,当前case执行结束后,会继续执行紧跟case中的语句
func(1)可知,在调用func时形参a的值为1,switch(a)<==>switch(1),case 1被命中,因为该switch语句中所有分支下都没有增加break语句,因此会从上往下顺序执行,最后执行default中语句返回

✅5.switch(c)语句中,c不可以是什么类型( )
A.int
B.long
C.char
D.float

答案:D
解析:
switch语句中表达式的类型只能是:整形和枚举类型
char类型也是属于整型家族的,因为字符在存储的时候存储的是ASCII码值
D选项为浮点类型,不是整型和枚举类型

✅6.下面代码的执行结果是什么( )
A.secondthird
B.hello
C.firstsecond
D.hellothird

include <stdio.h>

int main() {

int x = 3;
int y = 3;
switch (x % 2) {
case 1:
    switch (y)
    {
    case 0:
        printf("first");
    case 1:
        printf("second");
        break;
    default: printf("hello");
    }
case 2:
    printf("third");
}
return 0;

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
答案:D
解析:
switch语句时多分支的选择语句,switch中表达式结果命中那个case,就执行该case子项,如果case子项后没有跟break语句,则继续往下执行
请看以下注解:

include <stdio.h>

int main() {

  int x = 3;
  int y = 3;
  switch (x % 2) {  // x%2的结果为1,因此执行case1
  case 1:
      switch (y)   // y是3,因此会执行case3,而case3不存在,那只能执行default
      {
      case 0:
          printf("first");
      case 1:
          printf("second");
          break;
      default: printf("hello"); // 打印hello,打印完之后,内部switch结束,此时外部case1结束
      }             // 因为外部case1之后没有添加break语句,所以继续执行case2
  case 2:             // 打印third
      printf("third");      // 外部switch结束
  }
  return 0;

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
即:先在内部switch的default位置打印hello,紧接着在外部case2中打印third

✅7.写代码将三个整数数按从大到小输出
例如:
输入:2 3 1
输出:3 2 1

代码演示:

define _CRT_SECURE_NO_WARNINGS

include <stdio.h>

int main()
{

int a = 2;
int b = 3;
int c = 1;
scanf("%d%d%d",&a, &b,&c);
if(a<b)
{
    int tmp = a;
    a = b;
    b = tmp;
}
if(a<c)
{
    int tmp = a;
    a = c;
    c = tmp;
}
if(b<c)
{
    int tmp = b;
    b = c;
    c = tmp;
}
printf("a=%d b=%d c=%d\n", a, b, c);
return 0;

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
✅8.写一个代码打印1-100之间所有3的倍数的数字

代码演示:

define _CRT_SECURE_NO_WARNINGS

include <stdio.h>

int main()
{

int i = 0;
for(i=1; i<=100; i++)
{
    if(i%3==0)
    {
        printf("%d ", i);
    }
}
return 0;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
运行结果:

解题思路:

3的倍数一定能够被3整除,因此i%3==0表达式成立时,则i一定是3的倍数
要输出1~100之间的3的倍数,那只需要从1~100循环100次即可,每次拿到i之后,用i%3==0检测
如果成立:i是3的倍数,输出
如果不成立:i不是3的倍数
✅9.给定两个数,求这两个数的最大公约数
例如:
输入:20 40
输出:20

代码演示:

define _CRT_SECURE_NO_WARNINGS

int main()
{

int a = 18;
int b = 24;
int c = 0;

while(c=a%b)
{
    a = b;
    b = c;
}

printf("%d\n", b);
return 0;

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
最大公约数:即两个数据中公共约数的最大者
求解的方式比较多,暴力穷举、辗转相除法、更相减损法、Stein算法算法

此处主要介绍:辗转相除法
思路:
例子:18和24的最大公约数
第一次:a = 18 b = 24 c = a%b = 18%24 = 18
循环中:a = 24 b=18
第二次:a = 24 b = 18 c = a%b = 24%18 = 6
循环中:a = 18 b = 6
第三次:a = 18 b = 6 c=a%b = 18%6 = 0
循环结束
此时b中的内容即为两个数中的最大公约数

✅10.编写程序数一下 1到 100 的所有整数中出现多少个数字9

代码演示:

define _CRT_SECURE_NO_WARNINGS

include <stdio.h>

int main()
{

int i = 0;
int count = 0;

for(i=1; i<=100; i++)
{
//9 19 29 39 49 59 69 79 89 99
//判断个位上的数是不是9
    if(i%10==9)
        count++;
//90 91 92 93 94 95 96 97 98 99
//判断十位上的数是不是9
    if(i/10==9)
        count++;
}
printf("%d\n", count);
return 0;

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
运行结果:

思路:

给一个循环从1遍历到100,拿到每个数据后进行一下操作
通过%的方式取当前数据的个位,检测个位数据是否为9
如果是,给计数器加1
通过/的方式取当前数据的十位,检测十位数据是否是9,
如果是,给计数器加1
循环一直继续,直到所有的数据检测完,所有9的个数已经统计在count计数中
✅11.计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果

代码演示:

define _CRT_SECURE_NO_WARNINGS

include <stdio.h>

int main()
{

int i = 0;
double sum = 0.0;
int flag = 1;
for(i=1; i<=100; i++)
{
    sum += flag*1.0/i;
    flag = -flag;
}
printf("%lf\n", sum);
return 0;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
运行结果:

思路:

从题目表达式可以分析出
该表达式主要由100项,奇数项为正,偶数项为负
设置一个循环从1~100,给出表达式中的每一项:1.0/i, 注意此处不能使用1,否则结果全部为0
然后使用flag标记控制奇偶项,奇数项为正,偶数项为负
然后将所有的项相加即可
✅12.求10 个整数中最大值

代码演示:

define _CRT_SECURE_NO_WARNINGS

include <stdio.h>

int main()
{

int arr[] = {1,2,3,4,50,6,7,8,9,14};
int i = 0;
int max = arr[0];
for (i = 1; i < 10; i++)
    {
        if (arr[i] > max)
        max = arr[i];
    }
printf("%d\n",max);
return 0;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
运行结果:

思路:

定义一个数组
使用max标记数组中的最大值,采用循环的方式依次获取数组中的每个元素,与max进行比较,如果arr[i]大于 max,更新max标记的最大值,数组遍历结束后,max中保存的即为数组中的最大值
✅13.实现一个函数来交换两个整数的内容

代码演示:

include<stdio.h>

void swap(int a, int b)
{

int temp;
temp = *a;
*a = *b;
*b = temp;

}
void main()
{

int x, y;
printf("请输入两个值:");
scanf("%d %d", &x, &y);
printf("交换前:x=%d,y=%d\n", x, y);
swap(&x, &y);
printf("交换后:x=%d,y=%d\n", x, y);

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
运行结果:

思路:
题目比较简单,此处只需要清楚传值和传指针的区别即可
传值:形参是实参的一份拷贝,函数运行起来后,形参是形参,实参是实参,形参和实参没有任何关联性,改变形参时,不会对实参造成任何影响
传地址:形参是实参地址的一份拷贝,形参指向的实体是实参,对形参解引用后,拿到的内容就是实参,因此对形参解引用之后的内容进行修改,改变的就是实参

相关文章
|
1月前
|
C语言
[日常]C语言作业详解12_17(题型对应知识点)
[日常]C语言作业详解12_17(题型对应知识点)
36 0
|
1月前
|
算法 程序员 编译器
C语言初阶③(函数)知识点+编程作业(递归模拟strlen,pow)
C语言初阶③(函数)知识点+编程作业(递归模拟strlen,pow)
27 0
|
1月前
|
存储 Linux C语言
C语言初阶⑥(操作符详解)编程作业(算数转换)(下)
C语言初阶⑥(操作符详解)编程作业(算数转换)
18 1
|
1月前
|
存储 C语言
C语言初阶④(数组)知识点+编程作业(三子棋,冒泡排序)(下)
C语言初阶④(数组)知识点+编程作业(三子棋,冒泡排序)
24 1
|
1月前
|
存储 C语言 索引
C语言初阶⑥(操作符详解)编程作业(算数转换)(上)
C语言初阶⑥(操作符详解)编程作业(算数转换)
30 0
|
1月前
|
存储 C语言
C语言初阶④(数组)知识点+编程作业(三子棋,冒泡排序)(上)
C语言初阶④(数组)知识点+编程作业(三子棋,冒泡排序)
25 0
|
1月前
|
存储 C语言
C语言进阶---------作业复习
C语言进阶---------作业复习
|
11月前
|
算法 Serverless C语言
C语言假期作业 DAY 08
C语言假期作业 DAY 08
|
1月前
|
机器学习/深度学习 C语言
C语言实训作业(任务三)
C语言实训作业(任务三)
41 1
|
1月前
|
C语言
C语言实训作业(任务二)
C语言实训作业(任务二)
72 0