Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.89/36: Рейтинг темы: голосов - 36, средняя оценка - 4.89
cx5xclxxl9
0 / 0 / 1
Регистрация: 12.05.2011
Сообщений: 23
#1

Работа со структурами

07.06.2011, 21:00. Просмотров 6467. Ответов 30
Метки нет (Все метки)

Имеется вот такая задача:

Файл, содержащий даты. Каждая дата - это структура,
помещенная в отдельную запись. Состав структуры:

struct date{
short число;
char месяц[15];
short год;
struct{
short часы;
short минуты;
};
}

Составить программу, создающую такой файл.
Составить программу, которая:
* выводит на экран все даты, попадающие в указанный с клавиатуры
интервал (если время не задано, то оно игнорируется);
* выводит самую раннюю дату


Есть ли у кого нибудь пример похожей рабочей программы?
Я не могу понять, как создать неограниченное количество этих структур и как организовать запись этих структур в файл.

Добавлено через 16 минут
Помогите, пожалуйста, очень срочно нужно.

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2011, 21:00
Ответы с готовыми решениями:

Работа со структурами
Задача с структурой. Нужно вывести на консоль эти данные которые совпадают по...

Работа со структурами
Здравствуйте.У меня возникли проблемы в написании программы,а именно как...

Работа со структурами.
Здраствуйте! Текст задания : Создать программу, позволяющую вводить элементы...

РАБОТА СО СТРУКТУРАМИ
Судоходные реки: Название реки, протяженность, минимальная глубина фарватера....

Работа со структурами
Всем доброго времени суток! Имеется следующая задача: Написал следующий...

30
marina2
Рожденная для битвы
272 / 50 / 10
Регистрация: 08.11.2009
Сообщений: 1,029
07.06.2011, 21:05 #2
Цитата Сообщение от cx5xclxxl9 Посмотреть сообщение
Я не могу понять, как создать неограниченное количество этих структур
Можно например сделать массив или список структур Умеешь такое? На форуме много таких тем

А потом путем доступа к элементам списка и доступа элементам структуры сравнивать нужные параметры
1
cx5xclxxl9
0 / 0 / 1
Регистрация: 12.05.2011
Сообщений: 23
07.06.2011, 21:15  [ТС] #3
Ты имеешь ввиду вот такой массив структур?


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct key {
    char *word;
    int count;
} keytab[] = {
    "auto", 0,
    "break", 0,
    "case", 0,
    "char", 0,
    "const", 0,
    "continue", 0,
    "default", 0,
    /*...*/
    "unsigned", 0,
    "void", 0,
    "volatile", 0,
    "while", 0
};
0
marina2
Рожденная для битвы
272 / 50 / 10
Регистрация: 08.11.2009
Сообщений: 1,029
07.06.2011, 21:52 #4
С массивами я не работала, так что точно не могу сказать

Попробуй так (это список)

C++
1
2
3
4
5
struct list{
stract data
{.....}
list *next; //указатель на следующий элемент списка
}
0
cx5xclxxl9
0 / 0 / 1
Регистрация: 12.05.2011
Сообщений: 23
07.06.2011, 21:56  [ТС] #5
Цитата Сообщение от marina2 Посмотреть сообщение
{.....}
А в это место что нужно вставлять?
0
marina2
Рожденная для битвы
272 / 50 / 10
Регистрация: 08.11.2009
Сообщений: 1,029
07.06.2011, 22:03 #6
http://www.cyberforum.ru/cpp-beginne...ead312778.html
Посмотри это, может получится?

Добавлено через 4 минуты
Цитата Сообщение от cx5xclxxl9 Посмотреть сообщение
А в это место что нужно вставлять?
Так это же твоя структура)

Ты понял насчет массива, как его создавать?
0
cx5xclxxl9
0 / 0 / 1
Регистрация: 12.05.2011
Сообщений: 23
07.06.2011, 22:26  [ТС] #7
Ага, сейчас попробую написать
0
marina2
Рожденная для битвы
272 / 50 / 10
Регистрация: 08.11.2009
Сообщений: 1,029
07.06.2011, 23:02 #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <stdio.h>
#include <conio.h>  //ne rabotaet clrscr
#include <iostream>
using namespace std;
 
void function1();
struct date{
int ch;
char m[15];
int y;
struct time{
int cl;
int min;} t;
};
 
void main (void)
{
int menu=0;
 
        vozvrat:
        while (menu!=6)
        {
        printf("_____________________________________________________________\n");
        printf("____________________Abonenti ATS_____________________________\n");
        printf("_____________________________________________________________\n");
        printf("Vibirite odin iz variantov:\n");
        printf("1 - Zagruzit' mnogestvo iz tekstovogo faila(ini)\n");
        printf("2 - Prosmotr vsex elementov massiva\n");
        printf("3 - Dobavlenie novix elementov v konec massiva iz zad. faila\n");
        printf("4 - Udalenie elementov massiva\n");
        printf("5 - Sohranenie massiva v zadannom formate\n");
        printf("6 - Vixod iz programmi\n");
        printf("-------------------------------------------------------------\n");
        scanf("%d", &menu);
 
        switch (menu){
                case 1: goto menu1;
 
                }
        menu1:
                {
                // function1(); //Obyavlenie funkcii
                function1();            //vizov funkcii
                }
                goto vozvrat;
                }
//return 0; /*pokazivaet chto programma uspesno zavershena*/
}
 
 
//////////*opisanie funkcii zagruzki massiva*/
void function1()
{
FILE *f1;    /*sozdaem ukazatel na peremennyu tipa fail*/
 
 date mas_str[20];
int i,n;
 
 
cout<<("kol-vo elem");
cin>>n;
for (i=0;i<n;i++)
        {
        cout<<"chislo";
        cin>>mas_str[i].ch;
                cout<<"/nMesyac:";
                cin>>mas_str[i].m;
                cout<<"/nGod:";
                cin>>mas_str[i].y;
                cout<<"/nChas:";
                cin>>mas_str[i].t.cl;
                cout<<"/nCMinut:";
                cin>>mas_str[i].t.min;
 
      
 }
}
Добавлено через 1 минуту
Что-то наподобие такого должно получится
0
cx5xclxxl9
0 / 0 / 1
Регистрация: 12.05.2011
Сообщений: 23
07.06.2011, 23:09  [ТС] #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// 4.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
#include <locale.h>
#include <stdio.h>
#include <windows.h>
#include <conio.h>
using namespace std;
#define cyrOut(_string_) CharToOem(_string_,szStr);\
cout << szStr
char szStr[512];
 
#define N 20
 
int _tmain(int argc, _TCHAR* argv[])
{ 
    struct date {
              short chislo;
              char mes[15];
              short god;
              struct vremya {
                short chasy;
                short minuty;
              };
 
           };
 
    struct date mas_date[N];
    struct date.vremya mas_time[N];
 
    
    for (int i=0;i<N;i++)
    {
        cyrOut("Введите число: ");
        scanf("%d",mas_date[i].chislo);
        cyrOut("Введите месяц (например: Февраль) : ");
        scanf("%c",mas_date[i].mes);
        cyrOut("Введите год: ");
        scanf("%d",mas_date[i].god);
        cyrOut("Введите время (часы): ");
        scanf("%d",mas_time[i].chasy);
        cyrOut("Введите время (минуты): ");
        scanf("%d",mas_time[i].minuty);
    }
           
 
 
 
 
 
 
 
    return 0;
}
Почему-то ругается на 32 строчку

Добавлено через 2 минуты
Цитата Сообщение от marina2 Посмотреть сообщение
Что-то наподобие такого должно получится
Спасибо, у меня приблизительно так и есть

Добавлено через 2 минуты
Понял почему ругается.
0
marina2
Рожденная для битвы
272 / 50 / 10
Регистрация: 08.11.2009
Сообщений: 1,029
07.06.2011, 23:11 #10
Цитата Сообщение от cx5xclxxl9 Посмотреть сообщение
struct date mas_date[N];
struct date.vremya mas_time[N];
Мне кажется, это можно в одном массиве создать
0
cx5xclxxl9
0 / 0 / 1
Регистрация: 12.05.2011
Сообщений: 23
07.06.2011, 23:55  [ТС] #11
Цитата Сообщение от marina2 Посмотреть сообщение
Мне кажется, это можно в одном массиве создать
Ага, видимо, так и нужно было сделать

