Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Kulibin474
0 / 0 / 0
Регистрация: 19.03.2012
Сообщений: 5
#1

Массив струкур - C++

19.03.2012, 15:06. Просмотров 541. Ответов 6
Метки нет (Все метки)

Здравствуйте! В универе задали написать лабу, такое вот задание:
Определить структурированный тип и набор функций для работы с таблицей записей, реализованной в массиве структур. В перечень функций входят:

· ввод записи таблицы с клавиатуры;
· загрузка и сохранение таблицы в текстовом файле;
· просмотр таблицы;
· сортировка таблицы в порядке возрастания заданного поля;
· поиск в таблице элемента с заданным значением поля или с наиболее близким к нему по значению;
· удаление записи;
· изменение (редактирование) записи;
· вычисление с проверкой и использованием всех pfgbctq по заданному условию и формуле (например, общая сумма на всех счетах).

Запоролся уже на вводе, т.к. вылазит ошибка при вводе строки. Подскажите, что нужно исправить. Вот код:

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
#include<iostream>
#include<fstream>
#include<conio.h>
#include<string.h>
#include<stdio.h>
#include<new>
 
using namespace std;
 
void create_base(int n);
 
struct base {
    int pnumber;
    int snumber;
    char* txt;
    int dd,mm,yy;} base_list;
 
void main()
    {
    setlocale(LC_ALL,"russian");
    char c;
    int n;
           cout << "1 - Новая таблица, 2 - Загрузка таблицы" << endl;
    for(;;1) {
        c=getchar();
        if ((c == '1') || (c == '2')) break;}
    if (c == '1') {cout << "Введите количество записей таблицы:" << endl;
            cin >> n;
            create_base(n);
            }
    if (c == '2') cout << "Загрузка таблицы";
    _getch();
    }
 
void create_base(int n)
    {   base* arr;
        ofstream f("file.txt");
        arr = (base*)calloc(n, sizeof(base));
        cout << "Введите записи:" << endl;
        for (int i=0; i<n; i++) {
            cin >> arr[i].pnumber >> arr[i].snumber;
            gets(arr[i].txt);
            f << arr[i].pnumber << endl << arr[i].snumber << endl << endl;
            for(int j=0; j<strlen(arr[i].txt); j++)
                f << arr[i].txt[j];
            }
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.03.2012, 15:06     Массив струкур
Посмотрите здесь:

Нужно записать массив в файл, а потом из этого файла считать этот же массив C++
Массив: Составить массив из двух исходных по заданному принципу заполнения C++
Дан массив A[N]. заполнить массив В[N] элементами массива A[N], которые удовлетворяют двойному неравенству C++
Массив: Переписать элементы одномерного массива A, попадающие в интервал [2, 6], в массив B. C++
C++ Найти ошибку. Записать 20 целых чисел в массив. Переписать отрицательные в массив А, а положительные в Б
Файлы и массив (сделать так, чтобы массив заполнялся значениями из этого же файла) C++
C++ Задано массив строк произвольной длины. Отформатировать данный массив по ширине поля.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mustik
56 / 56 / 2
Регистрация: 10.07.2011
Сообщений: 229
19.03.2012, 16:43     Массив струкур #2
Цитата Сообщение от Kulibin474 Посмотреть сообщение
Определить структурированный тип
Мне кажется это должно выглядеть так:
C++
1
2
3
4
5
6
7
8
9
typedef struct
{
    int pnumber;
    int snumber;
    char* txt;
    int dd,mm,yy;
} base;
 
base base_list;
А на счет char *gets( char * str ) - это функции не нравится ваш указатель. Попробуйте сначала
C++
1
2
arr[i].txt = new char[256];
А потом уже gets( arr[i].txt );
Kulibin474
0 / 0 / 0
Регистрация: 19.03.2012
Сообщений: 5
20.03.2012, 11:24  [ТС]     Массив струкур #3
Немного переделал create_base, посчитал, что calloc и new смешивать как-то не очень. Также в определение структурного типа добавил typedef. Но все равно все работает криво, программа записывает в файл вот что:

86
16

-33686019
-1414812757

John

И при этом срабатывает ввод только одной записи
Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void create_base(int n)
    {   base* arr;
        ofstream f("file.txt");
        arr = new base[n-1];
        cout << "Введите записи:" << endl;
        for (int i=0; i<n; i++) {
            cin >> arr[i].pnumber >> arr[i].snumber;
            arr[i].txt = new char[256];
            gets(arr[i].txt);
            f << arr[i].pnumber << endl << arr[i].snumber << endl << endl;
            for(int j=0; j<strlen(arr[i].txt); j++)
                f << arr[i].txt[j];
            }
           }
Mustik
56 / 56 / 2
Регистрация: 10.07.2011
Сообщений: 229
20.03.2012, 12:50     Массив струкур #4
Программа почему-то путается при работе с cin и gets. То останавливается и ждет ввода с клавиатуры, то просто игнорирует функцию gets. Не могу объяснить данное явление. Надо попробовать переделать структуру функции, вариантов больше у меня нет.
easybudda
Эксперт С++
9439 / 5462 / 925
Регистрация: 25.07.2009
Сообщений: 10,481
20.03.2012, 14:03     Массив струкур #5
Цитата Сообщение от Mustik Посмотреть сообщение
Программа почему-то путается при работе с cin и gets. То останавливается и ждет ввода с клавиатуры, то просто игнорирует функцию gets. Не могу объяснить данное явление.
А вот не нужно смешивать стили ввода данных С и С++, не будет таких странностей. На самом деле и объект сласса istream (cin) и функция чтения из потока (gets) буферизируют ввод, но делают это по-разному. В результате тот ввод, которого ждёт gets, может в буфере cin дожидаться, когда это его оттуда прочитают...
Mustik
56 / 56 / 2
Регистрация: 10.07.2011
Сообщений: 229
21.03.2012, 09:43     Массив струкур #6
Цитата Сообщение от easybudda Посмотреть сообщение
А вот не нужно смешивать стили ввода данных С и С++, не будет таких странностей.
Пробовал заменять gets на cin.getline, не помогало.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2012, 17:00     Массив струкур
Еще ссылки по теме:

Создать третий массив, в котором собрать элементы массива A, которые не включаются в массив B C++
Записать все положительные элементы матрицы в массив arrP, а отрицательные - в массив arrN C++
C++ Дан массив из 25 элементов. Сформировать из него новый массив, элементы которого кратны 5
C++ Описать класс Массив, найти массив, состоящий из элементов первого и второго массива

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

Или воспользуйтесь поиском по форуму:
Kulibin474
0 / 0 / 0
Регистрация: 19.03.2012
Сообщений: 5
21.03.2012, 17:00  [ТС]     Массив струкур #7
Такая же проблема, cin.getline не помогает. Не знаю что и делать
Yandex
Объявления
21.03.2012, 17:00     Массив струкур
Ответ Создать тему
Опции темы

Текущее время: 22:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru