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

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

在这里插入图片描述

我们看到defaultcase语句前面,但是还是优先匹配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;
  }

即:先在内部switchdefault位置打印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;
}

运行结果:
在这里插入图片描述

解题思路:

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

运行结果:
在这里插入图片描述

思路:

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

运行结果:
在这里插入图片描述

思路:

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

运行结果:
在这里插入图片描述

思路:

  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);

}

运行结果:
在这里插入图片描述

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

🎉🎉🎉
➡️➡️➡️
求三连❗️❗️❗️

  • 28
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 30
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YoLo♪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值