Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проверка введенных данных. (Borland C++ 3.0)  (Прочитано 9737 раз)
0 Пользователей и 1 Гость смотрят эту тему.
SwinX
Гость
« : 04-04-2009 13:19 » 

Доброго времени суток! Имеется структура. У нее 3 поля - ФИО, знак зодиака, дата рождения. Хочется сделать так, чтобы данные, введенные в поля максимально соответствовали действительности, а не были банальным набором букв.  Вот то,  что удалось самостоятельно:

Код:
#include <iostream.h>
#include <conio.h>
#include <fstream.h>


const str_len = 30;    //dlina txt_polya v strukture
const amount_elem = 2; //Koli4estvo elementov v massive struktur


struct znak    //nasha struktura
{
char FIO[str_len];
char znak_zod[str_len];
int data_rojd[3];
};

znak *arr = new znak[amount_elem];   //massiv struktur

void vvod_elem();       //prototipi funkciy
int vivod_elem();

int main()
{

clrscr();

vvod_elem();
vivod_elem();


return 1;
}

void vvod_elem()                     //funkciya vvoda elementov
{
cout<<"Vvedite informaciu o ludyah"<<endl;
cout<<endl;
    for (int i=0; i<amount_elem; i++)   //tsikl vvoda elementov strukturi
{
cout<<"Vvedite FIO"<<endl;
cin>>arr[i].FIO;                       //vvodim fio
cout<<"Vvedite znak zodiaka"<<endl;



        cin>>arr[i].znak_zod;                     //vvodim znak zodiaka



cout<<"Vvedite datu rojdeniya. Format dati: DD:MM:YYYY"<<endl;
while (arr[i].data_rojd[0]<1   ||
       arr[i].data_rojd[0]>31   ||
       arr[i].data_rojd[1]<1    ||
       arr[i].data_rojd[1]>12   ||
       arr[i].data_rojd[2]<1850 ||
       arr[i].data_rojd[2]>2009) //[proverka pravilnosti vvoda dnya, mesyatsa i goda
{
     for (int j=0; j<3; j++) cin>>arr[i].data_rojd[j];
     if (arr[i].data_rojd[0]<1 || arr[i].data_rojd[0]>31) {cout<<"Nevernoe 4islo! Povtorite vvod!"<<endl;};
     if (arr[i].data_rojd[1]<1 || arr[i].data_rojd[1]>12) {cout<<"Neverniy mesyats! Povtorite vvod!"<<endl;};
     if (arr[i].data_rojd[2]<1850 || arr[i].data_rojd[2]>2009) {cout<<"Neverniy god! Povtorite vvod!"<<endl;};
}
cout<<endl;
}

}

int vivod_elem()  //procedura vivoda elementov massiva
{
if (arr[0].FIO=="0") cerr<<"Massiv struktur pust! Vvedite elementi massiva!"<<endl; getch(); return; //esli pole FIO v 0m elemente pustoe - viyti
for (int i=0; i<amount_elem; i++)
{
cout<<"FIO: "<<arr[i].FIO;
cout<<"Znak zodiaka: "<<arr[i].znak_zod;
cout<<"Data rojdeniya: ";
for(int j=0; j<3; j++) cout<<arr[i].data_rojd[j]<<" ";
cout<<endl;
};

delete [] arr;


return 1;
}


Задачу начал решать с конца - сделал проверку для даты. Изначально она заработала, но потом (после перезапуска си) отказалась. Может это связано с тем, что массив динамический?
Пробовал сделать такую же проверку для знака зодиака, сравнивая поле со строчками - 0 реакции Жаль Направьте на путь истинный Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 04-04-2009 13:54 » 

а это точно скомпилировалось ? Вне процедуры ?
znak *arr = new znak[amount_elem];   //massiv struktur
Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #2 : 04-04-2009 13:57 » 

Зачем знаки зодиака хранить в строке? Когда можно сделать enum?
Код:
enum Zodiac {Aries, Taurus, Gemini, Cancer, Leo, Virgo, Libra, Scorpio, Sagittarius, Capricornus, Aquarius, Pisces};

struct znak    //nasha struktura
{
char FIO[str_len];
Zodiac znak_zod;
int data_rojd[3];
};
Второе, Знаки Зодиака можно вычислять, зачем заставлять их вводить?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
SwinX
Гость
« Ответ #3 : 04-04-2009 14:27 » 

а это точно скомпилировалось ? Вне процедуры ?
znak *arr = new znak[amount_elem];   //massiv struktur

да, скомпилировалось. А почему не должно?   Не понял

Зачем знаки зодиака хранить в строке? Когда можно сделать enum?
Код:
enum Zodiac {Aries, Taurus, Gemini, Cancer, Leo, Virgo, Libra, Scorpio, Sagittarius, Capricornus, Aquarius, Pisces};

struct znak    //nasha struktura
{
char FIO[str_len];
Zodiac znak_zod;
int data_rojd[3];
};

Была такая идея. А как тогда присвоить полю 1 знак из множества? И как дать пользователю выбрать знак?
Второе, Знаки Зодиака можно вычислять, зачем заставлять их вводить?
Такое задание в книге. Потом можно будет сделать привидение одного к другому при их несовпадении.

Заранее извините за глупые вопросы. Я и правда только начал учить Скромно так...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 04-04-2009 15:11 » 

SwinX, вроде в global space такое не должно прокатить, но раз компилятор разрешил - тогда флаг в руки )
Записан

SwinX
Гость
« Ответ #5 : 05-04-2009 07:21 » 

Переписал ввод значений с

Код:
cin>>arr[i].FIO;                       //vvodim fio
cin>>arr[i].znak_zod;                     //vvodim znak zodiaka

на

Код:
cin.getline(arr[i].FIO, str_len);
cin.getline(arr[i].znak_zod, str_len);

После этого проверка даты заработала, но программа во время ввода 2го и последующих элементов программа стала пропускать ввод поля фио. Вчера пол-дня колотился, не могу понять почему. Подозревается лишний ввод где-то, но отловить его не могу.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines