前言
本篇博客和大家分享一些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语言的知识,不断提高编程能力。最后,希望本篇博客的内容可以为大家带来帮助,谢谢!