Консультация № 184975
26.12.2011, 20:33
79.19 руб.
0 17 1
Уважаемые эксперты! Пожалуйста, помогите написать последнюю лабораторную работу семестра:

Составить программу на языке Си, производящую обработку квадратной матрицы порядка NxN(1<=N<=8),из целых чисел, вводимой из стандартного входного текстового файла.

Вариант 3
Перестановка столбцов с максимальной и минимальной СУММОЙ элементов.

Программа нужна до четверга!

Заранее большое спасибо!
С уважением,
Иван.

Обсуждение

давно
Старший Модератор
312929
1973
27.12.2011, 06:18
общий
Уточните, пожалуйста, числа вводятся из файла или со стандартного ввода?
давно
Старший Модератор
312929
1973
27.12.2011, 07:09
общий
это ответ
Здравствуйте, Барс Иван!

Вот текст программы:
[code lang=cpp]
#include <stdio.h>
#include <limits.h>

int main()
{
unsigned char i, j, N, j_min, j_max;
long int a[8][8], s, s_min, s_max;
printf("N: ");
scanf("%u", &N);
for (i=0; i<N; i++)
{
printf("Row %u: ", i+1);
for (j=0; j<N; j++)
scanf("%d", &a[i][j]);
}
s_min = INT_MAX;
s_max = INT_MIN;
j_min = j_max = 0;
for (j=0; j<N; j++)
{
s = 0;
for (i=0; i<N; i++)
s += a[i][j];
if (s<s_min)
{
s_min = s;
j_min = j;
}
if (s>s_max)
{
s_max = s;
j_max = j;
}
}
for (i=0; i<N; i++)
{
s = a[i][j_min];
a[i][j_min] = a[i][j_max];
a[i][j_max] = s;
}
for (i=0; i<N; i++)
{
for (j=0; j<N; j++)
printf("%4d ", a[i][j]);
printf("\n", i);
}
return 0;
}
[/code]
Данные вводятся со стандартного ввода: сначала размер матрицы (от 1 до 8), потом - элементы (построчно). Результат также выводится построчно. Если нужен ввод из файла, сообщите в мини-форум, переделаю.
Неизвестный
27.12.2011, 07:10
общий
Из файла

С уважением,
Иван.
Неизвестный
27.12.2011, 07:13
общий
Адресаты:
Алексей,такой вариант программы устраивает.Не переделывайте!
Огромное спасибо!
Если возникнут вопросы,я напишу
Неизвестный
27.12.2011, 07:23
общий
Адресаты:
Объясните,пожалуйста,для чего используются библиотеки <stdlib> и <limits> ?
Неизвестный
27.12.2011, 07:27
общий
27.12.2011, 07:29
Адресаты:
при вводе матрицы 3х3 переставляет неправильные столбцы,проверьте,пожалуйста
В матрицах порядка больше 2х меняет местами первый и второй столбец,а не выполняет задание
давно
Старший Модератор
312929
1973
27.12.2011, 20:42
общий
Библиотека stdlib в принципе не нужна - в окончательной версии программы из неё ничего не используется. Из библиотеки limits берутся константы INT_MIN и INT_MAX, задающие минимальное и максимальное возможное значение для чисел типа int (если указывать его непосредственно, то эта библиотека тоже не нужна).

Что качается неправильной перестановки столбцов - можно пример, пожалуйста (исходной матрицы и получившегося результата)?
Неизвестный
27.12.2011, 21:06
общий
Адресаты:
Исходная матрица
1 2 3
1 2 3
1 2 3

Результат
3 2 1
3 2 1
3 2 1

Еще пример
Исходная матрица

2 7 8 3
1 1 1 1
7 7 7 7
3 4 19 1

2+1+7+3 = 13
7+1+7+4=19
8+1+7+19 = 35
3+1+7+1=12

12 - наименьшая сумма
35 - наибольшая сумма

Значит результат
2 7 3 8
1 1 1 1
7 7 7 7
3 4 1 19

Меняем местами столбцы с наименьшей и наибольшей суммой элементов.
давно
Старший Модератор
312929
1973
28.12.2011, 05:38
общий
Моя программа даёт такой же результат. Или у Вас не так?
Неизвестный
28.12.2011, 08:32
общий
Адресаты:
Пример:

N 3
Row 1: 1 1 1
Row 2: 25 1 1
Row 3: 1 1 40
1 1 1
1 25 1
1 1 40

почему так?
Неизвестный
28.12.2011, 08:33
общий
N 4
Row 1: 1 2 3 4
Row 2: 1 2 3 4
Row 3: 1 2 3 4
Row 4: 1 2 3 4
2 1 3 4
2 1 3 4
2 1 3 4
2 1 3 4

Опять таки,нужно менять местами 1й и 4й столбец,а меняет 1й и 2й
Неизвестный
28.12.2011, 08:37
общий
Адресаты:
N: 5
Row 1: 0 5 5 5 5
Row 2: 0 5 5 5 5
Row 3: 0 5 5 5 5
Row 4: 0 5 5 5 5
Row 5: 1 5 5 9 5
5 0 5 5 5
5 0 5 5 5
5 0 5 5 5
5 0 5 5 5
5 1 5 9 5

Алексей,проверьте,пожалуйста,программу.Очень нужна Ваша помощь, Вы последняя надежда..

С уважением,
Иван.
давно
Старший Модератор
312929
1973
28.12.2011, 15:57
общий
Даже и не знаю, что ещё может быть не так. Вы программу скопировали один в один? И какой у Вас компилятор C? Попробуйте матрицу, в которой нужно поменять местами, скажем, 3-й и 4-й столбец (не первый) - что получится? И вставьте в конец программы (перед return 0;) строку printf("min=%d (%d) max=%d (%d)", s_min, j_min, s_max, j_max); - что она будет выдавать после матрицы?
Неизвестный
28.12.2011, 17:17
общий
Адресаты:
ivan@ubuntu:~$ gcc -std=c99 laba15.c
laba15.c: In function ‘main’:
laba15.c:9:5: warning: format ‘%u’ expects type ‘unsigned int *’, but argument 2 has type ‘unsigned char *’
laba15.c:14:5: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘long int *’
laba15.c:44:5: warning: format ‘%4d’ expects type ‘int’, but argument 2 has type ‘long int’

GCC

Вот что пишет,если компилировать Вашу программу в таком виде,в каком она есть. Тем не менее файл a.out создается и далее при вводе данных происходит то,о чем я писал.

Если менять местами 3й и 4й:

ivan@ubuntu:~$ ./a.out
N: 4
Row 1: 6 7 8 9
Row 2: 6 7 8 9
Row 3: 9 9 1 9
Row 4: 9 5 1 9
7 6 8 9
7 6 8 9
9 9 1 9
5 9 1 9
ivan@ubuntu:~$

С функцией printf() в конце:

ivan@ubuntu:~$ gcc -std=c99 laba15.c
laba15.c: In function ‘main’:
laba15.c:9:5: warning: format ‘%u’ expects type ‘unsigned int *’, but argument 2 has type ‘unsigned char *’
laba15.c:14:5: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘long int *’
laba15.c:44:5: warning: format ‘%4d’ expects type ‘int’, but argument 2 has type ‘long int’
laba15.c:47:1: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘long int’
laba15.c:47:1: warning: format ‘%d’ expects type ‘int’, but argument 4 has type ‘long int’
ivan@ubuntu:~$ ./a.out
N: 4
Row 1: 6 7 8 9
Row 2: 6 7 8 9
Row 3: 9 9 1 9
Row 4: 9 5 1 9
7 6 8 9
7 6 8 9
9 9 1 9
5 9 1 9
min=2147483647 (0) max=28 (1)ivan@ubuntu:~$

Посмотрите,пожалуйста
С уважением,
Иван.
давно
Старший Модератор
312929
1973
28.12.2011, 21:14
общий
Как я и предполагал, всё дело, похоже, в разных компиляторах и ОС (у Вас - gcc под Ubuntu, у меня - Visual Studio под Windows). Попробую разобраться, в чём разница. Пока попробуйте поменять типы данных (например, char вместо unsigned char, int вместо long int).
Неизвестный
28.12.2011, 22:31
общий
Адресаты:
Спасибо огромное!Помощь больше не требуется,программу написал
Вот код,если интересно:
#include <stdio.h>
int main() {

int N, i, j, mas[8][8], sum[8], min, max;

printf("N: ");

scanf("%d", &N);

printf("Enter the matrix:\n");

for (i=0; i<N; i++) sum[i]=0;

for (i=0; i<N; i++) {

for (j=0; j<N; j++) {

scanf("%d", &mas[i][j]);

sum[j]+=mas[i][j];

}

}

min=max=0;

for (i=1; i<N; i++) {

if (sum[min]>sum[i]) min=i;

if (sum[max]<sum[i]) max=i;

}

for (i=0; i<N; i++) {

sum[i]=mas[i][max];

mas[i][max]=mas[i][min];

mas[i][min]=sum[i];

}

for (i=0; i<N; i++) {

for (j=0; j<N; j++) {

printf("%d ",mas[i][j]);

}

printf("\n");

}


}
давно
Старший Модератор
312929
1973
29.12.2011, 07:30
общий
И код получился хороший, намного короче первоначального, но задачу выполняет. Так держать!
Форма ответа