|
|
|
| В общем есть задача: в двумерном массиве m x n. Определить, что больше: произведение значений компонентов строки или произведение значений компонентов столбца, на пересечении которых находится наименьшее значение в массиве. Написал программу, с некоторыми матрицами работает, а в некоторых не корректно запоминает строки и столбец.
Проверял на матрице 3 х 3, элементы: 2 4 6 7 1 3 5 8 9. Помогите найти ошибку. Вот код:
#include <stdio.h>
#include <stdlib.h>
double main(void)
{
int i, j, m, n, tmp;
double **array;
printf("Stroki: ");
scanf("%d",&m);
printf("Stolbcy: ");
scanf("%d",&n);
array = (double**) malloc(m * sizeof(double*));
for (i=0; i<m; i++)
{
array[i] = (double*) malloc(n * sizeof(double));
}
// Ввод массива
printf("Input mass razmernosti %d x %d):\n", m, n);
for (i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
printf("(%d,%d) ", i+1, j+1);
if (scanf("%lf", &array[i][j]) != 1)
{
for (tmp=0; tmp<m; tmp++)
free(array[tmp]);
free(array);
return 0;
}
}
}
// Вывод массива
for (i=0; i<m; i++)
{
printf("\n\n");
for (j=0; j<n; j++)
printf("%7.1f", array[i][j]);
}
printf("\n\n");
double min; // min - минимальный элемент массива
int nstr, nstl; // номер строки и столбца, на пересечении котрых элемент находится
min = array [1][1];
for (i=0; i<m; i++)
{
for(j=0;j<n; j++)
{
if (array[i][j] < min)
{
nstr = i;
min = array [i][j];
nstl = j;
}
}
}
double pr1, pr2;
pr1=1; // произведение элементов строки
pr2=1; // произведение элементов столбца
for (j=0; j<n; j++)
{
pr1 = pr1 * array [nstr][j];
}
for (i=0; i<m; i++)
{
pr2 = pr2 * array [i][nstl];
}
printf("%7.1f", pr1);
printf("%7.1f", pr2);
return 0;
} | |
|
|
|
|
|
|
|
для: Min_Fin
(19.09.2009 в 06:39)
| | Хм... ничего не понимаю, а вы зачем сразу память освобождаете (free) при вводе значений, а потом далее в программе работаете с массивом array. Память следует освобождать только после того, как вы больше к массиву не обращаетесь - она, после освобождения, может быть занята кем угодно, хоть операционной системой, хоть другой программой.
for (i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
printf("(%d,%d) ", i+1, j+1);
if (scanf("%lf", &array[i][j]) != 1)
{
for (tmp=0; tmp<m; tmp++) free(array[tmp]);
free(array);
return 0;
}
}
} |
| |
|
|
|
|
|
|
|
для: cheops
(19.09.2009 в 11:46)
| | Ошибся.. Но ошибка ведь не в этом. Прога и без этого куска кода выдает ту же самую ошибку. | |
|
|
|
|
|
|
|
для: Min_Fin
(24.09.2009 в 17:47)
| | Это ошибка и она может вызывать проблема. А в чем точно заключается ошибка? В логике? | |
|
|
|
|
 2.1 Кб |
|
|
для: cheops
(25.09.2009 в 11:13)
| | Подскажите чего я недопонимаю. попробовал что-то похожее сделать чтобы было поменьшн ошибочных ситуаций при вводе недопустимых значений
, и сталкнулся с такой проблемой.
--------------------------------------------
переприкрепил код
--------------------------------------------
здесь в функции getlnum() , которая должна читать double с консоли,
решил что примерно так нужно сделать
if (x =='.') num = (num * 10) + ch - '0';
else num += (double)(ch-'0')/ (y *= 10);
, до запятой считывается как обычное число, а после запятой
прибавляется каждый раз по результату деления на 10,100,1000, ....
пришлось привести к типу double?, чтобы хоть-как-то работало.
, Но, все еденицы после запятой как-будто игнорируются,
ничего не могу понять почему даже похоже что умножения на 10 , не происходит
. | |
|
|
|
|
|
|
|
для: exp
(25.09.2009 в 20:20)
| | А вы в какой среде компилируете проект? Visual Studio? | |
|
|
|
|
|
|
|
для: cheops
(25.09.2009 в 20:55)
| | Да в VС9, только переписал почти все каталоги поиска включаемых файлов и библиотек, на совместимую с ней. 6.1 платформу SDK,
половину ещё не понимаю, сей час в debug-конфигурации такая строка компилятора
/Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MDd /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W3 /nologo /c /ZI /TP /errorReport:promp
(забыл переключить на /TC , но тоже компилируется как cpp /TP)
у линковщика вообще ужас , обычно
целая туча winApi библиотек, половина даже не убирается как-будто
, и ещё прилинковали эту msvcr90d.dll , которой нигде не записано
, сейчас стало жаловаться на то что всякие getch() нужно заменять на _getch()
, а scanf() на scanf_s(), и всякие переменные которые могут переполнить буфер, но вроде ничего так , терпимо пока :) | |
|
|
|
|
|
|
|
для: cheops
(25.09.2009 в 20:55)
| | Всё, я понял где ошибка :) привык наверное в браузере всё рассматривать
if (ch==x) { // всего одна точка
x='1';
continue;
}
Это там где я пропускал сравнивая символ с точкой , а когда запрещал точку, заменял содержимое x на еденицу
, даже думал об этом, перепросматривал, и не мог догадаться, окна мелковатые у этих IDE,
извиняюсь что так получилось | |
|
|
|
|
|
|
|
для: Min_Fin
(24.09.2009 в 17:47)
| | Ваш код компилируется после небольших поправок , запускается
, массив формируется, если не вводить слишком длинные числа или строки
, но у вас там я непонял почему у меня выводило два одинаковых дробных числа
, в скобочках, или так и должно было быть , я не понял :)
// UPD : перепутал не в скобках выводится , а просто
Такой вывод у меня получился Stroki: 2
Stolbcy: 2
Input mass razmernosti 2 x 2):
(1,1) 2.442
(1,2) .2
(2,1) 4.5
(2,2) 4.5
2.4 0.2
4.5 4.5
0.5 0.9 |
Я и не понял что должно быть вместо 0.5 _ 0.9 | |
|
|
|
|