Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Ввод даты в список


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

#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 и т.п. и программа ругаться не будет)
Как реализовать проверку, что у нас вводится - дата или абракадабра?

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

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

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

а как это в поле dat запихнуть?

Автор: bsa 5.5.2008, 13:51
ALI46, а тебе обязательно, чтобы поле dat было строковым (с ним сложней работать в дальнейшем, имхо)? тебе никто не мешает вводить дату в виде строки и применять к ней sscanf, вместо scanf для ввода и разборки.

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

Автор: ALI46 5.5.2008, 14:45
вот так что ли присвоить?
Код

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

и как дату саму вводить теперь? чёто я не понял...

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

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

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

как я понял этот код мне запишет в поле dat дату в формате день.месяц.год. но каким должен быть последний параметр я не понимаю

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

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

Автор: Alek86 5.5.2008, 15:52
ошибся - 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;
}
//...
}

Автор: ALI46 5.5.2008, 16:40
Всем большое спасибо!!
вот код

Код

#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();
}

Автор: Alek86 5.5.2008, 16:43
нуну
не все так просто
введи-ка "31.02.01" в дату

Автор: ALI46 5.5.2008, 16:54
у нас в феврале 31 день smile 

Автор: ALI46 5.5.2008, 19:33
исправил код теперь проверяет сответствие месяц-количество дней

Код

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

Автор: bsa 5.5.2008, 22:24
ALI46, ты документацию на функции по религиозным мотивам не читаешь? Даю прямую наводку - читай про спецификаторы функции printf.

Автор: ALI46 5.5.2008, 22:44
bsa, читаю, и  религиозные мотивы тут не при чём, вот я так и подумал что в printf есть то что мне нужно, но видимо плохо искал, спасибо, что подсказал!

код (надеюсь что окончательный  smile )
Код

#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 %.2d.%.2d.%.2d\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();
}

Автор: ALI46 6.5.2008, 15:25
сегодня показал преподу прогу, ему не понравилось что нет проверки на високосность года(ну это ещё ладно), но главная претензия меня окончательно добила - "вы программируете на C++, а не на C поэтому чтоб никаких printf() scanf() fprintf() fscanf() и т.п. не было!"

как реализовать ввод/вывод даты через потоки?

Автор: Alek86 6.5.2008, 15:48
молодец препод!!!

подключай iostream, читай доки

Автор: ALI46 6.5.2008, 19:07
Цитата(Alek86 @  6.5.2008,  16:48 Найти цитируемый пост)
молодец препод!!!


Alek86, ага молодец...  smile 

fstream использую вот тока дату в формате dd.mm.yy ввести не получается...

Автор: ALI46 6.5.2008, 21:51
написал с потоками, но как описать ввод даты не знаю((((((
Код

#include <stdio.h>
#include <time.h>
#include <fstream.h>
#include <iomanip.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:
    int input()
    {
        ofstream fin("fin.txt", ios::out);
        if (!fin)
        {
            cout<<"ERROR!"<<endl;
            return 1;
        }
        TABL buf[4] = {{"Bread",3,4},{"Butter",5,5},{"Jam",3,3},{"Milk",2,5}};
        for(int i = 0; i<4;i++)
            fin << buf[i].tov << " " << buf[i].kol << " " << buf[i].cen << endl;
        fin.close();
    }
    void addst()
    {
        ifstream fin("fin.txt", ios::in);
        ofstream fout("fout.txt", ios::out);
        TABL tab[10];
        int i;
        for(i=0; i<4;i++)
        {                
            fin >> 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))
            { 
                cout << "Enter date (dd.mm.yy) for " << i+1 << " product\n";
                // Как дату вписать здесь? //cin >> 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;
            fout << tab[i].tov << " " << tab[i].kol << " " <<  tab[i].cen << " " <<  tab[i].dat.day << "." << tab[i].dat.mon << "." << tab[i].dat.year << " " <<  tab[i].sum << endl;
        }
        fin.close();
        fout.close();
    }
};
void main()
{
    tblstr run;
    run.input();
    run.addst();
    getch();
}

Автор: bsa 6.5.2008, 22:28
ALI46, ты не поверишь!
Код
int d, m, y;
char c; // нужно для пропуска разделителей
std::cin >> d >> c >> m >> c >> y;

Автор: ALI46 6.5.2008, 23:08
bsa, действительно бы не поверил)))
спасибо большое всем кто помогал!!!
теперь високосные тоже учитывает
Код

#include <stdio.h>
#include <time.h>
#include <fstream.h>
#include <iomanip.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:
    int input()
    {
        ofstream fin("fin.txt", ios::out);
        if (!fin)
        {
            cout<<"ERROR!"<<endl;
            return 1;
        }
        TABL buf[4] = {{"Bread",3,4},{"Butter",5,5},{"Jam",3,3},{"Milk",2,5}};
        for(int i = 0; i<4;i++)
            fin << buf[i].tov << " " << buf[i].kol << " " << buf[i].cen << endl; 
        fin.close();
    }
    void addst()
    {
        ifstream fin("fin.txt", ios::in);
        ofstream fout("fout.txt", ios::out);
        TABL tab[10];
        int i;
        for(i=0; i<4;i++)
        {                
            fin >> 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)||(!(y%4==0&&y%100!=0||y%400==0)&&(m==2))&&(d==29))
            { 
                cout << "Enter date (dd.mm.yy) for " << i+1 << " product\n";
                char c;
                cin >> d >> c >> m >> c >> y;
                tab[i].dat.day = d;
                tab[i].dat.mon = m;
                tab[i].dat.year = y;
                if (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)||(!(y%4==0&&y%100!=0||y%400==0)&&(m==2))&&(d==29)) cout << "Error\n";
            }
            tab[i].sum=tab[i].kol*tab[i].cen;
            fout << tab[i].tov << "\t" << tab[i].kol << "\t" <<  tab[i].cen << "\t" << setw(2) << setfill('0') << tab[i].dat.day << "." << setw(2) << setfill('0') << tab[i].dat.mon << "." << setw(2) << setfill('0') << tab[i].dat.year << "\t" <<  tab[i].sum << endl;
        }
        fin.close();
        fout.close();
    }
};
void main()
{
    tblstr run;
    run.input();
    run.addst();
    getch();
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)