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

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

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

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

16.10.2012, 00:14. Просмотров 612. Ответов 7
Метки нет (Все метки)

Здравствуйте!

Подскажите где можно прочитать про перевод структуры в массив? У меня такая работа:

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
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.10.2012, 00:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Где можно прочитать про перевод структуры в массив (C++):

Где можно прочитать про АТД и структуру на С++? - C++
Не нашла такого раздела здесь Литература C++ где можно подробнее узнать по этой теме?( сайты, книжки, видеоуроки и т.п.) Срочно нужно...

Подскажите пожалуйста где можно почитать про структуры - C++
Подскажите пожалуйста где можно почитать про структуры Добавлено через 1 минуту Структуры – это составные типы данных, построенные с...

Где прочитать про Ws2_32.lib - C++
Не могу найти ничего про Ws2_32.lib. Ткните носом пожалуйста где есть документация по Ws2_32.lib или хотя бы написано что да как. Надо...

Где могу прочитать про основы ООП? - C++
Где могу прочитать про основы ООП?

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

Прочитать строку из файла и записать ее в массив структуры - C++
Подскажите как это сделать.Есть файлик со строчками,чтобы он каждую строчку считывал в массив,отличный от другого.Одна строка будет...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
vxg
Модератор
3163 / 1966 / 221
Регистрация: 13.01.2012
Сообщений: 7,528
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;
}
//---------------------------------------------------------------------------
1
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
0
vxg
Модератор
3163 / 1966 / 221
Регистрация: 13.01.2012
Сообщений: 7,528
16.10.2012, 17:13 #4
1 что значит о переходе из структуры в массив? мне кажется вы хотите узнать о следующем: как изменяется программа в случае если мы переходим от хранения полей структуры в отдельных массивах (стоимости в отдельном массиве, названия в другом массиве и т.д.) к хранению полей в собственно структуре а структур в массиве. тогда ответ - почитать наверное нигде нельзя. просто в первом случае вы каждый вид данных сохраняете в отдельный массив, а во втором случае все данные относящиеся к одной позиции сохраняются в структуре, ну а поскольку позиций несколько, то естественно заводится не одна структура, а массив структур.

2 все зависит от смысла закладываемого в фразу "средняя стоимость книг в библиотеке". если средняя, ммм... в качественном смысле, то действительно необходимо просто усреднять стоимость (получается мы как бы получаем среднюю стоимость произвольной позиции продукции). если же имеется ввиду именно средняя стоимость книги (сколько можно получить денег в расчете на книгу если распродать всю библиотеку), то нужно посчитать стоимость всех книг лежащих в библиотеке и разделить их на общее количество книг.
0
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 ;
Но также не вышло.
0
vxg
Модератор
3163 / 1966 / 221
Регистрация: 13.01.2012
Сообщений: 7,528
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;
        }
    }
1
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))}
0
vxg
Модератор
3163 / 1966 / 221
Регистрация: 13.01.2012
Сообщений: 7,528
31.10.2012, 09:55 #8
fail вернет true если при считывании данных был сбой. причина сбоя может быть любая: файл закончился, данные не могут быть конвертированы в нужный вам тип или еще что-то. почитать можно введя std::ios и нажав F1. или введя вопрос в Google. или в книжке про C++ и библиотеку std. дойти до конца при наличии ошибок в файле программа может быть и не сможет. точное место ошибки можно определить анализируя fail после каждой процедуры считывания (в моем примере это не расписано - в нем фиксируется ошибка чтения конкретной записи без детализации). после отлавливания ошибки оставшиеся записи могут быть прочитаны только если ошибка не захватила символ перевода строки. если вы продолжаете считывания после сбоя вам необходимо сбросить флаг сбоя через .clear(std::ios::failbit) что бы иметь возможность ловить следующий сбой.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2012, 09:55
Привет! Вот еще темы с ответами:

Где можно почитать про списки на C++? - C++
Подскажите пожалуйста или поделитесь полезной литературой) чтобы доступно и понятно было) Заранее огромное вам спасибо:)

Где можно почитать про списки на C/C++? - C++
Ну, вопрос, собственно, максимально отражен в теме: &quot;Где можно почитать про списки на C/C++?&quot; Хочу поподробнее разобраться в этой теме. ...

Где можно узнать про то как строить блок схемы по классам? - C++
В инете искал, так и не сумел найти как строить блок-схемы по классам сейчас изучаем ООП, препод у нас никакой поэтому я не знаю как...

Приведите пример, как можно связать знания консольного C++ (где алгоритмы, структуры, массивы) с WinAPI? - C++
WinAPI это чтобы взаимодействовать с виндой а вся сложность c++ обучают в консоли Вопрос:как можно связать знания по шаблонным...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
31.10.2012, 09:55
Ответ Создать тему
Опции темы

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