Добавлено через 37 минут
А каким способом эту структуру можно записать в файл? А то у меня что-то не выходит

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <fstream>
#include "stdafx.h"
#include <conio.h>
#include <Windows.h>
#include <iostream>
#include <string>
using namespace std;
 
#define cyrOut(_string_) CharToOem(_string_,szStr);\
cout << szStr
char szStr[512];
 
#define N 2
 
int _tmain(int argc, _TCHAR* argv[])
{ 
    struct date {
              short chislo;
              char mes[15];
              short god;
              struct vremya {
                short chasy;
                short minuty;
              } t;
 
           };
 
    struct date mas_date[N];
    
 
    
    for (int i=0;i<N;i++)
    {
        cyrOut("\n\n*** Дата ");cout<<i+1<<" ***\n\n";
        cyrOut("Введите число: \n");
        cin>>mas_date[i].chislo;
        cyrOut("Введите месяц (например: Февраль) : \n");
        cin>>mas_date[i].mes;
        cyrOut("Введите год: \n");
        cin>>mas_date[i].god;
        cyrOut("Введите время (часы): \n");
        cin>>mas_date[i].t.chasy;
        cyrOut("Введите время (минуты): \n");
        cin>>mas_date[i].t.minuty;
    }
           
    ofstream os("text.txt");
    os.write(reinterpret_cast<char*>(mas_date),sizeof(mas_date));
    os.close();
 
 
 
 
 
 
 
    return 0;
}
Добавлено через 5 минут
Он мне кракозябры выводит в файл.
0
marina2
Рожденная для битвы
272 / 50 / 10
Регистрация: 08.11.2009
Сообщений: 1,029
08.06.2011, 00:01 #12
Цитата Сообщение от cx5xclxxl9 Посмотреть сообщение
ofstream os("text.txt");
Это кажется считывание из файла
Попробуй ifstram
0
accept
4833 / 3255 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
08.06.2011, 07:50 #13
C++
1
ofstream os("text.txt", ios::binary);
1
cx5xclxxl9
0 / 0 / 1
Регистрация: 12.05.2011
Сообщений: 23
08.06.2011, 23:13  [ТС] #14
Всё равно почему-то криво выводит

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <fstream>
#include "stdafx.h"
#include <conio.h>
#include <Windows.h>
#include <iostream>
#include <string>
using namespace std;
 
#define cyrOut(_string_) CharToOem(_string_,szStr);\
cout << szStr
char szStr[512];
 
#define N 2
 
int _tmain(int argc, _TCHAR* argv[])
{ 
    struct date {
              short chislo;
              char mes[15];
              short god;
              struct vremya {
                short chasy;
                short minuty;
              } t;
 
           };
 
    struct date mas_date[N];
    
 
    
    for (int i=0;i<N;i++)
    {
        cyrOut("\n\n*** Дата ");cout<<i+1<<" ***\n\n";
        cyrOut("Введите число: \n");
        cin>>mas_date[i].chislo;
        cyrOut("Введите месяц (например: Февраль) : \n");
        cin>>mas_date[i].mes;
        cyrOut("Введите год: \n");
        cin>>mas_date[i].god;
        cyrOut("Введите время (часы): \n");
        cin>>mas_date[i].t.chasy;
        cyrOut("Введите время (минуты): \n");
        cin>>mas_date[i].t.minuty;
    }
        FILE *out;
        out = fopen("text.txt", "w");
        fwrite((void*)(&mas_date), sizeof(date), 1, out);
        fclose(out);
 
 
 
 
 
 
    return 0;
}
Попробовал так - тоже криво.

Добавлено через 1 час 24 минуты
Всё, с первой частью вроде разобрался


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <fstream>
#include "stdafx.h"
#include <conio.h>
#include <Windows.h>
#include <iostream>
#include <string>
using namespace std;
 
#define cyrOut(_string_) CharToOem(_string_,szStr);\
cout << szStr
char szStr[512];
 
 
 
#define N 2 //Количество дат
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{ 
    struct date {
              short chislo;
              char mes[15];
              short god;
              struct vremya {
                short chasy;
                short minuty;
              } t;
 
           };
 
    struct date mas_date[N];
    
 
    
    for (int i=0;i<N;i++)
    {
        cyrOut("\n\n*** Дата ");cout<<i+1<<" ***\n\n";
        cyrOut("Введите число: \n");
        cin>>mas_date[i].chislo;
        cyrOut("Введите месяц: \n");
        cin>>mas_date[i].mes;
        cyrOut("Введите год: \n");
        cin>>mas_date[i].god;
        cyrOut("Введите время (часы): \n");
        cin>>mas_date[i].t.chasy;
        cyrOut("Введите время (минуты): \n");
        cin>>mas_date[i].t.minuty;
    }
        
 
 
        FILE *fp;
        fp = fopen("date.txt", "w");
        
        for (int i = 0; i < N; i++)
        {
                fprintf(fp, "\n\n*******\n");    
                fprintf(fp, "%d ", mas_date[i].chislo);
                fprintf(fp, "%s ", mas_date[i].mes);
                fprintf(fp, "%d\n", mas_date[i].god);
                fprintf(fp, "%d\:", mas_date[i].t.chasy);
                fprintf(fp, "%d\n", mas_date[i].t.minuty);
        }
        fclose(fp);
    return 0;
}
0
grizlik78
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,050
08.06.2011, 23:20 #15
Цитата Сообщение от accept Посмотреть сообщение
C++
1
ofstream os("text.txt", ios::binary);
Несколько неожиданно видеть бинарный флаг для файла с расширением txt
0
cx5xclxxl9
0 / 0 / 1
Регистрация: 12.05.2011
Сообщений: 23
08.06.2011, 23:39  [ТС] #16
Теперь у меня проблемы со чтением, компилятор выдаёт ошибку:
"Stack around the variable 'read_date' was corrupted"

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
// laba4.cpp: определяет точку входа для консольного приложения.
//
 
#include <fstream>
#include "stdafx.h"
#include <conio.h>
#include <Windows.h>
#include <iostream>
#include <string>
using namespace std;
 
#define cyrOut(_string_) CharToOem(_string_,szStr);\
cout << szStr
char szStr[512];
 
 
 
