111
因为找不到c的标签就只能投c++了
c已经到落幕的时候了吗(哭)
【id:11】【20分】A. 实验3-4 统计字符[2]
这题需要了解一些ASCII码的知识。我们输入的字符或者数字在计算机里会转换成ASCll码
可以发现从a到z,A到Z,ASCII码都是逐步增加的。所以判断输入类型的关键点就在于判断其在ASCII中的位置
#include <stdio.h>
int main() {
int n, letter = 0, blank = 0, digit = 0, other = 0;
char m;
scanf("%d", &n);
getchar();//注意这个!!!如果这里不加这个把换行符吞掉的话你的换行就会被下面的吃掉!!
for (; n > 0; n--) {
m = getchar();
//变量不需要加单引号,程序会自动把他变成ascii码比较
//a,z,A,Z加引号是为了让程序知道他们是字符类型,知道是什么类型才能转换成相应的ASCll码
if ('a' <= m && m <= 'z' || 'A' <= m && m <= 'Z') {//要注意ASCII中z到A并不连续,所以要分开讨论
letter++;
} else if (m == ' ' || m == '\n') {
blank++;
} else if ('0' <= m && m <= '9') {
digit++;
} else {
other++;
}
}
printf("letter = %d, blank = %d, digit = %d, other = %d", letter, blank, digit, other);
return 0;
}
注意第7行的getchar()!!如果这里不加这个把换行符吞掉的话你的换行就会被下面的吃掉!!造成你的结果blank永远多一个,而你输入的最后一个字符永远统计不到
【id:10】【20分】C. 实验3-5 查询水果价格
要注意这里的输入不是输入一个换行输入下一个,而是一起输入,数字间以空格间隔。
#include <stdio.h>
int main() {
printf("[1] apple\n[2] pear\n[3] orange\n[4] grape\n[0] exit\n");
int n = 5;//定义n是为了限制循环次数
int a = 1;//提前赋予a值,防止随机赋值为0使第七行a条件还没开始就不满足
for (; n > 0 && a != 0; n--) {//每执行一次循环n减少1
scanf("%d", &a);
if (n < 5 && n >= 1 && a != 0) {//设置换行条件
printf("\n");
}
switch (a) {
case 1:
printf("price = 3.00");
break;
case 2:
printf("price = 2.50");
break;
case 3:
printf("price = 4.10");
break;
case 4:
printf("price = 10.20");
break;
case 0:
break;
default:
printf("price = 0.00");
break;
}
}
return 0;
}
特别注意第9行不能使用getchar()!!在样例检查中有一项中间给的数字是-1,如果用getchar()的话就会吃到“-”号,造成错误(他真的好坏!!)
【id:56】【20分】D. 距离年底有多少天
这个其实不难,但是他要求一定要用switch……不用switch不知道你们有没有什么特别妙的想法
知识点是switch的case如果不加break的话会自动到下一行的case情况,下面的方案就是用了这一特性
唯一要注意的就是2月最多只有29天,平时只有28天,这里需要套用A题来判断是否是闰年
#include <stdio.h>
int ryear(int y) { //判断是否闰年
int a = 28;//a代表2月天数
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) {
a = 29;
}
return a;
}
int main() {
int year, month, day, t = 0;//t为天数
scanf("%d %d %d", &year, &month, &day);
int a = ryear(year);
switch (month) {//题目规定要用switch
case 1:
t += 31;
case 2:
t += a;
case 3:
t += 31;
case 4:
t += 30;
case 5:
t += 31;
case 6:
t += 30;
case 7:
t += 31;
case 8:
t += 31;
case 9:
t += 30;
case 10:
t += 31;
case 11:
t += 30;
case 12:
t += 31;
break;
}
printf("%d", t - day);//t减去那一个月已经过了的天数就是总的剩下的天数
return 0;
}
【id:420】【20分】E. 实验3-11 求一元二次方程的根
这一题有几个点要注意,一是如何设置条件才能让代码更轻快简介;二是在a==0但是b*c!==0的情况下一元一次方程要单独拿出来解,不能直接套用求根公式;三是在复数形势下如果不判断复数是正还是负的情况下输出容易出现--几i或+-几i的情况出现
这是我一开始写的代码,主要是判断判别式正负来分条件的,但是看了别人先判断a的情况来做条件好像会更好
我写的好乱……
#include <stdio.h>
#include <math.h>
int main() {
double a, b, c;
scanf("%lf %lf %lf", &a, &b, &c);//ax^2+bx+c=0
double temp1 = pow(b, 2) - 4 * a * c, x1, x2;//一元二次方程根判别式
if (a == 0 && b == 0 && c == 0) {//特殊情况1判断
printf("Zero Equation");
} else if (a == 0 && b == 0) {
printf("Not An Equation");
} else if (a == 0) {
printf("%.2lf", -c / b);
} else {
if (temp1 == 0) {//Δ=0
x1 = -b / (2 * a);
printf("%.2lf", x1);
} else if (temp1 > 0) {//Δ>0
double delta = pow(temp1, 0.5);
x1 = (-b + derta) / (2 * a);
x2 = (-b - derta) / (2 * a);
printf("%.2lf\n%.2lf", x1, x2);
} else {//Δ<0
double delta = pow(-temp1, 0.5);//这里temp1因为要开根号所以必须正数
x1 = -b / (2 * a);
x2 = -delta / (2 * a);
if (x2 < 0) {
printf("%.2lf+%.2lfi\n%.2lf%.2lfi", x1, -x2, x1, x2);//这里如果x2负的话不做处理就会变成--或+-
} else {
printf("%.2lf+%.2lfi\n%.2lf-%.2lfi", x1, x2, x1, x2);
}
}
}
return 0;
}
还有一个值得注意的点,为什么我的delta没有在temp1后立刻定义赋值,是因为pow(x,y)如果y是分数而x为负数的话会报错,所以只有在确定x正负后才能赋值