结构体字符串输入与比较异常:外国优秀学生占比计算排查
问题排查与修复方案
核心问题1:C风格字符串比较逻辑错误
你用s[i].country != u判断国籍是否为"Ukraine"是完全错误的。country和u都是字符数组名,本质是指向数组首元素的指针,这里比较的是两个指针的内存地址,而非字符串内容。
正确做法是使用C标准库的strcmp函数:
strcmp(a, b)返回0时,表示两个字符串完全相等;返回非0值则表示不等。
修改判断条件为:
strcmp(s[i].country, u) != 0 && s[i].meanMark > 3
同时需要添加头文件#include <cstring>,否则strcmp无法被编译器识别。
核心问题2:整数除法导致计算误差
代码中k / 4 * 100是整数除法运算,因为k和4都是int类型。比如当k=1时,1/4的结果是0,再乘以100还是0,和预期的25%完全不符。
需要将其中一个操作数转为浮点数,强制触发浮点除法:
float percent = static_cast<float>(k) / 4 * 100;
修复后的完整代码
#include <iostream> #include <ctime> #include <Windows.h> #include <cmath> #include <iomanip> #include <cstring> // 新增头文件 using namespace std; struct Student { char country[15]; int course; float meanMark; }; int main() { Student s[4]; for (int i = 0; i < 4; i++) { cout << "Student" << i + 1 << ": " << "\n"; cin >> s[i].country; cin >> s[i].course; cin >> s[i].meanMark; } char u[8] = "Ukraine"; int k = 0; for (int i = 0; i < 4; i++) { if (strcmp(s[i].country, u) != 0 && s[i].meanMark > 3) { k++; } } float percent = static_cast<float>(k) / 4 * 100; cout << "percent = " << percent << "%" << endl; }
内容的提问来源于stack exchange,提问作者gedomazo
相关产品推荐
相关产品推荐

