#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.
Мне нужна проверка для этого и метод для сортировки в порядке возрастания или убывания.
Чтобы отсортировать массив, вы можете использовать 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 байт в зависимости от системы)
Первый из нескольких общих советов.
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 года выпуска...
int
. Что касается проблемы 2000 года, я знаю об этом, и я уже говорил с профессором, и он сказал мне, чтобы взять годы с 50-99 как 19xx и годы с 00-14 как 20xx. Что касается [100], то это потому, что спецификации содержат максимум 100 элементов, и я обязательно включу проверки для amount_of_students после того, как решу сортировку.