#define N 2 //Количество дат
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{ 
    struct date {
              short chislo;
              char mes[15];
              short god;
              struct vremya {
                short chasy;
                short minuty;
              } t;
 
           };
 
    struct date mas_date[N];
    
 
    
    for (int i=0;i<N;i++)
    {
        cyrOut("\n\n*** Дата ");cout<<i+1<<" ***\n\n";
        cyrOut("Введите число: \n");
        cin>>mas_date[i].chislo;
        cyrOut("Введите месяц: \n");
        cin>>mas_date[i].mes;
        cyrOut("Введите год: \n");
        cin>>mas_date[i].god;
        cyrOut("Введите время (часы): \n");
        cin>>mas_date[i].t.chasy;
        cyrOut("Введите время (минуты): \n");
        cin>>mas_date[i].t.minuty;
    }
        
 
 
        FILE *fp;
        fp = fopen("date.txt", "w");
        
        for (int i = 0; i < N; i++)
        {
                    
                fprintf(fp, "%d ", mas_date[i].chislo);
                fprintf(fp, "%s ", mas_date[i].mes);
                fprintf(fp, "%d\n", mas_date[i].god);
                fprintf(fp, "%d\:", mas_date[i].t.chasy);
                fprintf(fp, "%d\n\n", mas_date[i].t.minuty);
        }
        fclose(fp);
 
        system("PAUSE");
        
 
 
 
        struct date1 {
              short chislo;
              char mes[15];
              short god;
              struct vremya {
                short chasy;
                short minuty;
              } t;
 
           };
 
    struct date1 mas_date1[N];
 
        struct read_date {
              short chislo;
              char mes[15];
              short god;
              struct vremya {
                short chasy;
                short minuty;
              } t;
 
           };
 
    struct read_date read_date[N];
    
 
    /*cyrOut("\n\n          Введите интервал дат, в котором нужно произвести поиск \n");
    for (int i=1;i<2;i++)
    {
        cyrOut("\n\n*** Дата ");cout<<i<<" ***\n\n";
        cyrOut("Введите число: \n");
        cin>>mas_date1[i].chislo;
        cyrOut("Введите месяц: \n");
        cin>>mas_date1[i].mes;
        cyrOut("Введите год: \n");
        cin>>mas_date1[i].god;
        cyrOut("Введите время (часы): \n");
        cin>>mas_date1[i].t.chasy;
        cyrOut("Введите время (минуты): \n");
        cin>>mas_date1[i].t.minuty;
    } */
 
        FILE *fp1;
        fp1 = fopen("date.txt", "r");
        for (int i = 0; i < N; i++)
        {
                    
                fscanf(fp1, "%d %s %d\n%d\:%d\n\n", &read_date[i].chislo, &read_date[i].mes, &read_date[i].god, &read_date[i].t.chasy, &read_date[i].t.minuty);
                
                
        }
        fclose(fp1);
 
 
 
 
 
 
 
 
    return 0;
}
0
grizlik78
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,050
08.06.2011, 23:48 #17
Цитата Сообщение от cx5xclxxl9 Посмотреть сообщение
Теперь у меня проблемы со чтением, компилятор выдаёт ошибку:
"Stack around the variable 'read_date' was corrupted"
C
1
fscanf(fp1, "%d %s %d\n%d\:%d\n\n", &read_date[i].chislo, &read_date[i].mes, &read_date[i].god, &read_date[i].t.chasy, &read_date[i].t.minuty);
Возможно это оттого, что считываются переменные short int, а %d означают int.
Для коротких целых нужен шаблон %hd
Ну и для строки тоже не мешало бы ограничивать её длину в шаблоне. Вдруг строка будет больше буфера?
1
Avazart
Эксперт С++
7698 / 5607 / 543
Регистрация: 10.12.2010
Сообщений: 25,182
Записей в блоге: 17
08.06.2011, 23:53 #18
Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int n;
bool flag=0;
FILE *f;
char s[]="a.dat";
 
struct nr
  {
   char  fio[40],dol[10],zv[10];
   int n;
  } b;
//--------------------Добавление структуры в файл--------------------
    if ( (f=fopen(s,"ab+"))==NULL )  { ShowMessage("Файла нет!");return;}
       //....Ввод  полей структуры
    fwrite(&b,sizeof(nr),1,f);
    fclose(f);
//---------------Просмотр----------------
if ( (f=fopen(s,"rb"))==NULL )  { ShowMessage("Файла нет!");return;}
while(fread(&b,sizeof(nr),1,f))
  {
   //... вывод всех структур
  }
fclose(f);
0
cx5xclxxl9
0 / 0 / 1
Регистрация: 12.05.2011
Сообщений: 23
09.06.2011, 00:00  [ТС] #19
Цитата Сообщение от grizlik78 Посмотреть сообщение
Возможно это оттого, что считываются переменные short int, а %d означают int.
Для коротких целых нужен шаблон %hd
Сработало, спасибо
0
Avazart
Эксперт С++
7698 / 5607 / 543
Регистрация: 10.12.2010
Сообщений: 25,182
Записей в блоге: 17
09.06.2011, 00:03 #20
Если работаеш с бинарниым файлом то кракозяблы в самом файле это нормально.
0
09.06.2011, 00:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2011, 00:03

Работа со структурами
Цель работы: научиться объявлять структуру и работать с ее по-лями Помогите...

Работа со структурами
struct data_type { int day; int month; int year; ...

Работа со структурами
#include&lt;iostream.h&gt; #include&lt;math.h&gt; struct List { float fi,r,z; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru