Сортировка и проверка даты (ГГММДД) в структуре

0
#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 ID" << endl;
        cin >> students[i].ID;
        cout << "Enter student first name" << endl;
        cin >> students[i].firstname;
        cout << "Enter student last name" << endl;
        cin >> students[i].lastname;
        cout << "Enter student 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;
}

У меня есть следующий код, и я хочу сортировать массив (учащиеся [100]) структуры по DATE и проверять ввод даты.

То, что я делаю прямо сейчас, проверяет это 6 символов и число. Тем не менее, я хотел бы проверить его также, чтобы проверить, действительно ли это действительная дата (01-12 месяцев, 01-30 дней).

Что касается года, я знаю, что есть возможная проблема: 501022 может означать как 1950, так и 2050 год, но для этого есть специальный случай.

Если год составляет 50-99, это относится к 19xx, если оно от 00-14, оно относится к 20xx.

Мне нужна проверка для этого и метод для сортировки в порядке возрастания или убывания.

Теги:
struct
validation
sorting
date

2 ответа

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() вам нужно переключить значение1 и значение2.

изменение: включить

Если год составляет 50-99, это относится к 19xx, если оно от 00-14, оно относится к 20xx.

Подсказка: я использовал бы long вместо int для Date (int имеет 2 или 4 или 8 байт в зависимости от системы)

  • 0
    Сортирует ли он только int? Или это эффективно сортирует даты (вместе с годом / месяцем / днем)?
  • 0
    Он сортирует даты. Первый шаг - расширение YYMMDD до YYYYMMDD. с YYYYMMDD «младшая» дата будет иметь более высокое целочисленное значение (или более длинное значение), чем «более старая» дата. Я не совсем уверен, что оператор return правильный для sort_ascending. Но на самом деле вам просто нужно переключить значение1 и значение2 в операторе возврата, чтобы изменить последовательность сортировки.
1

Первый из нескольких общих советов.

  1. Хранение данных как int кажется неправильным. Дата не число! Он не ведет себя как число. И есть много других способов отображения даты, чем YYMMDD. 501022 - настоящая проблема. См. Http://en.wikipedia.org/wiki/Year_2000_problem
  2. student students[100]; может быть сделано намного лучше и безопаснее. Зачем использовать память для 100 учеников, если у вас всего 10? Почему ваша программа взорвется, когда есть 101 ученик? В этом нет необходимости. читать в std :: vector и других контейнерах в стандартной библиотеке. Это сделает ваш код намного безопаснее!

Что касается вашего фактического вопроса, DD должен выступить с оператором модуля%

a%b дает остатку деление на 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 -функции-оф-QSort-в-с/

функция сравнения может непосредственно сравнивать student.date. Здесь вы получаете фрирайд, потому что дата - это int. поэтому вы можете сравнить учеников a и b напрямую

if (a.date == b.date) {

Ну... за исключением того 2000 года выпуска...

  • 0
    Спасибо за ваш ответ. Я делаю это упражнение для колледжа, и указано, что дата должна быть типа int . Что касается проблемы 2000 года, я знаю об этом, и я уже говорил с профессором, и он сказал мне, чтобы взять годы с 50-99 как 19xx и годы с 00-14 как 20xx. Что касается [100], то это потому, что спецификации содержат максимум 100 элементов, и я обязательно включу проверки для amount_of_students после того, как решу сортировку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню