前言:
今天是更新刷题篇的第四天,虽然题目不是很难,但是希望我们能够怀着空杯心态来看这篇文章,静下心来,还是能学到很多新的知识,加油!!!
1.计算平均成绩
题目:
题解:本题要注意最后一行是sum/5.0,5必须要学成小数,或者把sum定义为double类型
#include <stdio.h> int main() { //输入 int i=0; int num=0; int sum=0; for(i=0;i<5;i++) { scanf("%d",&num); sum+=num; } //计算并输出 printf("%.1lf",sum/5.0); return 0; }
2.进制A+B
题目:
题解:
%x是16进制的数据格式
%o是8进制的数据格式
#include <stdio.h> int main() { int a,b=0; scanf("%x %o",&a,&b); printf("%d\n",a+b); return 0; }
3. 网购
题目:
题解:本题我们应该学会不断简化代码,本题就是一次一次简化的结果,这个过程就跟数学中的合并同类项一样
flag表示是否有优惠劵,直接-50*flag这样就十分的简洁
要注意的就是price小于0的情况,就需要直接打印0.00
#include<stdio.h> int main() { double m,price = 0;//m表示原价 int month, day, flag = 0;//flag表示是否有优惠价 //输入 scanf("%lf %d %d %d", &m, &month, &day, &flag); //计算 if (month == 11 && day == 11) price = 0.7 * m - flag * 50; else if (month == 12 && day == 12) price = 0.8 * m - flag * 50; //输出 if (price <= 0) printf("0.00"); else printf("%.2lf", price); return 0; }
4.争夺前五名
题目:
题解:本题要学会冒泡排序
冒泡排序的思想:两两相邻的元素进行比较,并且有可能的话,需要交换(嵌套循环)
首先就是9进行第一趟冒泡排序
9 8 7 6 5 4 3 2 1 0
8 9 7 6 5 4 3 2 1 0
8 7 9 6 5 4 3 2 1 0
...
8 7 6 5 4 3 2 1 0 9 //这就是一趟冒泡排序
接着就是8进行下一趟冒泡排序,一共就有n-1趟,n为数字的个数
然后本题的思路就是先输入成绩,然后从大到小进行冒泡排序,最后打印前五个
#include <stdio.h> int main() { //输入 int n,tmp=0;//n是个数 int arr[50]={0};//存放成绩 scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&arr[i]); } //冒泡排序 for(int j=0;j<n-1;j++)//趟数 { //一趟冒泡排序要进行多少对元素的比较 for(int i=0;i<n-1-j;i++) { if(arr[i]<arr[i+1]) { tmp=arr[i]; arr[i]=arr[i+1]; arr[i+1]=tmp; } } } //输出 for(int i=0;i<5;i++) { printf("%d ",arr[i]); } return 0; }
题解2:使用qsort函数直接进行排序
qsort库函数可以自动排序,但是这个函数要输入4个参数,而且使用前要引头文件#include<stdlib.h>
voidqsort(void*base,size_tnum,size_twidth,int(__cdecl*compare)(constvoid*elem1,constvoid*elem2));
qsort(被排序数组的初始位置,要排序的数组的元素个数,一个元素所占字节,比较函数)
重点是最后一个参数,比较函数:
如果要升序(elem1<elem2),则return<0,就要return elem1-elem2
如果要降序(elem1>elem2),则return>0,就要return elem2-elem1
#include <stdio.h> #include<stdlib.h> int cmp_int(const void*e1,const void*e2)//这个函数的写法也要学会 { return *(int *)e2-*(int *)e1; } int main() { //输入 int n,tmp=0;//n是个数 int arr[50]={0};//存放成绩 scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&arr[i]); } qsort(arr, n, 4, cmp_int); //输出 for(int i=0;i<5;i++) { printf("%d ",arr[i]); } return 0; }
5.竞选社长
题目:
题解1:本题思路:gets()直接输入字符数组,然后开始遍历buf数组,统计A和B的个数
本题要学会gets()直接输入字符串
注意:使用 gets() 时,系统会将最后“敲”的换行符从缓冲区中取出来,然后丢弃,所以缓冲区中不会遗留\n
#include <stdio.h> int main() { char buf[100]={0}; //输入 gets(buf); //统计 int count_a=0; int count_b=0; int i=0; while(buf[i]!='0') { if(buf[i]=='A') count_a++; if(buf[i]=='B') count_b++; i++; } if(count_a>count_b) printf("A"); else if(count_a==count_b) printf("E"); else printf("B"); return 0; }
题解2:只用一个变量flag,是A就加1,是B就减1,最后看flag是大于小于还是等于0
#include <stdio.h> int main() { char buf[100]={0}; //输入 gets(buf); //统计 int flag=0; int i=0; while(buf[i]!='0') { if(buf[i]=='A') flag++; if(buf[i]=='B') flag--; i++; } if(flag>0) printf("A"); else if(flag==0) printf("E"); else printf("B"); return 0; }
题解3:另一种方式输入字符串(ch=getchar())!='0')
#include <stdio.h> int main() { int flag=0; char ch=0; while(((ch=getchar())!='0')&&ch!=EOF) { if(ch=='A') flag++; else if(ch=='B') flag--; } if(flag>0) printf("A"); else if(flag==0) printf("E"); else printf("B"); return 0; }
6. 完美成绩
题目:
题解:在这里我们看一下多组输入的另一种方法:
while(~scanf("%d",&a)) 意思还是等于EOF结束
~是C语言中的一个操作符-按位取反
EOF代表是-1 (整形在内存中存储的是补码)
10000000000000000000000000000001 原码
1111111111111111111111111111111111110 反码
1111111111111111111111111111111111111 补码 这个也就代表着-1(也就是EOF)
那么~EOF也就是00000000000000000000000000000000也就是0,0为假,不进入循环
#include <stdio.h> int main() { int n=0; while(~scanf("%d",&n)) //while((scanf("%d",&n))!=EOF)也可以这样写 { if(n>=90) printf("Perfect\n"); } return 0; }
7.最高分数
题目:
题解1:思路:三个数找出最大的一个只需要比较两次
这里用到了条件操作符exp1?exp2:exp3
解释:满足条件1则输出值为exp2,不满足条件1则输出值为exp3
#include <stdio.h> int main() { int n1=0; int n2=0; int n3=0; while(~scanf("%d%d%d",&n1,&n2,&n3)); { int max=n1>n2?n1:n2; max=max>n3?max:n3; printf("%d",max); } return 0; }
题解2:这种做法的思路:输入完比较,首先让第一个数为最大值,然后从第二个数开始进行比较,如果第二个数大,就让第二个数为最大值,以此类推,max与第三个数进行比较
#include <stdio.h> int main() { int num[3]={0}; while(~scanf("%d %d %d",&num[0],&num[1],&num[2])); { int max=num[0]; int i=0; for(i=1;i<3;i++) { if(num[i]>max) max=num[i]; } printf("%d",max); } return 0; }
题解3:直接定义max为INT_MIN,温馨提示:在使用INT_MIN之前要声明:#include<limits.h>
#include<limits.h> int main() { int max = INT_MIN; int num = 0; for (int i = 1; i <= 3; i++) { scanf("%d", &num); if (num > max) max = num; } printf("%d", num); return 0; }
8.判断是元音还是辅音
题目:
题解1:思路:先把元音放入一个字符数组中,然后输入字母,遍历数组看有没有一样的,有就直接输出Vowel并加上break(跳出整个循环),如果i=10(走完整个循环)还是没有,直接输出Consonant
#include <stdio.h> int main() { char ch=0; char vowel[]="AaEeIiOoUu"; while((ch=getchar())!=EOF) { getchar();//处理\n int i=0; for( i=0;i<10;i++) { if(vowel[i]==ch) { printf("Vowel\n"); break; } } if(i==10) printf("Consonant\n"); } return 0; }
题解2:这里介绍strchr函数来找字母
strchr函数是用来判断ch是否在字符串中vowel出现
如果出现了,则返回在vowel字符串中的地址
如果没出现,则返回NULL(空指针)
着这个函数要引头文件#include<string.h>
#include <stdio.h> #include<string.h> int main() { char ch=0; char vowel[]="AaEeIiOoUu"; while((ch=getchar())!=EOF) { getchar();//处理\n if(strchr(vowel,ch)) { printf("Vowel\n"); } else { printf("Consonant\n"); } } return 0; }
题解3:while(scanf(" %c",&ch)!=EOF)这样输入也可以
注意如果在%c前面加上一个空格,会消除掉前面所有的空白字符,然后读取一个字符,这样的好处就是不用再加一句getchar()来吸收\n
或者:while(scanf("%c\n",&ch)!=EOF)加上一个\n
#include <stdio.h> #include<string.h> int main() { char ch=0; char vowel[]="AaEeIiOoUu"; while(scanf(" %c",&ch)!=EOF) { if(strchr(vowel,ch)) { printf("Vowel\n"); } else { printf("Consonant\n"); } } return 0; }
9.字母大小写转换
题目:
题解1:正常版:要知道一个结论就是大写字母和小写字母ASCII值差了32(A的ASCII的值为65,a的ASCII值为72)
#include <stdio.h> int main() { char ch='0'; while((scanf("%c",&ch))!=EOF) { if(ch>='a'&&ch<='z') ch-=32; else if(ch>='A'&&ch<='Z') ch+=32; getchar(); printf("%c\n",ch); } return 0; }
题解2:这里介绍四个函数
isupper(ch):判断一个字母是不是大写字母
islower(ch):判断一个字母是不是小写字母
toupper(ch):把一个小写字母转换为大写
tolower(ch):把一个大写字母转换为小写
这些函数都要引头文件:#include<ctype.h>
#include <stdio.h> #include<ctype.h> int main() { char ch=0; while(~scanf(" %c",&ch)) { if(isupper(ch)) { printf("%c\n",tolower(ch)); } else if(islower(ch)) { printf("%c\n",toupper(ch)); } } return 0; }
10.三角形判断
题目:
题解:构成三角形的条件:任意两条边之和大于第三边(所以三种情况都要写)
思路:是三角形进一步判断是什么三角形,不是三角形直接输出不是;如果是三角形,再三条边相等,就是等边三角形(注意==是双目操作符,不能写三个变量相等,而要写为a==b&&b==c)
然后如果不是等边,则可能是两条边相等,这时不用写第三天边不等,因为如果第三天边相等,第一个判断语句就直接输出了,最后就是else普通三角形
#include <stdio.h> int main() { int a,b,c=0; while(~scanf("%d %d %d",&a,&b,&c)) { if(a+b>c&&a+c>b&&b+c>a) { if(a==b&&b==c) printf("Equilateral triangle!\n"); else if (a==b||a==c||b==c) printf("Isosceles triangle!\n"); else printf("Ordinary triangle!\n"); } else printf("Not a triangle!\n"); } return 0; }
总结:
1.%x是16进制的数据格式 %o是8进制的数据格式
2.要学会不断精简自己的代码,而不是写出来了就行了,严格要求自己eg:flag表示是否有优惠劵,直接-50*flag,这样就非常简洁
3.冒泡排序的思想:两两相邻的元素进行比较,并且有可能的话,需要交换(嵌套循环)外层循环代表趟数,内层循环代表一趟冒泡排序中要进行多少元素的比较
4.qsort函数:排序函数
头文件:#include<stdlib.h>
参数:qsort(被排序数组的初始位置,要排序的数组的元素个数,一个元素所占字节,比较函数)
升序:return<0 即return elem1-elem2
降序:return>0即return elem2-elem1
自定义指针函数的写法:
int cmp_int(const void*e1,const void*e2) { return *(int *)e2-*(int *)e1; }
5.gets()直接输入字符串:缓冲区中不会遗留\n
6.普通变量的多组输入:while(~scanf("%d",&a))
字符的多组输入:while(~scanf("%c\n",&ch))这样就不要写getchar()来吸收\n
7.条件操作符exp1?exp2:exp3(满足条件1则输出值为exp2,不满足条件1则输出值为exp3)
8.strchr函数是用来判断字符是否在字符串中出现
如果出现了,则返回在字符串中的地址
如果没出现,则返回NULL(空指针)
着这个函数要引头文件#include<string.h>
9.大写字母和小写字母ASCII值差了32(A的ASCII的值为65,a的ASCII值为72)
10.判断大小写和转换大小写字母的函数
isupper(ch):判断一个字母是不是大写字母
islower(ch):判断一个字母是不是小写字母
toupper(ch):把一个小写字母转换为大写
tolower(ch):把一个大写字母转换为小写
这些函数都要引头文件:#include<ctype.h>
11.注意==是双目操作符,不能写三个变量相等,而要写为a==b&&b==c
结语: 彼方尚有荣光在,少年不惧岁月长
感觉笔者写的还可以,或者自己有些许收获的时候,麻烦铁汁们动动小手,给俺来个一键三连,万分感谢!