C语言刷题小记1

前言

本篇博客和大家分享一些C语言的OJ题目,希望大家可以通过这些题目进一步提升自己的编程能力,如果你对本篇内容感兴趣,可以一键三连,多多关注,下面进入正文部分。

题目1 十六进制转十进制

描述
BoBo写了一个十六进制整数ABCDEF,他问KiKi对应的十进制整数是多少。

输入描述:

输出描述:
十六进制整数ABCDEF对应的十进制整数,所占域宽为15。
备注:
printf可以使用使用格式控制串“%md”输出域宽为m的十进制整数。

分析:本题考察进制的转换,首先我们需要知道,不同的进制只是数字的不同表现形式,具体的关于进制的知识,如果读者存在疑问,可以看我之前发表的“C语言操作符”这篇文章,那里我介绍了关于进制详细的内容;再回到这道题,当了解了进制的知识后,本题就会变得很简单,我们知道十六进制的数字前面是需要加上0x的,所以根据题目要求,本题的代码也应运而生了,大家请看下面的代码。

#include<stdio.h>
int main()
{
	printf("%15d\n", 0xABCDEF);
	return 0;
}

大家可以看到,上面的代码可以很好地实现题目的结果,希望大家理解。

题目2 printf的返回值 

描述
KiKi写了一个输出“Hello world!”的程序,BoBo老师告诉他printf函数有返回值,你能帮他写个程序输出printf(“Hello world!”)的返回值吗?
输入描述:

输出描述:
包括两行:
第一行为“Hello world!”
第二行为printf(“Hello world!”)调用后的返回值。

分析:本题考察printf函数的返回值,这里大家需要知道printf的返回值是什么,printf函数返回的是打印在屏幕上的字符个数,它的返回类型是int,所以知道了这一点,本题的代码就可以写出来了。

#include<stdio.h>
int main()
{
	int ret = printf("Hello world!");
	printf("\n");
	printf("%d", ret);
	return 0;
}

这里大家还要注意一下,有的同学会在第一行打印代码的最后加上“\n”来实现换行的效果,但是这样是错误的,因为一旦加上“\n”,相当于多加了一个字符,那么返回值就会变成13,所以我们需要另起一行来实现换行的效果。

说完第二题,这里还想请大家来看这么一段代码;

#include<stdio.h>
int main()
{
	printf("%d", printf("%d", printf("%d", 43)));
	return 0;
}

大家猜猜这段代码的运行结果是什么?

这里就在考察printf函数的返回值,这段代码是从里往外进行分析的,首先最里面的printf打印43,返回值就是2,那么第二个printf就打印2,返回值就是1,那么最外层的printf就打印1,所以最终的结果就是4321。

这道题作为拓展,帮助大家更好地理解printf的返回值。 

题目3 判断字母

描述
从键盘任意输入一个字符,编程判断是否是字母(包括大小写)。
输入描述:
多组输入,每行输入包括一个字符。
输出描述:
输出该字符是字母(YES)或不是(NO)。

示例

输入

H

9

输出

YES

NO

分析:本题要求我们判断字母,并且是需要进行多组输入的,所以我们需要用到getchar函数和while循环,大家先来看代码。

#include<stdio.h>
int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
	{
		if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
		{
			printf("YES\n");
		}
		
		else
		{
			printf("NO\n");
		}
		getchar();
	}
	return 0;
}

大家仔细观察代码,getchar函数的返回值是int(字符的ASCII值),所以我们需要先创建一个整型变量去接受getchar函数的返回值,下面我们写while循环,注意循环的停止条件,这是一个比较固定的写法,大家可以记住它,在循环体中我们进行判断,这里怎么判断相信大家没有问题,需要强调的是判断完成后,我们要让getchar函数再运行一次,目的是为了处理掉"\n"。

大家看到,上面的代码可以完成字母的判断;

下面关于本题,还有另一种解法,其实和第一个差不多,只是在判断字母那里,我们可以使用一个函数来进行判断,这个函数叫做“isalpha”,它是专门用来判断字母的,它需要包含在<ctype.h>这个头文件中。所以上面的代码可以改成如下代码;

#include<stdio.h>
#include<ctype.h>
int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
	{
		if (isalpha(ch))
		{
			printf("YES\n");
		}

		else
		{
			printf("NO\n");
		}
		getchar();
	}
	return 0;
}

 大家可以看到,改完后可以实现同样的效果,有了这个函数,我们就不需要去写出具体的判断方法了,直接交给库函数处理,就可以得到我们想要的结果。

题目4 ASCII码

描述

BoBo教KiKi字符常量或字符变量表示的字符在内存中以ASCII码形式存储。BoBo出了一个问题给KiKi,转换以下ASCII码为对应字符并输出他们。

73, 32, 99, 97, 110, 32, 100, 111, 32, 105, 116 , 33

输入描述:

输出描述:

一行输出转换题目中给出的所有ASCII码对应的字符,无需以空格隔开。

分析:本题考察的内容比较简单,要求我们打印出ASCII值对应的字符,我们可以直接去打印,如下代码;

