Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.11.2012, 18:15   #1
eskelevra
Новичок
Джуниор
 
Регистрация: 20.07.2012
Сообщений: 2
По умолчанию Выборка чисел из двухмерного массива на С

Всем привет! Задача заключается в следующем: Найти среднее арифметическое всех положительных чисел выше главной диагонали квадратной матрицы. Вот мой листинг:

Код:
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>

int main(void)
{
	int N,i,j;
	srand(time(NULL));
	do
	{
		printf("Введите размер матрицы массива(целое положительное число): \n");
		scanf("%d",&N);
		if (N<=0)
		{
			printf("N должно быть больше 0 !!!\n");
		}
	}
	while (N<=0);

	int x[N][N];

	printf("Наполнение массива случайными числами...\n");

	for(i=0; i<=N; i++)
	{
		for(j=0; j<=N; j++)
		{
			x[i][j]=rand()%10;
			printf("%d,%d: %d\n",i,j,x[i][j]);
		}
	}

	int sum = 0;
	int count = 0;

	for(i=0; i<=N; i++)
	{
		for(j=0; j<=N; j++)
		{
			if(N>1)
			{	
				if (j-i>=1 && x[i][j]%2 == 0 && x[i][j] != 0)
				{
					sum += x[i][j];
					count++;
					printf("i=%d, j=%d\n",i,j);
					printf("summa = %d\n", sum);
				}			
			}
			else
			{
				if(x[0][1]%2==0)
				{
					sum = x[0][1];
					count = 1;
					break;
				}
				else
				{
					printf("i=%d, j=%d\n",i,j);
					sum = 0;
					count = 1;
					break;
				}	
			}
		}
	}
	sum = sum/count;
	printf("Среднее арифметическое всех положительных чисел выше главное диагонали равно : %d\n", sum);
}
Проблема заключается в том что сумма чисел вычисляется не правильно! Подскажите что именно у меня не так? Спасибо!

Последний раз редактировалось Stilet; 05.11.2012 в 18:38.
eskelevra вне форума Ответить с цитированием
Старый 08.11.2012, 16:59   #2
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,326
По умолчанию

Давайтика я разберу программу. И так, по порядку.

1) Не нужно подключать файл (include), который вы не используете.

Код:
#include <math.h>
В файле math.h хранятся прототипы (объявления) математических функций.

2) Используйте динамический или статический массивы. И проверяйте корректность входных данных.

Вдруг пользователь введёт что-то неприличное! Тогда мы должны с ним благородно расстаться.

Статический двумерный массив.

При использовании статического массива нужно сообщить пользователю максимальный размер, который он сможет использовать:



И если пользователь введёт вместо размера матрицы символ "не число":



Нормальный исход:



Код:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define MAXSIZE 5

int main()
{
    int iRow, iCol;
    int iSizeOfMatrix = 0;
    int iErrorCode = 0;

    // Static Matrix
    int iMatrix[MAXSIZE][MAXSIZE];

    // Size of the Matrix
    printf("Enter a Size of Matrix. The Size of Matrix must be: (0; %d]\n", MAXSIZE);
    printf("> ");
    iErrorCode = scanf("%d", &iSizeOfMatrix);

    // Check the Size of the Matrix
    if (iErrorCode != 1) {
        fprintf(stderr, "\nError: you have entered incorrect data!\n\n");
        return 1;
    }
    if (iSizeOfMatrix <= 0 || MAXSIZE < iSizeOfMatrix) {
        fprintf(stderr, "\nError: size of Matrix must be: (0; %d]\n\n", MAXSIZE);
        return 1;
    }

    // Initialize random seed
    srand(time(NULL));

    // Fill the Matrix
    for (iRow = 0; iRow < iSizeOfMatrix; iRow++) {
        for (iCol = 0; iCol < iSizeOfMatrix; iCol++) {
            iMatrix[iRow][iCol] = rand() % 10 + 1;;
        }
    }

    // Print the Matrix
    printf("\nMatrix:\n");
    for (iRow = 0; iRow < iSizeOfMatrix; iRow++) {
        for (iCol = 0; iCol < iSizeOfMatrix; iCol++) {
            printf("%3.d", iMatrix[iRow][iCol]);
        }
        putchar('\n');
    }

    putchar('\n');
    return 0;
}
Динамический двумерный массив.

При использовании динамического массива размер матрицы ограничен памятью компьютера. Функция для выделения памяти malloc вернёт NULL если запрос памяти у операционной системы неудачен. Я в примере сам ограничил размер массива.



Код:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define MAXSIZE 5

int main()
{
    int iRow, iCol;
    int iSizeOfMatrix = 0;
    int iErrorCode = 0;

    // Dynamic array
    int **ippMatrix;

    // Size of the Matrix
    printf("Enter a Size of Matrix. The Size of Matrix must be: (0; %d]\n", MAXSIZE);
    printf("> ");
    iErrorCode = scanf("%d", &iSizeOfMatrix);

    // Check the Size of the Matrix
    if (iErrorCode != 1) {
        fprintf(stderr, "\nError: you have entered incorrect data!\n\n");
        return 1;
    }
    if (iSizeOfMatrix <= 0 || MAXSIZE < iSizeOfMatrix) {
        fprintf(stderr, "\nError: size of Matrix must be: (0; %d]\n\n", MAXSIZE);
        return 1;
    }

    // Allocate memory
    ippMatrix = (int**) malloc(iSizeOfMatrix*sizeof(int));
    if (ippMatrix == NULL) {
        fprintf(stderr, "\nError: memory could not be allocated!\n\n");
        return 1;
    }
    for (iRow = 0; iRow < iSizeOfMatrix; iRow++) {
        ippMatrix[iRow] = (int*) malloc(iSizeOfMatrix*sizeof(int));
        if (ippMatrix[iRow] == NULL) {
            fprintf(stderr, "\nError: memory could not be allocated!\n\n");
            return 1;
        }
    }

    // Initialize random seed
    srand((unsigned int)time(NULL));

    // Fill the Matrix
    for (iRow = 0; iRow < iSizeOfMatrix; iRow++) {
        for (iCol = 0; iCol < iSizeOfMatrix; iCol++) {
            ippMatrix[iRow][iCol] = rand() % 10 + 1;;
        }
    }

    // Print the Matrix
    printf("\nMatrix:\n");
    for (iRow = 0; iRow < iSizeOfMatrix; iRow++) {
        for (iCol = 0; iCol < iSizeOfMatrix; iCol++) {
            printf("%3.d", ippMatrix[iRow][iCol]);
        }
        putchar('\n');
    }

    putchar('\n');

    // Deallocate space in memory 
    for (iRow = 0; iRow < iSizeOfMatrix; iRow++){  
        free(ippMatrix[iRow]);  
    } 
    free(ippMatrix);

    return 0;
}
3) Если у вас main возвращает значение, то не забывайте писать return.

Код:
int main()
{
    return 0;
}
P.S. Венгерская нотация - http://xoax.net/cpp/ref/core/incl/hungarian_notation/
P.S.S. Теперь ваша очередь. Жду от вас: "среднее арифметическое всех положительных чисел выше главной диагонали квадратной матрицы"

Последний раз редактировалось 8Observer8; 08.11.2012 в 17:15.
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перемешивание двухмерного массива stenl1 Общие вопросы C/C++ 10 22.11.2016 06:26
Заполнение двухмерного массива _PrizraK_ Общие вопросы Delphi 1 01.05.2011 14:23
перестановка строк двухмерного массива imperceptible4462 Помощь студентам 4 10.09.2010 13:04
Сортировка строк двухмерного массива EfiopianDIMON Общие вопросы C/C++ 9 26.05.2009 22:52
Передача двухмерного массива в функцию IgorKr Общие вопросы C/C++ 2 28.03.2008 01:11