C++学生管理系统
为什么输入学号和性别是正确的形式,也会出现格式错误请重新输入的情况,是哪里的语法弄错了么?顺便问问,怎样可以把字符数组定义的num的前四位限定一个输入数字范围,我们有输入限制要求,num的前四位输入要是合理年份!
将性别判断的 或改成与
while (0!=strcmp(sex,x)&&0!=strcmp(sex,y))
当性别 不为 男 且 不为女时进入循环
既然已经是C++了 可以用 std::string 来写 num 和判断性别
// 假定 num为 std::string
do{
cin >> num;
std::string year = num.substr(0,4);// 取学号前四位
int nyear = std::stoi(year);
if (num.size() != 12 &&nyear > 2023 && nyear < 1900)
cout <<"不符合条件请重新输入";
else
break;
} while (num.size() != 12 &&nyear > 2023 && nyear < 1900);
// sex 也为 std::string
if (sex != "男" && sex != "女")
#include <iostream>
#include <string>
using namespace std;
bool isValidStudentID(string studentID) {
if (studentID.length() != 12) {
return false;
}
string year = studentID.substr(0, 4);
int yearInt = stoi(year);
if (yearInt >= 1900 && yearInt <= 2099) {
return true;
}
return false;
}
int main() {
string studentID = "202112345678";
if (isValidStudentID(studentID)) {
cout << "Valid student ID" << endl;
} else {
cout << "Invalid student ID" << endl;
}
return 0;
}
>>随便撩撩
同学们们有没有手里拿着一道递归思维题就头大?很多书上只介绍了递归的概念和逻辑运作,没有告诉我们如何快速高效的解决这类问题,多有不足,还请指正。
>>分析
1.递归思维:从外而内,从分支到根茎,从 n 到 1 。
2.找到参数:这个参数串联这整个递归的所有层,这里明显为:n
3.发现规律:每一层与其一个或多个内层(或某个内内…层)之间的联系:这里把每一年的兔子数量和n的变化做一个表格来对照,发现规律。没思路的时候就把每一项工整地列举出来,规律自然呈现。
>>解答
1.列举:
f(n)表示对应第n年的兔子总数
n表示年次,第一年为一只[4]岁的兔子生了一个[0]岁的宝宝,故 f(1) = 2
中括号的数量表示兔子数,内部的数字表示年龄
2.对比:
第一个四年为等差;
第二个四年每年差值递增,但是差值的差值却是第一个四年的递增值;
第三个四年每年差值递增更快,差值等于第二个四年的递增值。
3.代换:
用前面兔子数 f() 来组合表示最后的 f() ,于是有了第二列表达式
如图从左至右的代换
得出:f(n) = f( n - 1) + f( n - 4 ) ,完美的递归函数,so everybody一起好好学数学!
文件就是这个表格
4.C++代码:
#include
using namespace std;
int func(int );
int main ()
{
int n ;
cin >> n ;
cout << func ( n ) << endl ;
return 0;
}
int func( int a )
{
return a <= 4 ? ( a + 1 ) : func ( a - 1 ) + func ( a - 4 ) ;
}
首先,需要对输入进行格式限制。可以使用C++字符串流stringstream来实现。具体步骤如下:
在头文件中添加 #include 。
对于学号和性别的输入格式,可以使用如下代码进行限制:
int num;
string sex;
cout << "请输入学号和性别(格式为 学号 性别):" << endl;
while (cin >> num >> sex) {
stringstream ss;
ss << num << " " << sex;
string input_str = ss.str(); // 将输入转换为字符串
bool valid_input = true;
string valid_sex[2] = {"男", "女"}; // 合法的性别选项
string temp;
// 使用stringstream逐个取出输入的学号和性别
for (int i = 0; i < 2; i++) {
ss >> temp;
if (i == 0) {
// 判断学号输入是否为数字且长度为8
if (temp.length() != 8 || !isdigit(temp[0])) {
valid_input = false;
break;
}
} else {
// 判断性别输入是否为合法选项
if (temp != valid_sex[0] && temp != valid_sex[1]) {
valid_input = false;
break;
}
}
}
if (valid_input) {
// 输入格式正确,进行后续操作
// ...
} else {
cout << "输入格式错误,请重新输入:" << endl;
}
}
以上代码会逐个取出输入的学号和性别,然后分别进行判断。其中,学号需要判断是否为8位数字,性别需要判断是否为"男"或"女"。如果输入格式正确,则可以进行后续操作。
接下来,需要限制num数组前四位只能输入合理年份。具体可以使用字符串操作来实现:
在头文件中添加 #include 。
在输入num时,取出前四位,然后判断是否为合理年份。代码如下:
string num_str;
cout << "请输入学生学号:" << endl;
cin >> num_str;
while (num_str.length() != 12) { // 判断学号长度是否为12
cout << "学号格式错误,请重新输入:" << endl;
cin >> num_str;
}
string year_str = num_str.substr(0, 4); // 取出前四位
int year = stoi(year_str); // 将年份字符串转换为整数
if (year < 2000 || year > 2022) { // 判断年份是否合法
cout << "学号前四位必须为合理年份,请重新输入:" << endl;
cin >> num_str;
}
以上代码使用substr函数取出num的前四位,然后使用stoi函数将字符串转换为整数。同时判断年份是否为合理范围内,如果不是则要求重新输入。