Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите найти ошибку 
:(
    Опции темы
amelie
Дата 23.5.2009, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 23.5.2009

Репутация: -1
Всего: -1



Код

// progr1.h

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

struct Point
{
    double x,y,z;
};

Point *a = (Point *)calloc(20, sizeof(struct Point));

double dist(Point p,Point q)
{
 double m1, k1, l1, m2, k2, l2, r1, r2, r3, R;
       m1 = p.x;
       m2 = q.x;
             r1=(m1-m2)*(m1-m2);
       l1 = p.y;
       l2 = q.y;
             r2=(l1-l2)*(l1-l2);
       k1 = p.z;
       k2 = q.z;
             r3=(k1-k2)*(k1-k2);


             
    R = sqrt(r1+r2+r3);

return R;
}


int main()
  {
  double result;
  int i;
  Point n1[20];
       for(i=0; i<20; i++){
            *(a+i) = n1[i];
                n1[i].x = rand();
                n1[i].y = rand();
                n1[i].z = rand();
  }
   int t;
        for (t=0; t<20; t++)
        if(!a){
        printf("Ошибка при распределении памяти \n");
        exit(1);}
        double n[20];
        int j;
             for(i=0; i<20; i++){
               for (j=0;j<20;j++){
                  double m1;
                  double max[20];
                  m1 = dist(*(a+i),*(a+j));
                  n[j] = m1;
                  max[j]=n[0];
                  int k;
                     for(k=0;k<20;k++){             
                        if(max[j]<n[k])             
      max[j]= n[k];}
}
     double maxDist[20];                                 
 for(j=0;j<20;j++){             
  if(maxDist[i]<n[j])             
      maxDist[i]= n[j];
  int r;
  for(r=0; r<20; r++){
result = n[0];
if(result<maxDist[r])             
      result = maxDist[r];}


}
}
 system("pause");
printf("%d", result);
return 0;
}





В чем ошибка. Компилято ошибок не выдает но при запуске работает неправильно. 
Должна искать диаметр множества двадати точек.
PM MAIL   Вверх
zim22
Дата 23.5.2009, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(amelie @  23.5.2009,  18:49 Найти цитируемый пост)
Должна искать диаметр множества двадати точек.

программа делает то, что вы ей указываете. она ничего вам не должна. и бутылкой водки вы её не подкупите.


--------------------
PM MAIL   Вверх
amelie
Дата 23.5.2009, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 23.5.2009

Репутация: -1
Всего: -1



zim22,  вот я и хочу понять что конкретно у меня не правильно. Ну или хотя бы в каком кучке программы.

PM MAIL   Вверх
zim22
Дата 23.5.2009, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



amelie, используйте пошаговую отладку.


--------------------
PM MAIL   Вверх
amelie
Дата 23.5.2009, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 23.5.2009

Репутация: -1
Всего: -1



zim22,  Спасибо за понимание.
PM MAIL   Вверх
andrew_121
Дата 24.5.2009, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(amelie @  23.5.2009,  19:13 Найти цитируемый пост)
zim22,  Спасибо за понимание. 

За что на него обижаться? Он же дело сказал!
Я вот пытался понять как программа работает...но похоже не выспался... smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Dmi3ev
Дата 24.5.2009, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



amelie, а почему нельзя сразу?
Код

n[j] = dist(*(a+i),*(a+j));

строка  57
и ваще у программы плохо продумана логика... лень разбираться, на первый взгляд, она ваще не то делает...
а переменные (счетчики в цикле) объявлены не в цикле, а перед, причем раз на раз не приходится, то ты используешь ту же, то вводишь новую... хз, чем ты руководствуешься  smile 
о форматировании я ваще молчу, так с первого взгляда и не скажешь, где начало, где конец циклов, где еще че...
короче этот код написан по системе путай-путай

Добавлено через 12 минут и 57 секунд
1)
Цитата

                     for(k=0;k<20;k++){             
                        if(max[j]<n[k])             
      max[j]= n[k];}

