大家好,我是深鱼~
目录
前言:
本部分是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);
}
结语:彼方尚有荣光在,少年不惧岁月长
求求了,来个三连吧。