前言:
本部分是C语言初阶部分题目,一共130题,由易到难,适于初学者学习,非初学者勿看
题目链接:编程语言初学训练营_在线编程+题解_牛客题霸_牛客网 (nowcoder.com)
1.判断字母
题目:
题解1:这里要注意:
<1>用了ch=getchar时一定要用getchar()来处理\n
<2>ch要定义为int类型,因为getchar的返回值为int类型,而不是char类型
#include <stdio.h> int main() { int ch = 0; //多组输入 while ((ch = getchar()) != EOF) { getchar();//处理\n //判断并输出 if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) printf("YES\n"); else printf("NO\n"); } return 0; }
题解2:这里用到了isalpha函数,当字符是字母时,它返回非0的值,不是字母时,返回0
#include <stdio.h> #include<ctype.h> //isalpha函数的头文件 int main() { int ch = 0; while ((ch = getchar()) != EOF) { getchar(); if (isalpha(ch)) printf("YES\n"); else printf("NO\n"); } return 0; }
2.字符圣诞树
题目:
题解:本题主要考查循环嵌套,外层循环控制行数,内层循环控制字符和空格的打印,最后找到内层循环变量和外层循环变量的关系,即可得出答案(注意外层循环每进行一次,就要一次换行)
问题:为啥int j=0不写在代码最前面
答:C语言规定:变量定义在当前代码块的最前面,j这个变量的作用域就是第二个大括号内,所以直接定义在第二个大括号的前面就行,如果写在第二个大括号的外面,j每一次循环都会累加起来,定义在第二个大括号内部可以让j每一次循环都回到0
#include <stdio.h> int main() { //输入一个字符 char ch=0; ch=getchar(); //输出圣诞树 int i=0; //每循环一次,打印一行 //每一行有2部分组成,空格和字符 for(i=0;i<5;i++) { int j=0; //空格 for(j=0;j<4-i;j++) { printf(" "); //4 3 2 1 0 } //字符 for(j=0;j<=i;j++) { printf("%c ",ch); //1 2 3 4 5 } printf("\n"); } return 0; }
3.ASCII码
题目:
题解1:本题要学会如何计算数组元素的个数sz=sizeof(arr)/sizeof(arr[0]) (用整个数组的大小除以数组第一个元素的大小)
#include <stdio.h> int main() { //这里定义要用char类型,因为打印的是字符 char arr[] = { 73,32,99,97,110,32,100,111,32,105,116,33 }; //arr是数组,数组是用下标来访问的 int i=0; //计算数组元素的个数 int sz=sizeof(arr)/sizeof(arr[0]); for ( i = 0; i < sz; i++) { printf("%c", arr[i]); } return 0; }
题解2:直接当作字符串打印,但是要注意的是必须在数组的最后加上0,或者’\0',不然后面会乱码,就会出现以下结果(字符串的结束标志:\0)
int main() { char ch[] = { 73, 32, 99, 97, 110, 32, 100, 111, 32, 105, 116 , 33 ,'\0'}; printf("%s", ch); return 0; }
4.出生日期输入输出
题目:
题解:本题要学会如何按格式输入%md就是m域宽输入数据,%0md就是m域宽输出数据,前面自动补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; }
5.2的n次方计算
题目:
题解:本题要学会移位操作符的使用(移位移的是二进制位,如1的二进制为01,1<<1【整体向左移一位,然后右边自动补0】二进制就是10,十进制也就是2)
结论:左移1位相当于*2,右移一位相当于/2
还有就是整形如何多组输入:while((scanf("%d,&a"))!=EOF)
scanf的返回值就是输入变量的个数,也是整形
#include <stdio.h> int main() { int n = 0; while((scanf("%d", &n))!=EOF) { printf("%d\n",1<<n); } return 0; }
6.按照格式输入并交换输出
题目:
题解1:思路:类比要把一瓶酱油和一瓶醋交换一个瓶子,首先需要第三个瓶子,把酱油放进第三个瓶子,接着醋倒入第二个瓶子,然后把酱油倒入第一个瓶子,这样完成了交换
#include <stdio.h> int main() { int a,b,flag=0; scanf("a=%d,b=%d",&a,&b); //交换 flag=a; a=b; b=flag; //输出 printf("a=%d,b=%d\n",a,b); return 0; }
补充一道笔试题:如果不创建第三个变量如何实现两个数的交换?
题解2:加减法:这种方法有个缺点,如果a,b太大会溢出
#include <stdio.h> int main() { int a,b,flag=0; scanf("a=%d,b=%d",&a,&b); //交换 a=a+b; b=a-b; a=a-b; //输出 printf("a=%d,b=%d\n",a,b); return 0; }
题解3:异或法:推荐用这种方法
^异或操作符:操作数必须是整形(int),作用的是二进制位,相同位置上相同为0,相异为1
如:3的二进制位为011,5的二进制位为101,那么3和5异或的结果为110,对应十进制为6,那么3和5异或的结果就是6
#include <stdio.h> int main() { int a,b,flag=0; scanf("a=%d,b=%d",&a,&b); //交换 a=a^b; b=a^b; a=a^b; //输出 printf("a=%d,b=%d\n",a,b); return 0; }
7.字符转ASCII码
题目:
题解:这题比较简单,但是大家可以记住a的ASCII值为97,A的为65
#include <stdio.h> int main() { char ch = 0; scanf("%c", &ch); //也可以这样写 //ch=getchar(); printf("%d", ch); return 0; }
8.计算表达式的值
题目:
题解:这题非常简单,但是要注意C语言中的乘号是*
#include<stdio.h> int main() { int a=40; int c=212; printf("%d\n",(-8+22)*a-10+c/2); return 0; }
9. 计算带余除法
题目:
题解:这题知道/,%操作符即可做出
#include <stdio.h> int main() { int a=0; int b=0; scanf("%d %d",&a,&b); // / 除法操作符,得到的是商 // % 取余(取模)操作符,得到的是余数 printf("%d %d",a/b,a%b); return 0; }
10.计算体重指数
题目:
题解:本题注意两个点:<1>身高的单位为cm
<2>high不能直接除以100,这样得到的整数,而不是小数,这样就会和正确结果差很大
#include <stdio.h> int main() { //输入 int weight = 0; int high = 0; double BMI = 0; scanf("%d %d", &weight, &high); //计算BMI BMI = (weight / ((high / 100.0) * (high / 100.0))); //输出 printf("%.2lf\n", BMI); }
结语:彼方尚有荣光在,少年不惧岁月长
求求了,来个三连吧。