Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/49: Рейтинг темы: голосов - 49, средняя оценка - 4.82
0 / 0 / 1
Регистрация: 12.05.2011
Сообщений: 23
1

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

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

Author24 — интернет-сервис помощи студентам
Имеется вот такая задача:

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

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

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


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

Добавлено через 16 минут
Помогите, пожалуйста, очень срочно нужно.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.06.2011, 21:00
Ответы с готовыми решениями:

Работа со структурами
определить структуры, описывающие шар и точку в трехмерном пространстве. написать функции ввода и...

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

Работа со структурами
Организовать файл с указанной структурой в задании 1. Осуществить просмотр данных файла, которые...

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

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

А потом путем доступа к элементам списка и доступа элементам структуры сравнивать нужные параметры
1
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
Рожденная для битвы
293 / 71 / 14
Регистрация: 08.11.2009
Сообщений: 1,260
07.06.2011, 21:52 4
С массивами я не работала, так что точно не могу сказать

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

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

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

Ты понял насчет массива, как его создавать?
0
0 / 0 / 1
Регистрация: 12.05.2011
Сообщений: 23
07.06.2011, 22:26  [ТС] 7
Ага, сейчас попробую написать
0
Рожденная для битвы
293 / 71 / 14
Регистрация: 08.11.2009
Сообщений: 1,260
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
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
Рожденная для битвы
293 / 71 / 14
Регистрация: 08.11.2009
Сообщений: 1,260
07.06.2011, 23:11 10
Цитата Сообщение от cx5xclxxl9 Посмотреть сообщение
struct date mas_date[N];
struct date.vremya mas_time[N];
Мне кажется, это можно в одном массиве создать
0
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
Рожденная для битвы
293 / 71 / 14
Регистрация: 08.11.2009
Сообщений: 1,260
08.06.2011, 00:01 12
Цитата Сообщение от cx5xclxxl9 Посмотреть сообщение
ofstream os("text.txt");
Это кажется считывание из файла
Попробуй ifstram
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
08.06.2011, 07:50 13
C++
1
ofstream os("text.txt", ios::binary);
1
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
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
08.06.2011, 23:20 15
Цитата Сообщение от accept Посмотреть сообщение
C++
1
ofstream os("text.txt", ios::binary);
Несколько неожиданно видеть бинарный флаг для файла с расширением txt
0
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
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
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
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
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
0 / 0 / 1
Регистрация: 12.05.2011
Сообщений: 23
09.06.2011, 00:00  [ТС] 19
Цитата Сообщение от grizlik78 Посмотреть сообщение
Возможно это оттого, что считываются переменные short int, а %d означают int.
Для коротких целых нужен шаблон %hd
Сработало, спасибо
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.06.2011, 00:03 20
Если работаеш с бинарниым файлом то кракозяблы в самом файле это нормально.
0
09.06.2011, 00:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.06.2011, 00:03
Помогаю со студенческими работами здесь

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

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

Работа со структурами
1. Надо обьявить тип структура с полями базовых типов, указателей и массивов 2. Создать и...

Работа со структурами
У меня есть структура, содержащая фамилии учеников и их оценки по 3 предметам. Как мне посчитать...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru