Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ввод даты в список 
V
    Опции темы
ALI46
Дата 5.5.2008, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 1.5.2008

Репутация: нет
Всего: нет



В текстовом файле в табличном виде хранится информация о количестве и ценах товаров на складе. Добавить в таблицу графу с датами проводимых проверок, а также графу с общими суммами по каждому виду товара.
я написал так:
Код

#include <stdio.h>
#include <conio.h>
struct TABL
{
    char tov[20];
    int kol;
    int cen;
    char dat[10];
    int sum;
};
class tblstr
{
    public:
    void input()
    {
        FILE *fin = fopen("fin.txt","wt+");
        TABL buf[4] = {{"Bread",3,4},{"Butter",5,5},{"Jam",3,3},{"Milk",2,5}};
        for(int i = 0; i<4;i++)
            fprintf(fin,"%s %d %d \n",buf[i].tov,buf[i].kol,buf[i].cen);
        fclose(fin);
    }
    void addst()
    {
        FILE *fin = fopen("fin.txt","r");
        FILE *fout = fopen("fout.txt","a");
        TABL tab[10];
        int i;
        //TABL buf[4] = {{"Bread",3,4},{"Butter",5,5},{"Jam",3,3},{"Milk",2,5}};
    
        for(i=0; i<4;i++)
        {    
            fscanf(fin,"%s%d%d",&tab[i].tov,&tab[i].kol,&tab[i].cen);
            printf("Enter date (dd.mm.yy) for %d product\n",i+1);
            scanf("%s",&tab[i].dat);
            tab[i].sum=tab[i].kol*tab[i].cen;
            fprintf(fout,"%s %d %d %s %d\n",tab[i].tov,tab[i].kol,tab[i].cen,tab[i].dat,tab[i].sum);
        }
        fclose(fin);
        fclose(fout);
    }

};
void main()
{
    tblstr run;
    run.input();
    run.addst();
    getch();
}


но препода не устроило, то что дата вводится в виде строки и нет никакой проверки является ли данная строка датой(т.е. можно ввести 50.40.08 и т.п. и программа ругаться не будет)
Как реализовать проверку, что у нас вводится - дата или абракадабра?
PM MAIL   Вверх
bsa
Дата 5.5.2008, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



ALI46, распарси ее как-нибудь так:
Код
scanf("%d.%d.%d", &day, &mon, &year);

PM   Вверх
Rififi
Дата 5.5.2008, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



ALI46, 
например можно передать полученные значения функции формирования времени в виде текстовой строки (_tcsftime), или применить регулярное выражение.

Это сообщение отредактировал(а) Rififi - 5.5.2008, 12:30
PM MAIL   Вверх
ALI46
Дата 5.5.2008, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 1.5.2008

Репутация: нет
Всего: нет



Цитата(bsa @  5.5.2008,  12:18 Найти цитируемый пост)
ALI46, распарси ее как-нибудь так:
Код
scanf("%d.%d.%d", &day, &mon, &year);

а как это в поле dat запихнуть?
PM MAIL   Вверх
bsa
Дата 5.5.2008, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



ALI46, а тебе обязательно, чтобы поле dat было строковым (с ним сложней работать в дальнейшем, имхо)? тебе никто не мешает вводить дату в виде строки и применять к ней sscanf, вместо scanf для ввода и разборки.
PM   Вверх
Alek86
Дата 5.5.2008, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



лучше все же используй strftime
а для даты можно или свою структуру написать, или стандартную ™ использовать


--------------------
user posted image    user posted image
PM MAIL   Вверх
ALI46
Дата 5.5.2008, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 1.5.2008

Репутация: нет
Всего: нет



вот так что ли присвоить?
Код

strftime (tab[i].dat,8,"%d.%m.%y.",/*что здесь надо писать?*/);

и как дату саму вводить теперь? чёто я не понял...
PM MAIL   Вверх
Alek86
Дата 5.5.2008, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



http://msdn.microsoft.com/en-us/library/fe06s4ak.aspx
если по-ангельски не очень читаешь, то все равно паопытайся разобраться.
что непонятно - спрашуй


--------------------
user posted image    user posted image
PM MAIL   Вверх
ALI46
Дата 5.5.2008, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 1.5.2008

Репутация: нет
Всего: нет



непонятно, как дату ввести ручками с клавиатуры чтобы присвоить его полю в структуре
Код

strftime (tab[i].dat,8,"%d.%m.%y.",/*хз что*/);

как я понял этот код мне запишет в поле dat дату в формате день.месяц.год. но каким должен быть последний параметр я не понимаю
PM MAIL   Вверх
JackYF
Дата 5.5.2008, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(ALI46 @  5.5.2008,  14:37 Найти цитируемый пост)
но каким должен быть последний параметр я не понимаю 

В документации посмотри.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Alek86
Дата 5.5.2008, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



ошибся - strftime из tm в строку преобразует, а не наоборот...
тогда придется

Код


struct date {
 int day, mon, year;
};

struct TABL
{
    char tov[20];
    int kol;
    int cen;
    date dat;
    int sum;
};

int main() {
 TABL tabl;

//...
// в цикле
int day = 0, mon = 0, year = 0;
scanf("%d.%d.%d", &day, &mon, &year);
if (check_date(day, mon, year)) { // проверка чисел day, mon, year на правильность (чтоб они составляли правильную дату)
 tabl.dat.day = day;
 tabl.dat.mon = mon;
 tabl.dat.year = year;
}
//...
}



--------------------
user posted image    user posted image
PM MAIL   Вверх
ALI46
  Дата 5.5.2008, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 1.5.2008

Репутация: нет
Всего: нет



Всем большое спасибо!!
вот код

Код

#include <stdio.h>
#include <time.h>
#include <conio.h>
struct date
{
    int day, mon, year;
};
struct TABL
{
    char tov[20];
    int kol;
    int cen;
    date dat;
    int sum;
};

class tblstr
{
    public:
    void input()
    {
        FILE *fin = fopen("fin.txt","wt+");
        TABL buf[4] = {{"Bread",3,4},{"Butter",5,5},{"Jam",3,3},{"Milk",2,5}};
        for(int i = 0; i<4;i++)
            fprintf(fin,"%s %d %d \n",buf[i].tov,buf[i].kol,buf[i].cen);
        fclose(fin);
    }
    void addst()
    {
        FILE *fin = fopen("fin.txt","r");
        FILE *fout = fopen("fout.txt","a");
        TABL tab[10];
        struct tm * timeinfo;
        int i;    
        for(i=0; i<4;i++)
        {    
            
            fscanf(fin,"%s%d%d",&tab[i].tov,&tab[i].kol,&tab[i].cen);
            int d=-1, m=-1, y=-1;            
            while ( d<1 || d>31 || m<1 || m>12 || y<0 || y>99)
            { // проверка чисел day, mon, year на правильность (чтоб они составляли правильную дату)
                printf("Enter date (dd.mm.yy) for %d product\n",i+1);
                scanf("%d.%d.%d", &d, &m, &y);
                tab[i].dat.day = d;
                tab[i].dat.mon = m;
                tab[i].dat.year = y;
            }
            tab[i].sum=tab[i].kol*tab[i].cen;
            fprintf(fout,"%s\t %d\t %d\t %d.%d.%d\t %d\n",tab[i].tov,tab[i].kol,tab[i].cen,tab[i].dat,tab[i].sum);
        }
        fclose(fin);
        fclose(fout);
    }

};
void main()
{
    tblstr run;
    run.input();
    run.addst();
    getch();
}

PM MAIL   Вверх
Alek86
Дата 5.5.2008, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



нуну
не все так просто
введи-ка "31.02.01" в дату


--------------------
user posted image    user posted image
PM MAIL   Вверх
ALI46
Дата 5.5.2008, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 1.5.2008

Репутация: нет
Всего: нет



у нас в феврале 31 день smile 

Это сообщение отредактировал(а) ALI46 - 5.5.2008, 19:33
PM MAIL   Вверх
ALI46
Дата 5.5.2008, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 1.5.2008

Репутация: нет
Всего: нет



исправил код теперь проверяет сответствие месяц-количество дней

Код

#include <stdio.h>
#include <time.h>
#include <conio.h>
struct date
{
    int day, mon, year;
};
struct TABL
{
    char tov[20];
    int kol;
    int cen;
    date dat;
    int sum;
};

class tblstr
{
    public:
    void input()
    {
        FILE *fin = fopen("fin.txt","wt+");
        TABL buf[4] = {{"Bread",3,4},{"Butter",5,5},{"Jam",3,3},{"Milk",2,5}};
        for(int i = 0; i<4;i++)
            fprintf(fin,"%s %d %d \n",buf[i].tov,buf[i].kol,buf[i].cen);
        fclose(fin);
    }
    void addst()
    {
        FILE *fin = fopen("fin.txt","r");
        FILE *fout = fopen("fout.txt","a");
        TABL tab[10];
        struct tm * timeinfo;
        int i;    
        char sd,sm,sy;
        for(i=0; i<4;i++)
        {                
            fscanf(fin,"%s%d%d",&tab[i].tov,&tab[i].kol,&tab[i].cen);
            int d=-1, m=-1, y=-1;            
            while (d<1 || d>31 || m<1 || m>12 || y<0 || y>99 || d>29&&m==2 || d>30&&(m==2||m==4||m==6||m==9||m==11))
            { 
                printf("Enter date (dd.mm.yy) for %d product\n",i+1);
                scanf("%d.%d.%d", &d, &m, &y);
                tab[i].dat.day = d;
                tab[i].dat.mon = m;
                tab[i].dat.year = y;
            }
            tab[i].sum=tab[i].kol*tab[i].cen;
            fprintf(fout,"%s\t %d\t %d\t %d.%d.%d\t %d\n",tab[i].tov,tab[i].kol,tab[i].cen,tab[i].dat,tab[i].sum);
        }
        fclose(fin);
        fclose(fout);
    }
};
void main()
{
    tblstr run;
    run.input();
    run.addst();
    getch();
}


вот только снова возник очередной вопрос, как заставить выводить в дате недостающие нули для дней, месяцев, годов меньше 10 ? а то вводишь "02.03.04" а в файле выдаёт "2.3.4" 

Это сообщение отредактировал(а) ALI46 - 5.5.2008, 22:22
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0578 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.