Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 20.09.2021
Сообщений: 11

Найти сумму элементов массива структуры

20.09.2021, 02:16. Показов 3424. Ответов 10

Студворк — интернет-сервис помощи студентам
Нужно найти произведение элементов массивов prodolj и stoimost и вывести сумму этих значений. Не получается подобрать команду для выполнения произведения, а затем уже суммирования этих значений.

Написать программу, представляющую собой простейшую систему для управления
данными. Исходные данные для программы хранятся в текстовом файле в виде строк. Для
создания файла с исходными данными следует использовать простейший текстовый редактор
или редактор инструментальной среды разработки. Количество строк, требования к
содержимому строки, способ обработки определяются вариантом задания. В соответствии со
своим вариантом следует сконструировать структуру и на ее основе создать массив в
динамической памяти.
Действия, выполняемые программой:
1. Чтение данных из файла в динамический массив.
2. Просмотр данных, хранящихся в массиве.
3. Корректировка данных заданной строки.
4. Вычисления.
5. Сохранение данных в новом файле (имя файла вводится с клавиатуры).
Алгоритм работы программы должен предусматривать однократное чтение данных с
проверкой, многократное редактирование, просмотр записей, вычисления. Работа программы
завершается после сохранения данных в новом файле.

Количество строк: 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
#include <iostream>
#include <string>
#include <fstream> 
using namespace std; 
struct Razgovory
{
    char fam[5];
    int prodolj[5], stoimost[5]; //Фамилия, продолжительность(мин), стоимость 
};
void input_struct(Razgovory* p, int n)
{
    ifstream f("file.txt");
 
    for (int i = 0; i < 5; i++)
        f >> p[i].fam >> p[i].prodolj >> p[i].stoimost;
    f.close();
}
int main() {
    setlocale(LC_ALL, "rus");
    Razgovory* p = new Razgovory[5];
    input_struct(p, 5);
    for (int i = 0; i < 5; i++) {
        std::cout << "Фамилия: " << p[i].fam << "\n";
        std::cout << "Продолжительность разговора: " << p[i].prodolj << "\n";
        std::cout << "Стоимость: " << p[i].stoimost << "\n";
    }
    
 
    int sum;                                                    //Вот здесь и дальше уже возникают проблемы
    for (int i = 0; i < 5; i++) {
        sum += p[i].prodolj * p[i].stoimost;
    }
    return sum;
    delete[]p;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.09.2021, 02:16
Ответы с готовыми решениями:

Найти сумму тех элементов массива, цифровая запись которых дает четную сумму цифр, а также найти максимальный элемент массива
Вот, что есть.Помогите довести до ума! #include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; void...

Найти сумму элементов массива до первого элемента равного 0, и сумму оставшихся элементов (функции)
Дан массив а1, а2, …, а12. Вычислить сумму элементов этого массива до первого элемента, равного 0, и сумму оставшихся элементов.

Одномерные массивы и указатели (найти количество элементов массива, равных 0, сумму элементов массива...)
Помогите пожалуйста разработать программу и реализовать интуитивный понятный интерфейс (используя формы).При написании программы можно...

10
Модератор
 Аватар для long399
2882 / 1837 / 933
Регистрация: 16.10.2013
Сообщений: 5,242
Записей в блоге: 15
20.09.2021, 05:09
Цитата Сообщение от karzilla Посмотреть сообщение
C++
8
int prodolj[5], stoimost[5]; //Фамилия, продолжительность(мин), стоимость
Зачем вы задали эти переменные массивами? Для каждого экземпляра структуры вам нужно по одной переменной для хранения информации.

Лучше сделать переменную stoimost типа double. Ведь стоимость обычно указывается с копейками, например, 15,99.

Переменную prodolj нужно либо целочисленной делать (если продолжительность разговора округляется до целого кол-ва минут). В противном случае - вещественной.

Цитата Сообщение от karzilla Посмотреть сообщение
char fam[5];
Раз вы пишите на C++, то пользуйтесь его возможностями. Используйте класс std::string.

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
...
struct Razgovory
{
    //Фамилия, продолжительность(мин), стоимость 
    string fam;
    int prodolj;
    double stoimost;
};
 
void input_struct(Razgovory* p, int n)
{
    ifstream f("file.txt");
 
    for (int i = 0; i < 5; i++)
        f >> p[i].fam >> p[i].prodolj >> p[i].stoimost;
    f.close();
}
int main() {
    setlocale(LC_ALL, "rus");
    Razgovory* p = new Razgovory[5];
    input_struct(p, 5);
    for (int i = 0; i < 5; i++) {
        std::cout << "Фамилия: " << p[i].fam << "\n";
        std::cout << "Продолжительность разговора: " << p[i].prodolj << "\n";
        std::cout << "Стоимость: " << p[i].stoimost << "\n";
    }
    
    double sum = 0.0;
    for (int i = 0; i < 5; i++) {
        sum += p[i].prodolj * p[i].stoimost;
    }
    cout << sum;
    delete[]p;
    return 0;
}
1
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
20.09.2021, 09:59
просмотр записей и вычисления лучше вынести в отдельные функции
Цитата Сообщение от karzilla Посмотреть сообщение
Вычислить стоимость всех разговоров
если не пишется общую стоимость всех разговоров, можно также понимать как стоимость каждого разговора по-отдельности. мне кажется будет лучше, если при сохранении данных в новый файл (эту функцию нужно добавить) запишите кроме начальных данных (возможно отредактированных) стоимость каждого разговора
Цитата Сообщение от karzilla Посмотреть сообщение
чтение данных с проверкой
что за проверка неясно, можете например проверить файл на успешное открытие

добавьте этот пункт
Цитата Сообщение от karzilla Посмотреть сообщение
3. Корректировка данных заданной строки
т.е. изменение данных по номеру заданной строки в режиме
Цитата Сообщение от karzilla Посмотреть сообщение
многократное редактирование
т.е. в цикле
1
0 / 0 / 0
Регистрация: 20.09.2021
Сообщений: 11
22.09.2021, 01:57  [ТС]
Спасибо!!!!!
Новая проблема - теперь не получается изменить данные, компьютер их просто не заносит в массив...

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    int s = 1; int j,n; string f;
    while (s == 1) { //Изменение данных
        cout << "Вы хотите изменить данные строки? 0-Нет, 1-Да\n";
        cin >> s;
        if (s == 1) {
            sum = 0;
            cout << "Какую позицию Вы хотите изменить? (Введите число от 0 до 4)\n";
            cin >> j;
            cout << "Введите Фамилию абонента\n";
            cin >> f;
            p[j].fam = f;
            cout << "Введите продолжительность разговора в минутах (целое число)\n";
            cin >> n;
            p[j].prodolj = n;
            cout << "Введите стоимость минуты разговора (целое число)\n";
            cin >> n;
            p[j].stoimost = n;
            cena = p[j].prodolj * p[j].stoimost;
            sum += sum + cena;
        }
    }
0
Модератор
 Аватар для long399
2882 / 1837 / 933
Регистрация: 16.10.2013
Сообщений: 5,242
Записей в блоге: 15
22.09.2021, 05:13
Цитата Сообщение от karzilla Посмотреть сообщение
Новая проблема - теперь не получается изменить данные, компьютер их просто не заносит в массив
в чем это проявляется? приложите весь код.
1
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
22.09.2021, 11:00
karzilla, в цикле редактирования особых ошибок нет, только уберите вычисления (последние строки)
не используйте транслит, замените:
string fam;
int prodolj;
double stoimost;
C++
1
2
3
string surname;
int _time;
double cost;
можно конечно менять определённую позицию в строке (например чтобы изменить продолжительность разговора не обязательно заново вводить фамилию), но я оставил так как у Вас только подредактировал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int s=1, j;
while (s == 1) { // Изменение данных
cout << "Вы хотите изменить данные строки? 1 - Да, 0 - Нет\n";
cin >> s;
if (s == 1){            
    cout << "Какую строку Вы хотите изменить? (Введите число от 1 до 5)\n";
    cin >> j;
    j--;
    cout << "Введите фамилию абонента\n";
    cin >> p[j].surname;            
    cout << "Введите продолжительность разговора в минутах (целое число)\n";
    cin >> p[j]._time;            
    cout << "Введите стоимость минуты разговора (целое число)\n";
    cin >> p[j].cost;            
}
}
Цитата Сообщение от karzilla Посмотреть сообщение
не получается изменить данные
показывайте весь код
1
0 / 0 / 0
Регистрация: 20.09.2021
Сообщений: 11
22.09.2021, 22:27  [ТС]
Вот код. Почему-то при выводе нумерация начинается не с 1, а с 0, хотя я указала "i+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
#include <iostream>
#include <string> // подключаем строки
#include <fstream> // подключаем файлы
 
using namespace std; // используем стандартное пространство имен
 
struct Razgovory { //Фамилия, продолжительность(мин), стоимость 
    string surname;
    int _time, cost;
};
 
int main() {
    setlocale(LC_ALL, "Russian");
    Razgovory* p = new Razgovory[5]; //Создание массива структур
    ifstream f("file.txt"); //Ввод данных из файла
    for (int i = 0; i < 5; i++)
        f >> p[i].surname >> p[i]._time >> p[i].cost;
    f.close();
 
    int cena, sum;
    for (int i = 0; i < 5; i++) { //Вывод данных
        cout << (1 + i) << ") Фамилия абонента: " << p[i].surname << "\n";
        cout << "Продолжительность разговора в мин: " << p[i]._time << "\n";
        cout << "Стоимость минуты разговора: " << p[i].cost << "\n";
        cena = p[i]._time * p[i].cost;
        cout << "Цена: " << cena << "\n";
        sum += cena;
    }
    cout << "________________" << "\n" << "Стоимость всех разговоров: " << sum << "\n";
    
    int s = 1, j;
    while (s == 1) { // Изменение данных
        cout << "Вы хотите изменить данные строки? 1 - Да, 0 - Нет\n";
        cin >> s;
        if (s == 1) {
            cout << "Какую строку Вы хотите изменить? (Введите число от 1 до 5)\n";
            cin >> j;
            j--;
            cout << "Введите фамилию абонента\n";
            cin >> p[j].surname;
            cout << "Введите продолжительность разговора в минутах (целое число)\n";
            cin >> p[j]._time;
            cout << "Введите стоимость минуты разговора (целое число)\n";
            cin >> p[j].cost;
        }
    }
        
    delete []p; 
    return 0;
}
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
23.09.2021, 05:28
karzilla, не удаляйте функции, а наоборот добавляйте новые

лучше заменить переменную Razgovory на data (данные)

немного подправил функцию чтения:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void GetDataFile (data* p, int n) // получение (чтение) данных файла
{
    ifstream in("input.txt");
 
    if (in.is_open())
    {
        for (int i = 0; i < n; i++)
            in >> p[i].surname >> p[i]._time >> p[i].cost;
        in.close();
    }
    else cout << "Unable to open file\n";
}
Цитата Сообщение от karzilla Посмотреть сообщение
ничего не изменяется
почему так решили если после редактирования не печатаете данные ? добавьте функцию печати и вызывайте её:
#include <iomanip> // подключите

C++
1
2
3
4
5
6
void PrintData (data* p, int n)
{
    cout << "SURNAME         TIME   COST\n";
    for (int i = 0; i < n; i++)    
        cout << setw(20) << left << p[i].surname << setw(10) << left << p[i]._time << " " << p[i].cost << "\n";
}
функцию редактирования организуйте самостоятельно. внесите изменения и показывайте что получается. вывод в файл добавите позже тоже отдельной функцией. сообщите если что-то не работает
1
Модератор
 Аватар для long399
2882 / 1837 / 933
Регистрация: 16.10.2013
Сообщений: 5,242
Записей в блоге: 15
23.09.2021, 05:29
Цитата Сообщение от karzilla Посмотреть сообщение
Почему-то при выводе нумерация начинается не с 1, а с 0, хотя я указала "i+1"
При выводе данных из файла? С единицы она начинается. Или при каком выводе?

Цитата Сообщение от karzilla Посмотреть сообщение
Также прошу помочь с написанием кода для вывода данных в новый файл...
После цикла while:
C++
1
2
3
4
5
6
7
ofstream out("file_new.txt");
if (out) {
    for (int i = 0; i < 5; i++) {
        out << p[i].surname << " " << p[i]._time << " " << p[i].cost << "\n"; 
    }
    out.close();
}
P.S. лучше оформить в функцию, как писали выше.
1
0 / 0 / 0
Регистрация: 20.09.2021
Сообщений: 11
23.09.2021, 23:16  [ТС]
Всё получилось, спасибо!!!
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
#include <iostream>
#include <string> // подключаем строки
#include <fstream> // подключаем файлы
#include <iomanip> // подключаем ввод
 
using namespace std; // используем стандартное пространство имен
 
struct _data { // Фамилия, продолжительность(мин), стоимость 
    string surname;
    int _time, cost;
};
 
void GetDataFile(_data* p) // Ввод данных из файла
{
    ifstream in("111.txt");
 
    if (in.is_open())
    {
        for (int i = 0; i < 5; i++)
            in >> p[i].surname >> p[i]._time >> p[i].cost;
        in.close();
    }
    else cout << "Unable to open file\n";
}
 
void PrintData(_data* p) { // Вывод данных на экран
    int sum = 0, cena;
    cout << "SURNAME\tTIME\tCOST\tPay\n";
    for (int i = 0; i < 5; i++) {
        cena = p[i]._time * p[i].cost;
        sum += cena;
        cout << p[i].surname << "\t" << p[i]._time << "\t" << p[i].cost << "\t" << cena << "\n";
        
    }
    cout << "TOTAL COST: " << sum << "\n";
}
 
void Change(_data* p) { // Изменение данных
    bool s = 1; int j;
    while (s) { 
        cout << "Вы хотите изменить данные строки? 1 - Да, 0 - Нет\n";
        cin >> s;
        if (s) {
            cout << "Какую строку Вы хотите изменить? (Введите число от 1 до 5)\n";
            cin >> j;
            j--;
            cout << "Введите фамилию абонента (до 7 символов)\n";
            cin >> p[j].surname;
            cout << "Введите продолжительность разговора в минутах (целое число)\n";
            cin >> p[j]._time;
            cout << "Введите стоимость минуты разговора (целое число)\n";
            cin >> p[j].cost;
            PrintData(p);
        }
    }
}
 
void Output_Data(_data* p) { // Запись в новый файл
    ofstream out("file_new.txt");
    if (out) {
        for (int i = 0; i < 5; i++) {
            out << p[i].surname << " " << p[i]._time << " " << p[i].cost << "\n";
        }
        out.close();
    }
}
 
int main() {
 
    setlocale(LC_ALL, "Russian");
 
    _data* p = new _data[5]; // Создание массива структур
 
    GetDataFile(p); // Вызов ф-и ввода данных в массив
 
    PrintData(p); // Вызов ф-и вывода данных на экран
 
    Change(p); // Вызов ф-и изменения данных
 
    bool y;
    cout << "Вы хотите записать новые данные в файл? 1 - Да 0 - Нет\n";
    cin >> y;
    if (y) Output_Data(p);
        
    delete []p; 
    return 0;
}
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
23.09.2021, 23:52
Цитата Сообщение от karzilla Посмотреть сообщение
Всё получилось, спасибо!!!


_data - уберите подчёркивание (ставил на time т.к. слово time используется в функции)

выходной файл должен содержать результаты вычислений, добавьте

input.txt - входящий файл
название результирующего файла вводится с клавиатуры - это реализуйте

в функции Print не производите вычисления. можете сделать 2 функции Print (для начального и результирующего файла)

я Вам выравнивание делал при выводе - верните на место

передачу размера массива в функции тоже верните

Добавлено через 7 минут
struct Phone // наименование структуры

// объявление массива:
C++
1
2
const int n=5;
Phone* data = new Phone[n];
Добавлено через 3 минуты
Цитата Сообщение от karzilla Посмотреть сообщение
(до 7 символов)
уберите это. я там поставил 20 символов - для фамилии достаточно

стоимость минуты разговора не обязательно целое число
Цитата Сообщение от karzilla Посмотреть сообщение
int cost;
C++
1
double cost;
Цитата Сообщение от karzilla Посмотреть сообщение
Вы хотите записать новые данные в файл?
это спрашивать не нужно - данные записываются в новый файл по условию задачи
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.09.2021, 23:52
Помогаю со студенческими работами здесь

Функции в с++. Найти сумму элементов массива D, а также суммы квадратов и кубов элементов массива D.
Запутался уже -_- Куда че пихать не могу понять... Дан произвольный массив D размера k. Найти сумму элементов массива D, а также суммы...

Найти сумму элементов массива, равных среднему арифметическому всех элементов массива
здравствуйте я студентка первого курса и мы изучаем С и С++ работам в борланде моя задача,над которой я бьюсь, на одномерный массив ...

Найти количество положительных элементов массива; найти сумму элементов, расположенных после заданного
В одномерном массиве, состоящем из n целых элементов, вычислить: 1) Количество положительных элементов массива; 2) Сумму элементов...

Найти сумму n первых элементов массива и произвидения m посдедних элементов массива
не могу врубиться как написать эту прогу С клавиатуры вводится массив Т найти сумму n первых элементов массива и произвидения m...

Найти сумму элементов массива, начиная с N позиции, каждых N элементов через каждые N элементов
Как-то так


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru