Выдает ошибку в 47 строке. "Выражение должно иметь тип указателя на объект"

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
forevercom
Сообщения: 3
Зарегистрирован: 19 ноя 2017, 17:11

03 дек 2017, 11:31

задание звучит так:Фирма имеет 10 магазинов. Информация о доходе каждого магазина за
каждый месяц года хранится в двумерном массиве (первого магазина — в первой
строке, второго — во второй и т. д.). Составить программу для расчета
среднемесячного дохода любого магазина. Ввод, вывод элементов массива, а также требуемые
действия реализовать с помощью подпрограмм. Все подпрограммы должны иметь
независимый интерфейс.

Код: Выделить всё

#include "stdafx.h"
#include <iostream>
#include <clocale>
#include <time.h>
#include <iomanip>

using namespace std;
const int N = 10;
const int M = 12;
void input(int mas[N][M]);
void output(int mas[N][M]);
void sum(int mas[N][M], int i, int sumn);

void main()
{
	int j, i, sumn;
	int mas[N][M];
	input(mas);
	output(mas);
	sum(mas,i, sumn);
	cin >> i;
	sumn = 0;
	cout << "\nAverage monthly income of the store № " << i << "=" << sumn / 12;

	system("pause");
}
void input(int mas[N][M])
{
	srand(time(NULL));
	for (int i = 0; i < N; i++)
		for (int j = 0; j < M; j++)
			mas[i][j] = rand() % 100;
}
void output(int mas[N][M])
{
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < M; j++)
			cout << setw(3) << mas[i][j] << " ";
		cout << endl;
	}
}
void sum(int mas,int i, int sumn)
{
	sumn = 0;
	for (int j = 0; j<M; j++) sumn += mas[i, j];
}
forevercom
Сообщения: 3
Зарегистрирован: 19 ноя 2017, 17:11

03 дек 2017, 11:33

Ввод, вывод элементов массива, а также требуемые
действия реализовать с помощью подпрограмм. Все подпрограммы должны иметь
независимый интерфейс
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

03 дек 2017, 12:05

1. Почему протитипы объявления и определения функции sum отличаются? Собственно, попытка два раза разыменовать int и приводит к указанной ошибке.

2. В функцию sum передаётся неинициализированное значение i. Так как i создано на стеке, без инициализации там будет лежать "мусор", что приведёт к крашу программы при запуске.

3. Есть предположение, что вызов функции sum должен быть опущен вниз на два строки, так как зануление переменной sumn прямо перед её выводом так же выглядит нелогичным.

4. Вижу, что ты пытаешься вернуть сумму через параметр sumn. Для того, чтобы это сделать, параметр нужно превратить в ссылку, так как на данный момент внутри функции sum ты просто модифицируешь копию переменной, созданной на стеке.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
forevercom
Сообщения: 3
Зарегистрирован: 19 ноя 2017, 17:11

03 дек 2017, 12:47

Romeo писал(а):1. Почему протитипы объявления и определения функции sum отличаются? Собственно, попытка два раза разыменовать int и приводит к указанной ошибке.

2. В функцию sum передаётся неинициализированное значение i. Так как i создано на стеке, без инициализации там будет лежать "мусор", что приведёт к крашу программы при запуске.

3. Есть предположение, что вызов функции sum должен быть опущен вниз на два строки, так как зануление переменной sumn прямо перед её выводом так же выглядит нелогичным.

4. Вижу, что ты пытаешься вернуть сумму через параметр sumn. Для того, чтобы это сделать, параметр нужно превратить в ссылку, так как на данный момент внутри функции sum ты просто модифицируешь копию переменной, созданной на стеке.
Я уже разобралась с этой проблемой, спасибо :)
Слива
Сообщения: 133
Зарегистрирован: 19 мар 2016, 10:15

03 дек 2017, 20:36

Я ничего не понял. Он тебе указал на ошибки, за которые ты должна была сказать спасибо и исправить их. Но потом ты сказала, что уже разобралась с этой проблемой. Зачем ты создавала тему-то вообще? Тебе помощь еще нужна по этой программе?
Программа вся кривая и косая+еще ошибка, вот это: mas[i, j]; - пишется не так, а вот так:
mas[j];
Вот как надо программы писать:

Код: Выделить всё

//---------------------------------------------------------------------------
#include <vcl>
#include <iostream>
#include <conio>
#include <iomanip>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
using namespace std;
const int N = 10;
const int M = 12;
Massiv2[N][M] = {0};

void input(int (*mas)[M])
{
    int i, j;
    srand(time(NULL));
    for(int i = 0; i < N; i++)
        for(int j = 0; j < M; j++)
            mas[i][j] = rand()%100;
}

void output(int (*mas)[M])
{
    cout << "\nMassiv2:\n";
    for(int i = 0; i < N; i++)
    {
        for(int j = 0; j < M; j++)
            cout << setw(2) << mas[i][j] << " ";
        cout << endl;
    }
}

void Summa(int (*z)[M], int i, int &Sum)
{
    Sum = 0;
    for(int j = 0; j < M; j++)
        Sum += z[i][j];
}

int main(int argc, char* argv[])
{
int Nomer = 0, z = 8;

input(Massiv2);
output(Massiv2);
cout << "Vvedite nomer magazina ot 1 do 10:\n";
cin >> Nomer;
Summa(Massiv2, Nomer-1, z);
cout << "\nSumma = " << z << "\n";
cout << "\nAverage monthly income of the store N" << Nomer << " = " << z/12;

getch();
return 0;
}
//---------------------------------------------------------------------------
:D
Ответить