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

Где можно прочитать про перевод структуры в массив - C++

Восстановить пароль Регистрация
 
Bar1V1en
0 / 0 / 0
Регистрация: 11.05.2012
Сообщений: 9
16.10.2012, 00: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
58
59
60
61
62
#include <fstream>
#include <string>
#include <iostream>
#include <conio.h>
 
using namespace std;
 
struct SPIS 
{
int num[2];
char avtor[13];
char kto[16];
float stoit[10];
};
 
int i,j;
float midle;
 
int main(void)
{
    fstream file;
    file.open("Task4.in", ios::in);
 
    if (!file) 
    {
        printf("Net faila \n");
        return 0;
    }
    struct SPIS BOOK[10];
    for (i=0; i<2; i++)
// ошибка на этих строчках
    printf("%2i", BOOK[i].num);
    for (i=3; i<17; i++)
    printf("%3s", BOOK[i].avtor);
    for (i=18; i<36; i++)
    printf("%16s", BOOK[i].kto);
    for (i=37; i<50; i++)
    printf("%f", BOOK[i].stoit);
 
    float sum;
    sum=0;
    int n;
    n=0;
    for (i=0; i<10; i++)
    {
        for (j=0; j<10; j++)
        {
            sum=(sum + BOOK[i].stoit[j]);
            
        }
        n=(n + 1);
    }
    midle=sum/n;
 
    fstream fileout;
    fileout.open("Task4.out", ios::in);
     fileout << "Stoimost " << midle << endl;
     fileout.close();
     file.close();
    system("pause");
    return 0;
};
Кликните здесь для просмотра всего текста
// Progect.cpp: определяет точку входа для консольного приложения.
// Вариант 10, В текстовом файле ''Task4.in'' содержится список
// книг библиотеки, имеющий следующий вид:
// 01 Иванов Программирование 20,500
// 15 Петров Архиваторы 7.200
// Каждая строка списка содержит сведения об одной книге: пер*
// вые две позиции - порядковый номер книги, третья позиция - "про*
// бел", с поз. 4 начинается фамилия автора длиной не более 13 симво*
// лов, поз. 18...34 - название книги (из одного слова), поз. 35 - "про*
// бел", с поз. 36 - стоимость книги.
// Написать: 1) определение массива структур для хранения ука*
// занного списка и фрагмент программы для чтения списка из файла
// "Task4Jn''; 2) фрагмент программы, вычисляющей и печатающей
// среднюю стоимость книг в библиотеке в файл ''Task4.ouf

Кликните здесь для просмотра всего текста
Файл Task4.in
01 Иванов Программирование 20.500
02 Сидоров История 8.500
03 Петров Архиваторы 7.200
04 Хрящев Философия 9.300
05 Трупки Геометрия 10.500
06 Хиндрик Алгебра 4.850
07 Ололоев Жизнь 100
08 Сысоев Бармадун 1.100
09 Тренькин Хрен 6.123
10 Здоровяк Астрономия 7.698

С уважением
Bar1V1en
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
 Аватар для vxg
2659 / 1670 / 156
Регистрация: 13.01.2012
Сообщений: 6,215
16.10.2012, 08:48     Где можно прочитать про перевод структуры в массив #2
все плохо...

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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include <fstream>
#include <iostream>
using namespace std;
 
struct SPIS
{
int num;
char avtor[13];
char kto[16];
float stoit;
};
 
#pragma argsused
int main(int argc, char* argv[])
{
    SPIS BOOK[10];
 
    fstream file;
    file.open("Task4.in", ios::in);
    if (!file)
    {
        cout << "Net faila" << endl;
        system("pause");
        return 0;
    }
 
    for (int i = 0; i < 10; i++)
    {
        file >> BOOK[i].num >> BOOK[i].avtor >> BOOK[i].kto >> BOOK[i].stoit;
    }
 
    file.close();
 
    float midle = 0;
    int n = 0;
    for (int i = 0; i < 10; i++)
    {
        midle += BOOK[i].num * BOOK[i].stoit;
        n += BOOK[i].num;
    }
    midle /= n;
 
    fstream fileout;
    fileout.open("Task4.out", ios::out);
    fileout << "Stoimost " << midle << endl;
    fileout.close();
 
    system("pause");
    return 0;
}
//---------------------------------------------------------------------------
Bar1V1en
0 / 0 / 0
Регистрация: 11.05.2012
Сообщений: 9
16.10.2012, 15:50  [ТС]     Где можно прочитать про перевод структуры в массив #3
Спасибо большое за предоставленное решение, но всё-таки где можно почитать о конкретном переходе из структуры в массив? По отдельноти об этих темах куча материала, а вот вместе я не нашел.
Ещё вопрос по этой строке -
midle += BOOK[i].num * BOOK[i].stoit;
Разве не верно будет так:
midle += BOOK[i].stoit; ? Ведь в первом случае мы умножаем номер книги на её сумму.

С уважением
Bar1V1en
vxg
Модератор
 Аватар для vxg
2659 / 1670 / 156
Регистрация: 13.01.2012
Сообщений: 6,215
16.10.2012, 17:13     Где можно прочитать про перевод структуры в массив #4
1 что значит о переходе из структуры в массив? мне кажется вы хотите узнать о следующем: как изменяется программа в случае если мы переходим от хранения полей структуры в отдельных массивах (стоимости в отдельном массиве, названия в другом массиве и т.д.) к хранению полей в собственно структуре а структур в массиве. тогда ответ - почитать наверное нигде нельзя. просто в первом случае вы каждый вид данных сохраняете в отдельный массив, а во втором случае все данные относящиеся к одной позиции сохраняются в структуре, ну а поскольку позиций несколько, то естественно заводится не одна структура, а массив структур.

2 все зависит от смысла закладываемого в фразу "средняя стоимость книг в библиотеке". если средняя, ммм... в качественном смысле, то действительно необходимо просто усреднять стоимость (получается мы как бы получаем среднюю стоимость произвольной позиции продукции). если же имеется ввиду именно средняя стоимость книги (сколько можно получить денег в расчете на книгу если распродать всю библиотеку), то нужно посчитать стоимость всех книг лежащих в библиотеке и разделить их на общее количество книг.
Bar1V1en
0 / 0 / 0
Регистрация: 11.05.2012
Сообщений: 9
30.10.2012, 17:04  [ТС]     Где можно прочитать про перевод структуры в массив #5
Здравствуйте!
Помогите пожалуйста организовать проверку массива на пустой элемент.
Сам код.
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 <fstream> // библиотека для работы с файлами
#include <iostream> // библиотека для работы с потоками
 
using namespace std; // использование стандартных имён
 
struct SPIS // формирование структуры
{
int num; // номер книг
char avtor[13]; // авторы книг
char kto[16]; // предмет книг
float stoit; // стоимость книг
};
 
int main() //инициализация программы
{
    SPIS BOOK[10]; // объявление массива структуры
    float midle = 0;// идентификация новой переменной для подсчёта средней стоимости
    int n = 0;//идентификация новой переменной для нумерации
 
    fstream file; // открытие файла с данными
    file.open("Task4.in", ios::in); // указание имени файла
    fstream fileout;//открытие файла в который будем записывать данные
    fileout.open("Task4.out", ios::out);// указание имени файла
    if (!file) // проверка отсутствия файла
    {
        fileout << "Нет файла" << endl; // Проверка того, что начальный файл есть
        return 0;//возвращение значения
    }
 
    for (int i = 0; i < 10; i++)// забитие данных массива в подмассивы
    {
        file >> BOOK[i].num >> BOOK[i].avtor >> BOOK[i].kto >> BOOK[i].stoit;
    }
     file.close();// закрытие начального файла
 
    for (int i = 0; i < 10; i++)// цикл подсчёта средней стоимости одной книги
    {
        midle += BOOK[i].stoit;
        n ++;
    }
    midle /= n; // вычисляем среднюю стоимоть книг
 
    fileout << "Средняя стоимость книги = " << midle << endl;// запись данных в файл
    fileout.close();// закрытие конечного файла
 
    return 0;
}
Данные файла TASK4.IN
Кликните здесь для просмотра всего текста

01 Иванов Программирование 1.5
02 Сидоров История 2.6
03 Петров Архиваторы 3.7
04 Хрящев Философия 2.95
05 Геометрия 4.86
06 Хиндрик Алгебра 0.48
07 Ололоев 7.62
08 Сысоев начерталка 9.45
09 Тренькин Дифуры 4.36
10 Здоровяк Астрономия 2

Нужно написать проверку того, что все фамилии/предметы введены.
Вижу алгоритм этой проверки в следующем порядке:
Считывание массива -> проверка на отсутствие элементов -> вывод ошибки.
К сожалению так не получается, т.к. данные из файла считываются сплошняком, данные смещаются и получается белиберда. Пробовал реализовать это дело в такой форме:
C++
1
2
3
4
5
6
7
8
9
10
11
if (BOOK[i].num = 0)
            fileout << " Не введён номер книги № " << i ;
        file >> BOOK[i].num >> BOOK[i].avtor ;
        if (BOOK[i].avtor = 0)
            fileout << " Не введён автор книги №" << i ;
        file >> BOOK[i].num >> BOOK[i].avtor >> BOOK[i].kto ;
        if (BOOK[i].kto = " ")
            fileout << " Не введёно название книги №" << i ;
        file >> BOOK[i].num >> BOOK[i].avtor >> BOOK[i].kto >> BOOK[i].stoit;
        if (BOOK[i].stoit = 0)
            fileout << " Не введёна стоимость книги №" << i ;
Но также не вышло.
vxg
Модератор
 Аватар для vxg
2659 / 1670 / 156
Регистрация: 13.01.2012
Сообщений: 6,215
30.10.2012, 22:18     Где можно прочитать про перевод структуры в массив #6
C++
1
2
3
4
5
6
7
8
9
    for (int i = 0; i < 10; i++)// забитие данных массива в подмассивы
    {
        file >> BOOK[i].num >> BOOK[i].avtor >> BOOK[i].kto >> BOOK[i].stoit;
        if (file.fail())
        {
             fileout << "Неполные данные для книги №" << i ;
             break;
        }
    }
Добавлено через 13 секунд
C++
1
2
3
4
5
6
7
8
9
    for (int i = 0; i < 10; i++)// забитие данных массива в подмассивы
    {
        file >> BOOK[i].num >> BOOK[i].avtor >> BOOK[i].kto >> BOOK[i].stoit;
        if (file.fail())
        {
             fileout << "Неполные данные для книги №" << i ;
             break;
        }
    }
Bar1V1en
0 / 0 / 0
Регистрация: 11.05.2012
Сообщений: 9
31.10.2012, 01:12  [ТС]     Где можно прочитать про перевод структуры в массив #7
Спасибо большое!
Что обозначает .fail ? То что данные стали не верно считываться? Из какого раздела эти штукенции типа .open .clouse .fail ?(как они называются?) Где можно про это дело почитать? А то обычно в учебниках описываются поверхностно основные принципы.

С уважением
Bar1V1en

Добавлено через 8 минут
P.S. Я хотел бы сделать ещё красивее программу, т.е. что бы она дошла до конца и в случае, если ещё где-то что-то не заполнено написала об всех ошибках. А сейчас де факто он говорит, когда программа начинает читать не верные типы данных. Мне надо, что бы программа считывала пробел в массив, выводила об этом ошибку и продолжала бежать дальше.

что-то вроде
C++
1
2
if (char (32),char (32) ){
BOOK[i].avtor = char(32))}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2012, 09:55     Где можно прочитать про перевод структуры в массив
Еще ссылки по теме:

Где прочитать про Ws2_32.lib C++
C++ Прочитать информацию из файла и рассортировать как структуру, где хранятся данные про каждую книгу
C++ Подскажите пожалуйста где можно почитать про структуры

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

Или воспользуйтесь поиском по форуму:
vxg
Модератор
 Аватар для vxg
2659 / 1670 / 156
Регистрация: 13.01.2012
Сообщений: 6,215
31.10.2012, 09:55     Где можно прочитать про перевод структуры в массив #8
fail вернет true если при считывании данных был сбой. причина сбоя может быть любая: файл закончился, данные не могут быть конвертированы в нужный вам тип или еще что-то. почитать можно введя std::ios и нажав F1. или введя вопрос в Google. или в книжке про C++ и библиотеку std. дойти до конца при наличии ошибок в файле программа может быть и не сможет. точное место ошибки можно определить анализируя fail после каждой процедуры считывания (в моем примере это не расписано - в нем фиксируется ошибка чтения конкретной записи без детализации). после отлавливания ошибки оставшиеся записи могут быть прочитаны только если ошибка не захватила символ перевода строки. если вы продолжаете считывания после сбоя вам необходимо сбросить флаг сбоя через .clear(std::ios::failbit) что бы иметь возможность ловить следующий сбой.
Yandex
Объявления
31.10.2012, 09:55     Где можно прочитать про перевод структуры в массив
Ответ Создать тему
Опции темы

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