831 字
4 分钟

2025.12.16 C语言程序设计上机实习七

2025-12-16
C

2025.12.16 C语言程序设计上机实习七#

必做题#

选做题#

题目源文件实验七.pdf

题目1:结构体数组中按条件筛选并计算收入总和#

30行之后的代码补充

// 解析行并存入结构体的相应数据中
int id;
char lastname[20], firstname[20];
double income;
sscanf(line, "%d %s %s %lf", &id, lastname, firstname, &income);
people[i].id = id;
people[i].income = income;
snprintf(people[i].name, sizeof(people[i].name),"%s %s", lastname, firstname);

函数SumIncomeByLastname

double SumIncomeByLastname(struct Person *people, int n, const char *lastname)
{
if (n <= 0) return -1;
if (!people) return -1;
if (!lastname) return -1;
double sum = 0.0;
int len = strlen(lastname);
for (int i = 0; i < n; i++)
{
if (strncmp(people[i].name, lastname, len) == 0 && people[i].name[len] == ' ')
{
sum += people[i].income;
}
}
return sum;
}

函数SumIncomeByIDList

double SumIncomeByIDList(struct Person *people, int n, int *id_list, int id_count)
{
double sum = 0.0;
if ( people == NULL ) return -1;
if ( n <= 0 ) return -1;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < id_count; j++)
{
if ( people[i].id == id_list[j] )
{
sum += people[i].income;
break;
}
}
}
return sum;
}

用相应测试例测试的运行结果截图

附:完整代码#

CalculateIncome.c#

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Person {
int id;
char name[30]; // 实际上是 "Lastname Firstname"
double income;
};
// 你需要完成的函数
double SumIncomeByLastname(struct Person *people, int n, const char *lastname);
double SumIncomeByIDList(struct Person *people, int n, int *id_list, int id_count);
// 用于测试
void Test(struct Person *people, int n);
int main(void) {
int n;
scanf("%d", &n);
getchar(); // 清除换行符
struct Person *people = (struct Person *)malloc(n * sizeof(struct Person));
for (int i = 0; i < n; i++) {
// 读取一行
char line[100];
if (!fgets(line, sizeof(line), stdin))
break;
// 解析行并存入结构体的相应数据中
int id;
char lastname[20], firstname[20];
double income;
sscanf(line, "%d %s %s %lf", &id, lastname, firstname, &income);
people[i].id = id;
people[i].income = income;
snprintf(people[i].name, sizeof(people[i].name),"%s %s", lastname, firstname);
}
Test(people, n);
free(people);
return 0;
}
void Test(struct Person *people, int n) {
// 0. 测试输出全部信息
for(int i = 0; i < n; i++)
printf("%d %s %f\n", people[i].id, people[i].name, people[i].income);
// 1. 测试姓氏 "Zhang"
printf("=== 测试: 姓氏 \"Zhang\" ===\n");
printf("%.2f\n", SumIncomeByLastname(people, n, "Zhang"));
// 2. 测试姓氏 "Li"
printf("=== 测试: 姓氏 \"Li\" ===\n");
printf("%.2f\n", SumIncomeByLastname(people, n, "Li"));
// 3. 测试姓氏 "Torres"(假设存在)
printf("=== 测试: 姓氏 \"Torres\" ===\n");
printf("%.2f\n", SumIncomeByLastname(people, n, "Torres"));
// 4. 测试不存在的姓氏 "Minese"
printf("=== 测试: 姓氏 \"Minese\" (不存在) ===\n");
printf("%.2f\n", SumIncomeByLastname(people, n, "Minese"));
// 5. 测试完整名 "Zhang San"(不应匹配,因为只比对姓)
printf("=== 测试: 姓氏 \"Zhang San\" (完整名) ===\n");
printf("%.2f\n", SumIncomeByLastname(people, n, "Zhang San"));
// 6. 测试 ID 列表:1001 ~ 1100 全部 ID
printf("=== 测试: ID 1001~1100 全部 ===\n");
int all_ids[100];
for (int i = 0; i < 100; i++) {
all_ids[i] = 1001 + i;
}
printf("%.2f\n", SumIncomeByIDList(people, n, all_ids, 100));
// 7. 测试 ID 列表:1001~1100 的奇数 ID
printf("=== 测试: ID 1001~1100 奇数 ===\n");
int odd_ids[50];
int count = 0;
for (int i = 1001; i <= 1100; i += 2) {
odd_ids[count++] = i;
}
printf("%.2f\n", SumIncomeByIDList(people, n, odd_ids, count));
// 8. 测试 ID 列表:1001~1100 的偶数 ID
printf("=== 测试: ID 1001~1100 偶数 ===\n");
int even_ids[50];
count = 0;
for (int i = 1002; i <= 1100; i += 2) {
even_ids[count++] = i;
}
printf("%.2f\n", SumIncomeByIDList(people, n, even_ids, count));
}
double SumIncomeByLastname(struct Person *people, int n, const char *lastname)
{
if (n <= 0) return -1;
if (!people) return -1;
if (!lastname) return -1;
double sum = 0.0;
int len = strlen(lastname);
for (int i = 0; i < n; i++)
{
if (strncmp(people[i].name, lastname, len) == 0 && people[i].name[len] == ' ')
{
sum += people[i].income;
}
}
return sum;
}
double SumIncomeByIDList(struct Person *people, int n, int *id_list, int id_count)
{
double sum = 0.0;
if ( people == NULL ) return -1;
if ( n <= 0 ) return -1;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < id_count; j++)
{
if ( people[i].id == id_list[j] )
{
sum += people[i].income;
break;
}
}
}
return sum;
}

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

2025.12.16 C语言程序设计上机实习七
https://mjy.js.org/posts/20251216-c语言程序设计上机实习七/
作者
MaJianyu
发布于
2025-12-16
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
MaJianyu
永远相信,美好的事情即将发生。
分类
标签
站点统计
文章
31
分类
9
标签
53
总字数
147,470
运行时长
0
最后活动
0 天前

目录