как так ваще можно написать? я хз, это ведь единое целое
цикл
    условие (относится к циклу)
         действие... (относится к условию)
2)цикл, который начинается в строке 53 казалось уже закончился в 64 хотя бы, ан нет, он заканчивается в 77
3) 
Цитата

printf("%d", result);

а какого х.. у тебя стоит %d, если result имеет тип double? а выводишь ты целое... во дает...  smile 
хотя бы %f поставь, может тогда прога будет делать, что ты хочешь...  smile 
4)
Цитата

 system("pause");
printf("%d", result);

в первой строке есть небольшое смещение (один пробельчик), а во второй нет, почему? время пошло, уважаемы знатоки  smile 
против вас играет amelie из... (а из какого места не скажу  smile  не написано   smile ) 
ради интереса скажи, как ты определяешь когда надо поставить пробельчик, а когда нет, когда сдвинуть код, когда нет...
когда вводить новую переменную для цикла, когда нет?


--------------------

PM MAIL   Вверх
Dmi3ev
Дата 24.5.2009, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



Цитата

system("pause");
printf("%d", result);

а нах на паузу ставить перед а не после вывода результата, только ща подумал про этот идиотизм, или тебя вдохновляет пустой экран в консоли с надписью для продолжения...  smile я себе на память код скопировал, а проект назвал proJOPA  smile 
Даже если ты не перец в программировании, все равно так писать нельзя, читать неудобно ваще...

Добавлено через 9 минут и 16 секунд
Цитата

Point *a = (Point *)calloc(20, sizeof(struct Point));

а почему она глобальная?
Цитата

       for(i=0; i<20; i++){
            *(a+i) = n1[i];

а зачем создавать а динамически и выделять память (в данном слчае), если она имеет постоянное количество элементов? Если сам не знаешь сколько, то я тебе скажу, что их 20  smile и не придется писать суперпроверку:
Цитата

   int t;
        for (t=0; t<20; t++)
        if(!a){
        printf("Ошибка при распределении памяти \n");
        exit(1);}

зы
советую еще увеличить количество переменных, тогда будет рекорд по количеству переменных на кв. м кода...


--------------------

PM MAIL   Вверх
andrew_121
Дата 24.5.2009, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Dmi3ev, После твоих коментов, врядли ей захочется еще постить smile  smile  smile  smile  smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Dmi3ev
Дата 24.5.2009, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



andrew_121, не ну я не со зла, просто, по-моему мнению это так! 
может я и не прав вовсе, может у нее (или у него) все ок на самом деле...
а может и прав, тогда человек прислушается к замечаниям и исправит все быстренько...
amelie, не обижайся, я этого совсем не хотел! по-моему даже грубого особо ничего не сказал, а если обидел, то не со зла уж точно... 


--------------------

PM MAIL   Вверх
andrew_121
Дата 24.5.2009, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(Dmi3ev @  24.5.2009,  10:20 Найти цитируемый пост)
может я и не прав вовсе, может у нее (или у него) все ок на самом деле...

...

Цитата(Dmi3ev @  24.5.2009,  10:20 Найти цитируемый пост)
а может и прав, тогда человек прислушается к замечаниям и исправит все быстренько...

Был тут пару дней назад один студик. Так я его код покритиковал, а он не понял что это хорошая критика.... Так вот. Кодом моим он все-же воспользовался. И спасибо не сказал...### smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
amelie
Дата 24.5.2009, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 23.5.2009

Репутация: -1
Всего: -1



ммм а чего обижаться - то? это моя первая прога, и это нормально что не получается ничего.  Спасибо что ответили, а не как zim22  тупо послали.
вчера пыталась разобраться поняла что дейстительно в программе логика нарушена но все же таки она у меня не работает(
еще раз написала ... Вы считаете не стоит память выделять? а почему?
во второй программе  почему-то генерируются отрицательные значения, как сделать чтобы получались типа double от 0 до 1???
и почему-то даже функция отрицательные выдает...может она неправильно написана?
Код

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
struct Point
{
    double x,y,z;
};
double dist(Point p,Point q)
{
 double m1, k1, l1, m2, k2, l2, r1, r2, r3, R;
       m1 = p.x;
       m2 = q.x;
             r1=(m1-m2)*(m1-m2);
       l1 = p.y;
       l2 = q.y;
             r2=(l1-l2)*(l1-l2);
       k1 = p.z;
       k2 = q.z;
             r3=(k1-k2)*(k1-k2);


             
    R = sqrt(r1+r2+r3);

return R;
}

int main(){

 Point arr[20];
 int i,j,k,l,m;
 double matrix[20][20];
 double maxelement; 
 for(i=0; i<20;i++){
                arr[i].x = rand();
                arr[i].y = rand();
                arr[i].z = rand();
 }
 for(k=0;k<20;k++){
     for(j=0;j<20;j++){
         matrix[k][j] = dist(arr[k],arr[j]);
     }
 }
 maxelement=matrix[0][0];
 for(l=1;l<20;l++){
     for(m=0;m<20;m++)
      if(maxelement<matrix[l][m])
         maxelement=matrix[l][m];
     
 }

printf("%f", maxelement);
int t;
scanf("%i", t);
return 0;
}




Код

// progr1.h

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

struct Point
{
    double x,y,z;
};

double dist(Point p,Point q)
{
 double m1, k1, l1, m2, k2, l2, r1, r2, r3, R;
       m1 = p.x;
       m2 = q.x;
             r1=(m1-m2)*(m1-m2);
       l1 = p.y;
       l2 = q.y;
             r2=(l1-l2)*(l1-l2);
       k1 = p.z;
       k2 = q.z;
             r3=(k1-k2)*(k1-k2);


             
    R = sqrt(r1+r2+r3);

return R;
}


int main()
  {
 double maxDist; 
  Point *a = (Point *)calloc(20, sizeof(struct Point));
  int i;
  Point n1[20];
       for(i=0; i<20; i++){
            *(a+i) = n1[i];
                n1[i].x = rand();
                n1[i].y = rand();
                n1[i].z = rand();
  }
  
        int j;
        double n[20];
        double max[20];
             for(i=0; i<20; i++){
                  for (j=0;j<20;j++){
                      double m1;
                      m1 = dist(*(a+i),*(a+j));
                      n[j] = m1;
                      max[i]=n[0];
                      int k;
                          for(k=0;k<20;k++){             
                             if(max[i]<n[k]);            
                             max[i]=[k];}
                  }         
             maxDist = max[i];
                     for(j=0;j<20;j++){             
                        if(maxDist<n[i])             
                          maxDist =    n[i];
                     }
             }
printf("%f", maxDist);
return 0;
}


Это сообщение отредактировал(а) amelie - 24.5.2009, 15:06
PM MAIL   Вверх
andrew_121
Дата 24.5.2009, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Да. Вторая версия твоего кода написана куда лучше! smile 
По поводу rand() - она генерит целые числа в диапазоне от -INT_MAX до +INT_MAX. А тебе нужно другое. Я не в курсе этого. Сорри.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
xvr
Дата 25.5.2009, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



В строке 45 ошибка - цикл нужно делать от 0, иначе все точки вида (0,1-N) не войдут в сравнение.
Замечание - совсем не обязательно сохранять матрицу расстояний, если в конце концов нужен только максимум - вычисляй его сразу
Код

maxelement = 0.;
 for(k=0;k<20;k++){
     for(j=0;j<20;j++){
         double d=dist(arr[k],arr[j]);
         if (d>maxelement) maxelement=d;
     }
 }

PM MAIL   Вверх
amelie
Дата 26.5.2009, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 23.5.2009

Репутация: -1
Всего: -1



Большое спасибо за советы.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0902 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.