在struct中排序和验证日期(YYMMDD)

时间:2014-01-04 17:58:43

标签: c++ validation sorting date struct

#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。

我需要验证它以及按升序或降序对其进行排序的方法。

2 个答案:

答案 0 :(得分:1)

一些一般提示中的第一个。

  1. 将数据存储为int似乎是错误的。约会不是数字!它的行为不像数字。还有许多其他方式来显示日期而不是YYMMDD。 501022是一个真正的问题。请参阅http://en.wikipedia.org/wiki/Year_2000_problem
  2. student students[100];可以做得更好更安全。如果你只有10个学生,为什么要为100名学生使用记忆?当有101名学生时,为什么你的课程会爆炸? 没有必要这样做。在标准库中读取std :: vector和其他容器。这将使您的代码更安全!
  3. 至于你的实际问题,DD应该出现模数运算符%

    a%b给出余数a与b的除法。所以

    11 % 5 = 1
    4 % 2 = 0
    1311 % 100 = 11
    

    这样你可以查看当天。我相信你可以知道如何检查一个月后: - )

    对于排序,您可以使用qsort()。请参阅http://en.cppreference.com/w/cpp/algorithm/qsorthttp://cplus.about.com/od/learningc/ss/pointers2_8.htmhttp://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字节,具体取决于系统)