Форум: Форум C++Разное
Новые темы: 00
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ошибка в коде. Не могу найти.
 
 автор: Min_Fin   (19.09.2009 в 06:39)   письмо автору
 
 

В общем есть задача: в двумерном массиве 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;
}

  Ответить  
 
 автор: cheops   (19.09.2009 в 11:46)   письмо автору
 
   для: 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;
      }
    }
  }

  Ответить  
 
 автор: Min_Fin   (24.09.2009 в 17:47)   письмо автору
 
   для: cheops   (19.09.2009 в 11:46)
 

Ошибся.. Но ошибка ведь не в этом. Прога и без этого куска кода выдает ту же самую ошибку.

  Ответить  
 
 автор: cheops   (25.09.2009 в 11:13)   письмо автору
 
   для: Min_Fin   (24.09.2009 в 17:47)
 

Это ошибка и она может вызывать проблема. А в чем точно заключается ошибка? В логике?

  Ответить  
 
 автор: exp   (25.09.2009 в 20:20)   письмо автору
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 , не происходит
.

  Ответить  
 
 автор: cheops   (25.09.2009 в 20:55)   письмо автору
 
   для: exp   (25.09.2009 в 20:20)
 

А вы в какой среде компилируете проект? Visual Studio?

  Ответить  
 
 автор: exp   (25.09.2009 в 21:25)   письмо автору
 
   для: 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(), и всякие переменные которые могут переполнить буфер, но вроде ничего так , терпимо пока :)

  Ответить  
 
 автор: exp   (25.09.2009 в 22:34)   письмо автору
 
   для: cheops   (25.09.2009 в 20:55)
 

Всё, я понял где ошибка :) привык наверное в браузере всё рассматривать
if (ch==x) { // всего одна точка
x='1';
continue;
}
Это там где я пропускал сравнивая символ с точкой , а когда запрещал точку, заменял содержимое x на еденицу
, даже думал об этом, перепросматривал, и не мог догадаться, окна мелковатые у этих IDE,
извиняюсь что так получилось

  Ответить  
 
 автор: exp   (25.09.2009 в 20:38)   письмо автору
 
   для: 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

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования