Страница 1 из 1

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

Добавлено: 03 дек 2017, 11:31
forevercom
задание звучит так:Фирма имеет 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];
}

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

Добавлено: 03 дек 2017, 11:33
forevercom
Ввод, вывод элементов массива, а также требуемые
действия реализовать с помощью подпрограмм. Все подпрограммы должны иметь
независимый интерфейс

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

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

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

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

4. Вижу, что ты пытаешься вернуть сумму через параметр sumn. Для того, чтобы это сделать, параметр нужно превратить в ссылку, так как на данный момент внутри функции sum ты просто модифицируешь копию переменной, созданной на стеке.

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

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

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

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

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

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

Добавлено: 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