一、前言
提示:以下是博主自己写的代码,仅供参考,欢迎有兴趣的朋友们留言讨论呀
二、正文
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);
}
}
运行结果示例:
手写版: