2023深圳技术大学OJ平台C语言实验课实验六 A,C,D,E题

        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正负后才能赋值

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值