#include<stdio.h>
int main()
{
	printf("%c%c%c%c%c%c%c%c%c%c%c%c", 73, 32, 99, 97, 110, 32, 100, 111, 32, 105, 116, 33);
	return 0;
}

大家可以看到,我们成功地打印出了一句话;那么这个代码就是可行的,就是看起来有点奇怪和麻烦,尤其是有12个%c,这里相信有人不想一个一个敲,那么我们就可以通过循环来解决这个问题,大家再来看下面的代码;

#include<stdio.h>
int main()
{
	char arr[12] = { 73, 32, 99, 97, 110, 32, 100, 111, 32, 105, 116, 33 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%c", arr[i]);
	}
	return 0;
}

大家可以看到,这样写也可以完成任务,而且代码看起来更高级一些;当然,第一种方法也是正确的,两种方法希望大家都可以掌握。

题目5 出生日期输入输出

描述

输入一个人的出生日期(包括年月日),将该生日中的年、月、日分别输出。

数据范围:年份满足 1990≤�≤2015 1990≤y≤2015 ,月份满足 1≤y≤12 1≤m≤12  ,日满足1≤d≤30

输入描述:

输入只有一行,出生日期,包括年月日,年月日之间的数字没有分隔符。

输出描述:

三行,第一行为出生年份,第二行为出生月份,第三行为出生日期。输出时如果月份或天数为1位数,需要在1位数前面补0

分析: 本题让我们去输入输出出生年月日,重点在于对格式的控制;

#include<stdio.h>
int main()
{
	int year = 0;
	int month = 0;
	int date = 0;
	scanf("%4d%2d%2d", &year, &month, &date);
	printf("year=%4d\n", year);
	printf("month=%02d\n", month);
	printf("date=%02d\n", date);
	return 0;
}

题目6 2的n次方计算

描述

不使用累计乘法的基础上,通过移位运算(<<)实现2的n次方的计算。

数据范围: 0≤n≤31 

输入描述:

一行输入整数n(0 <= n < 31)。

输出描述:

输出对应的2的n次方的结果。

分析:本题要求我们实现2的n次方的运算,并且不能使用累乘;题目提示我们用移位操作符来进行处理,那么我们需要知道移位操作符的功能,移位操作符可以按照2的次幂改变数据,那么我们就可以写出代码了。

#include<stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	int b = 1 << a;
	printf("%d", b);
	return 0;
}

大家来看代码,因为我们计算的2的n次方,所以我们要从1开始计算,这样就可以得到想要的结果。

这道题还可以拓展一下,如果我们想实现多组输入 ,那么代码该怎么写呢?大家可以参考下面的代码;

#include<stdio.h>
int main()
{
	int a = 0;
	while (scanf("%d", &a) != EOF)
	{
		int b = 1 << a;
		printf("%d", b);
	}
	return 0;
}

大家可以发现,这与前面那道多组输入的写法很相似,使用了while循环,大家要注意循环的终止条件的写法,可以类比前面那道题,当我们想要终止循环时,我们要在控制面板上输入CTRL+Z。

题目7 计算三角形的周长和面积

描述

根据给出的三角形3条边a, b, c,计算三角形的周长和面积。

数据范围:0<a,b,c≤100000 

输入描述:

一行,三角形3条边(能构成三角形),中间用一个空格隔开。

输出描述:

一行,三角形周长和面积(保留两位小数),中间用一个空格隔开,输出具体格式详见输出样例。

分析:本题要求我们来计算给定三边的三角形的周长和面积,那么我们需要注意,这里输入输出都有可能出现浮点数,所以我们统一用double类型的变量进行定义,求面积的时候需要用到海伦公式,这个公式大家应该都学过,如果不了解,可以自己去查一下,下面我们来看具体代码。

#include<stdio.h>
#include<math.h>
int main()
{
	double a = 0.0;
	double b = 0.0;
	double c = 0.0;
	scanf("%lf %lf %lf", &a, &b, &c);
	double circumference = 0.0;
	double area = 0.0;
	circumference = a + b + c;
	double p = circumference / 2;
	area = sqrt(p * (p - a) * (p - b) * (p - c));
	printf("circumference=%.2lf area=%.2lf", circumference, area);
	return 0;
}

大家观察上面的代码,我统一使用了double类型去定义了每个变量,在输入输出的时候要用到%lf,这个点大家要注意;其次,大家知道海伦公式中有开平方的操作,这里为大家介绍一个函数——sqrt函数,它是专门用来计算开方的,它需要接受一个double类型的参数,要使用这个函数,我们需要引入<math.h>这个头文件。最后,我们要注意题目要求,保留两位小数,所以我们打印的格式为“%.2lf“,大家在做这道题的时候一定要注意细节。

总结

本篇博客为大家介绍了几道C语言的OJ题目,希望大家可以通过这些题目巩固C语言的知识,不断提高编程能力。最后,希望本篇博客的内容可以为大家带来帮助,谢谢!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值