#include <iostream>
#include <cstdlib>
using namespace std;
struct student{
int ID; // ID
string firstname; // first name
string lastname; // last name
int date; // YYMMDD
};
bool is_num(const string &s);
void input_year(student &students);
int length_of_int(int input);
int main(){
student students[100];
int amount_of_students;
cin >> amount_of_students;
for(int i = 0; i < amount_of_students; i++){
cout << "Enter student's ID" << endl;
cin >> students[i].ID;
cout << "Enter student's first name" << endl;
cin >> students[i].firstname;
cout << "Enter student's last name" << endl;
cin >> students[i].lastname;
cout << "Enter student's date of birth" << endl;
input_year(students[i]);
}
return 0;
}
void input_year(student &students){
while(true){
string input;
cin >> input;
if(is_num(input)){
students.date = atoi(input.c_str());
if(length_of_int(students.date) != 6){
cout << "Error, try again." << endl;
}
else{
if()
break;
}
}
else{
cout << "Error, try again." << endl;
}
}
}
bool is_num(const string &s){
string::const_iterator it = s.begin();
while(it != s.end() && isdigit(*it)){
++it;
}
return !s.empty() && it == s.end();
}
int length_of_int(int input){
int length = 0;
while(input > 0){
length++;
input /= 10;
}
return length;
}
我有以下代码,我想通过DATE对结构的数组(学生[100])进行排序,并验证日期的输入。
我现在所做的就是验证它的6个字符和数字。但是,我想验证它是否是一个有效的日期(01-12个月,01-30天)。
关于这一年,我知道可能存在问题,例如: 501022可能意味着1950年和2050年,但这个问题有一个特例。
如果年份是50-99,则表示19xx,如果是00-14,则表示20xx。
我需要验证它以及按升序或降序对其进行排序的方法。
答案 0 :(得分:1)
一些一般提示中的第一个。
student students[100];
可以做得更好更安全。如果你只有10个学生,为什么要为100名学生使用记忆?当有101名学生时,为什么你的课程会爆炸?
没有必要这样做。在标准库中读取std :: vector和其他容器。这将使您的代码更安全!至于你的实际问题,DD应该出现模数运算符%
a%b
给出余数a与b的除法。所以
11 % 5 = 1
4 % 2 = 0
1311 % 100 = 11
这样你可以查看当天。我相信你可以知道如何检查一个月后: - )
对于排序,您可以使用qsort()。请参阅http://en.cppreference.com/w/cpp/algorithm/qsort和http://cplus.about.com/od/learningc/ss/pointers2_8.htm或http://www.geeksforgeeks.org/comparator-function-of-qsort-in-c/
比较功能可以直接比较student.date。在这里你得到一个自由骑行,因为日期是一个int。所以你可以直接比较学生a和b
if (a.date == b.date) {
嗯......除了2000年的那个问题......
答案 1 :(得分:1)
要对数组进行排序,您可以使用qsort()(例如http://www.cplusplus.com/reference/cstdlib/qsort/)。它看起来如下:
Functioncall:
qsort (students, amount_of_students, sizeof(student), func_ptr);
COMPAR功能:
typedef int (*compar)(const void*,const void*);
compar func_ptr;
int sort_ascending (const void* student1, cont void* student2)
{
long value1=student1->date;
long value2=student2->date;
if(value1 < 150000)
{ value1 += 20000000;} else { value1 += 19000000;}
if(value2 <150000)
{ value2 += 20000000;} else { value2 += 19000000;}
return value1 - value2;
}
对于sort_descending(),您必须切换value1和value2。
编辑: 包括
如果年份是50-99,则表示19xx,如果是00-14,则表示20xx。
提示:我会使用long而不是int作为日期(int有2或4或8字节,具体取决于系统)