2016年江苏大学885代码题(含答案)

一、前言

提示:以下是博主自己写的代码,仅供参考,欢迎有兴趣的朋友们留言讨论呀

二、正文

1.第一题

在这里插入图片描述

#include<stdio.h>
#include<math.h>
#include<stdlib.h>

FILE* fp1, * fp2;

// 计算结果,并写入文件
void F(double a, double b, double c);

void main()
{
	double a, b, c;
	// 打开文件Coefficient.txt
	if (!(fp1 = fopen("Coefficient.txt", "r")))
	{
		printf("cannot open the file C!\n");
		exit(0);
	}
	// 打开或创建文件result.txt
	if (!(fp2 = fopen("result.txt", "a+")))
	{
		printf("cannot open the file R!\n");
		exit(0);
	}
	while (!feof(fp1))
	{
		fscanf(fp1, "%lf%lf%lf", &a, &b, &c);
		F(a, b, c);
	}
	// 关闭文件Coefficient.txt
	if (fclose(fp1))
	{
		printf("cannot close C!\n");
	}
	// 关闭文件result.txt
	if (fclose(fp2))
	{
		printf("cannot close R!\n");
	}
}

void F(double a, double b, double c)
{
	double d = b * b - 4 * a * c;
	fprintf(fp2, "a=%.2lf,b=%.2lf,c=%.2lf,result=", a, b, c);
	if (a == 0 && b == 0 && c == 0)
	{
		fprintf(fp2, "无穷多解\n");
	}
	if (a == 0 && b == 0 && c != 0)
	{
		fprintf(fp2, "无解\n");
	}
	if (a == 0 && b != 0)
	{
		fprintf(fp2, "1个实解:%.2lf\n", -c / b);
	}
	if (a != 0)
	{
		if (d > 0)
		{
			fprintf(fp2, "2个实解:%.2lf和%.2lf\n", (-b + sqrt(d)) / (2 * a), (-b - sqrt(d)) / (2 * a));
		}
		if (d == 0)
		{
			fprintf(fp2, "1个实解:%.2lf\n", -b / (2 * a));
		}
		if (d < 0)
		{
			fprintf(fp2, "2个虚解:%.2lf+%.2lfi,%.2lf-%.2lfi\n", -b / (2 * a), sqrt(-d) / (2 * a), -b / (2 * a), sqrt(-d) / (2 * a));
		}
	}
}

运行结果示例:
在这里插入图片描述
在这里插入图片描述
在网上找了个在线一元二次方程计算器进行验算
在这里插入图片描述
在这里插入图片描述
手写版:

2. 第二题

在这里插入图片描述

#include<stdio.h>

#define N 30
// 二维数组,用于存放学生的成绩。第一列:下标,第二列:总分
float g[N][2];
// 存放学生信息的结构体
struct {
	// 姓名
	char name[20];
	// 学号
	char id[20];
	// 数学
	float m;
	// 语文
	float chi;
	// 物理
	float p;
	// 化学
	float che;
	// 英语
	float e;
}s[N];

//按总分降序排序(选择排序)
void sort();
// 找出前10名中单科成绩低于80分的同学
void g80(int n);

void main()
{
	int i, n = 10, r;
	// 输入
	for (i = 0; i < N; i++)
	{
		printf("请输入第%d名学生的信息:\n", i + 1);
		scanf("%s%s%f%f%f%f%f", s[i].name, s[i].id, &s[i].m, &s[i].chi, &s[i].p, &s[i].che, &s[i].e);
		g[i][0] = (float)i;
		g[i][1] = s[i].m + s[i].chi + s[i].p + s[i].che + s[i].e;
	}
	// 排序
	sort();
	for (i = 0; i < 10; i++)
	{
		r = (int)g[i][0];
		printf("第%d名:%s,%s\n", i + 1, s[r].id, s[r].name);
	}
	// 并列第10名
	while (g[i - 1][1] == g[i][1])
	{
		r = (int)g[i][0];
		printf("第10名:%s,%s\n", s[r].id, s[r].name);
		i++;
		n++;
	}
	printf("前10名中,单科成绩低于80分的有:\n");
	g80(n);
}

void sort()
{
	float t0, t1;
	int i, max, j;
	for (i = 0; i < N - 1; i++)
	{
		max = i;
		for (j = i + 1; j < N; j++)
		{
			if (g[max][1] < g[j][1])
			{
				max = j;
			}
		}
		if (max != i)
		{
			t0 = g[max][0];
			t1 = g[max][1];
			g[max][0] = g[i][0];
			g[max][1] = g[i][1];
			g[i][0] = t0;
			g[i][1] = t1;
		}
	}
}

void g80(int n)
{
	int i, r;
	for (i = 0; i < n; i++)
	{
		r = (int)g[i][0];
		if (s[r].m < 80) {
			printf("%s,%s,数学成绩:%f\n", s[r].id, s[r].name, s[r].m);
		}
		if (s[r].chi < 80) {
			printf("%s,%s,语文成绩:%f\n", s[r].id, s[r].name, s[r].chi);
		}
		if (s[r].p < 80) {
			printf("%s,%s,物理成绩:%f\n", s[r].id, s[r].name, s[r].p);
		}
		if (s[r].che < 80) {
			printf("%s,%s,化学成绩:%f\n", s[r].id, s[r].name, s[r].che);
		}
		if (s[r].e < 80) {
			printf("%s,%s,英语成绩:%f\n", s[r].id, s[r].name, s[r].e);
		}
	}
}

示例数据:

姓名   	学号	数学	语文	物理	化学	英语
姓名1 	01	80	75	90	79	92
姓名2 	02	78	80	65	67	78
姓名3 	03	90	66	79	78	74
姓名4 	04	65	87	88	90	86
姓名5 	05	58	55	65	98	95
姓名6 	06	82	97	77	95	67
姓名7 	07	95	66	85	92	82
姓名8 	08	80	56	78	87	85
姓名9 	09	87	89	93	91	87
姓名10	10	97	67	69	98	82
姓名11	11	76	87	60	92	96
姓名12	12	78	88	59	78	93
姓名13	13	85	77	88	66	83
姓名14	14	85	66	84	87	87
姓名15	15	92	74	94	85	95
姓名16	16	75	82	79	86	74
姓名17	17	66	81	85	87	88
姓名18	18	53	93	57	90	90
姓名19	19	93	65	70	92	95
姓名20	20	94	80	76	94	77
姓名21	21	77	66	78	99	68
姓名22	22	88	55	68	67	55
姓名23	23	99	77	88	93	68
姓名24	24	72	96	77	86	69
姓名25	25	86	88	99	99	95
姓名26	26	79	60	54	98	74
姓名27	27	89	55	43	98	69
姓名28	28	90	99	99	95	70
姓名29	29	99	83	91	85	80
姓名30	30	56	55	50	78	92

运行结果示例:
在这里插入图片描述
excel中验证(求和之后对总成绩降序排序):
在这里插入图片描述
手写版:

3.第三题

在这里插入图片描述

#include<stdio.h>

// 求组合数的值
int cnk(int n, int k);

void main()
{
	int n, k;
	// 输入
	while (1)
	{
		printf("请输入n和k(k>=0,n>=k):\n");
		scanf("%d%d", &n, &k);
		if (k >= 0 && n >= k)
		{
			break;
		}
	}
	// 输出
	printf("结果为:%d\n", cnk(n, k));
}

int cnk(int n, int k)
{
	if (n == k || k == 0)
	{
		return 1;
	}
	else
	{
		return cnk(n - 1, k - 1) + cnk(n - 1, k);
	}
}

运行结果示例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
手写版:

→返回总目录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值