✅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;
}

答案: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
;

上述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;
}

C语言作业详解【一】_c语言

我们看到​​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;
}

答案: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;
}

答案: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;
}

即:先在内部​​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;
}

✅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;
}

运行结果:

C语言作业详解【一】_c语言_02

解题思路:

  1. 3的倍数一定能够被3整除,因此i%3==0表达式成立时,则i一定是3的倍数
  2. 要输出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;
}

最大公约数:即两个数据中公共约数的最大者
求解的方式比较多,暴力穷举、辗转相除法、更相减损法、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;
}

运行结果:

C语言作业详解【一】_经验分享_03

思路:

  1. 给一个循环从1遍历到100,拿到每个数据后进行一下操作
  2. 通过%的方式取当前数据的个位,检测个位数据是否为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;
}

运行结果:

C语言作业详解【一】_#include_04

思路:

  1. 从题目表达式可以分析出
    该表达式主要由100项,奇数项为正,偶数项为负
  2. 设置一个循环从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;
}

运行结果:

C语言作业详解【一】_#include_05

思路:

  1. 定义一个数组
  2. 使用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);

}

运行结果:

C语言作业详解【一】_#include_06

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