![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
Shmaniche |
![]() ![]()
Сообщение
#1
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 79 Пол: Мужской Репутация: ![]() ![]() ![]() |
Помогите найти ошибку в коде.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#define N 5
int main()
{ /* int mass[N]; */
int mass[N]={2, 4, 8, 16, 32}; // Объявляем массив.
int i, g, h, x, temp, NOD;
/* srand(unsigned(time(NULL))); // Запуск генератора случайных чисел. */
printf("\n Massiv iz 5 elementov: \n");
for(i=0; i<N; i++)
{
/* mass[i]=rand()%10+1; */
printf("\n Mass[%d] = %d. ", i, mass[i]);
}
if(mass[0]<mass[i]) // Если первый элемент массива меньше второго, тогда...
{ g=mass[i]; h=mass[0]; } // запомининаем след. элемент в перем-ой g, а первый в перем-ой h.
if(mass[0]>mass[i]) // Если первый элемент массива больше второго, тогда...
{ g=mass[0]; h=mass[i]; } // запомининаем первый элемент в перем-ой g, а след. в перем-ой h.
do // выполнять до тех пор...
{
if(g%h == 0) // если большее число делится на меньшее без остатка, тогда...
{ NOD=h; } // меньшее число и есть НОД.
else // Иначе.
{ temp=h;
h=g%h; // Второе станет остатком от деления.
g=temp; // А первое число вторым, значения которого записываем во временную переменную.
NOD=h; } // Пока НОДом будет второе число.
}
while(g%h!=0); // ...пока остаток от деления g и h элементов не перестанет быть равным 0.
if (NOD != 1) // Если НОД не равен 1...
{ printf("\n \n NOD = %d. \n", NOD); } // Выводим результат на экран.
else
{ printf("\n \n Chisla ne imeut obschih deliteley \n"); } // Числа не имеют общих делителей.
getch();
return 0;
}
Программа выдает, что общих делителей не найдено, хотя здесь НОД = 2. Генератор случайных чисел временно отключил, чтобы проверить программу на конкретных числах. Интересно, что когда я уменьшаю массив до 3 элементов и ввожу 2, 4, 8, то НОД находится верно (НОД=2). Сообщение отредактировано: Shmaniche - 27.05.2012 10:14 |
Shmaniche |
![]()
Сообщение
#2
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 79 Пол: Мужской Репутация: ![]() ![]() ![]() |
У кого-неибудь есть какие-нибудь мысли?
Сообщение отредактировано: Shmaniche - 30.05.2012 19:57 |
IUnknown |
![]()
Сообщение
#3
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Debugger + пошаговый проход по программе тебе помогут найти ошибку. Второй раз помогать чтоб ты потом опять начал "править" чужое решение, причем не разобравшись в нем - желающих нет.
|
Shmaniche |
![]() ![]()
Сообщение
#4
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 79 Пол: Мужской Репутация: ![]() ![]() ![]() |
Debugger + пошаговый проход по программе тебе помогут найти ошибку. Второй раз помогать чтоб ты потом опять начал "править" чужое решение, причем не разобравшись в нем - желающих нет. Твой код не содержал одну проверку, я пытался ее добавить. Твой код целиком и полностью я менять не собирался, но затем мне предложили другой вариант решения, который мне показался интереснее. Признайся просто что не знаешь где ошибка в коде и все, зачем обязательно хохлиться? Сообщение отредактировано: Shmaniche - 31.05.2012 8:14 |
-Федосеев Павел- |
![]()
Сообщение
#5
|
Гость ![]() |
Цитата Признайся просто что не знаешь где ошибка в коде и все, зачем обязательно хохлиться? Прикольно! Ты пытаешься взять "на слабо" вместо того, чтобы научиться пользоваться инструментом - пошаговым выполнением с наблюдением за состоянием переменных. |
Krjuger |
![]()
Сообщение
#6
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
Поверь,человек, которого ты пытаешся взять "на слабо" уже не первый год программирует и не на одном языке.
Твоя задача не является чем то сверх трудным,более того я бы сказал она банальна. Здесь никто не обязан помогать вам, а вы еще и что то требуете. |
Shmaniche |
![]() ![]()
Сообщение
#7
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 79 Пол: Мужской Репутация: ![]() ![]() ![]() |
Поверь,человек, которого ты пытаешся взять "на слабо" уже не первый год программирует и не на одном языке. Твоя задача не является чем то сверх трудным,более того я бы сказал она банальна. Здесь никто не обязан помогать вам, а вы еще и что то требуете. Я этого человека не знаю и не могу сказать какой он в жизни профи, я лишь вижу, что он ничего конкретного по теме не сказал. Свою версию кода не привел и новичка в ошибку в коде мордой не тыкнул. Зачем вообще создан этот раздел форума, если не решать поставленые задачи? Чтобы супер-пупер-гуру в С++ в очередной раз показывали, что они на столько круты, что им лень лень написать две, три строки кода? Тем более когда задача такая банальная. Сообщение отредактировано: Shmaniche - 31.05.2012 13:09 |
Игорь |
![]()
Сообщение
#8
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 56 Пол: Мужской Репутация: ![]() ![]() ![]() |
Кстати, программа твоя работает, вроде бы, правильно (правда не могу понять как именно). Код я немножко поправлял, но ничего серьёзного, так что перепроверь ещё раз.
#include <stdio.h>
#define N 5
int main() {
int mass[N] = {2, 4, 8, 16, 32};
int i, g, h, x, temp, NOD;
if(mass[0] < mass[N-1]) {
g = mass[N-1];
h = mass[0];
}
if(mass[0] > mass[N-1]) {
g = mass[0];
h = mass[N-1];
}
do {
if(g%h == 0)
NOD=h;
else {
temp = h;
h = g % h;
g = temp;
NOD = h;
}
}
while(g%h != 0);
printf("NOD: %d\n", NOD);
return 0;
}
|
Shmaniche |
![]()
Сообщение
#9
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 79 Пол: Мужской Репутация: ![]() ![]() ![]() |
Игорь, твой код тоже не работает, ошибка в цикле do while!
![]() |
Krjuger |
![]()
Сообщение
#10
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
Форум создан,чтобы помогать учиться, а не делать все за других.Хотите, чтобы вам сделали, все что захотите и при этом не прилагая никаких усилий, идите к фрилансерам, они вам за денежку все что угодно сделают.
Тебя уже несколько раз "мордой тыкали" в других темах, но результатов это не приносило. Со временем о любом человеке складывается определенное мнение. О вас складывается мнение, что вы считаете здесь всех обязанными вам помогать.Я вам давал наводки,как можно исправить вашу задачу, вы оставались глухи. Вам четко сказали, как можно выяснить и исправить ошибку,вы взбрыкнули,ваше право. Щас вам остается либо руками долго и муторно проверять,либо сидеть и ждать в надежде,что кто нибудь поможет. И чтобы внести ясность,программа, по хорошему, должна считать для любых наборов элементов,а не в строго упорядоченном виде,поэтому
if(mass[0] < mass[N-1]) {
g = mass[N-1];
h = mass[0];
}
if(mass[0] > mass[N-1]) {
g = mass[0];
h = mass[N-1];
}
Просто ужас какой то.А что произойдет, если mass[0] = mass[N-1] ??????? А ничего, что НОД ищется только для двух элементов????? для первого и последнего, а никак не для всех элементов массива.Вы взяли откуда то код, прикрутили массив и теперь кричите,что у вас не работает.То что вы скинули воообще не решает вашу задачу. |
Игорь |
![]()
Сообщение
#11
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 56 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата Игорь, твой код тоже не работает, ошибка в цикле do while! Ты уж извини, но это твой код (цикл по крайней мере). А вот код, который прокомментировал Krjuger, мой. Вообще могу предложить найти минимальный эллемент массива и с ним работать. |
Shmaniche |
![]() ![]()
Сообщение
#12
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 79 Пол: Мужской Репутация: ![]() ![]() ![]() |
Krjuger, учится говоришь? Так для этого существуют учебники и задачники по С++. Зачем тогда этот форум?
Если я молчу на ваши наводки, это не значит что я не думаю и не ищу нужное решение. Пока вы тут пальцы от клаву терли, чтобы продемонстрировать, какой вы тут сУрьезный дядечка я сообразил одно такое. ![]()
const int N = 5; // Размер массива.
int main()
{
int mass[N]={8, 16, 64, 32, 7};
int NOD, i, flag;
printf("\n Massiv iz 5 elementov \n");
for(i=0; i<N; i++)
{
printf("\n Mass[%d] = %d ", i, mass[i]);
}
NOD = mass[0]; // Предпологаем, что первый элемент массива - это НОД.
for(i=1; i<N; i++)
if(NOD > mass[i]) // Если предполгаемый НОД больше след. элемент массива,
{ NOD = mass[i]; } // тогда след.элемент - НОД.
flag=1; // Флаг на true
while(flag==1) // Пока флаг = true делаем.
{
flag=0; // Флаг = false.
for(i=0; i<N; i++)
if(mass[i]%NOD!=0) // Если след. элемент массива делится на предпологаемый НОД без остатка,
{ flag=1; } // тогда ставим флаг на true.
NOD--; // Здесь уменьшаем значение НОД.
}
NOD++; // Здесь увеличиваем значение НОД.
printf("\n \n NOD = %d. \n", NOD);
getch();
return 0;
}
Думаю, как прикрутить генератор случайных чисел догадаетесь сами, раз такие умные. ![]() Сообщение отредактировано: Shmaniche - 31.05.2012 18:14 |
Krjuger |
![]()
Сообщение
#13
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
Ну чтож, это уже похоже на правду, но есть один маленький недочет.
Сделайте,чтобы работало с отрицательными числами)А то как то непорядочно получается |
Shmaniche |
![]() ![]()
Сообщение
#14
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 79 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ну чтож, это уже похоже на правду, но есть один маленький недочет. Сделайте,чтобы работало с отрицательными числами)А то как то непорядочно получается Пока что не нашел как это можно сделать, но добавил проверку.
for(i=0; i<N; i++)
{
if ((mass[i]<0) || (mass[i]==0)) // Если в массиве найден элемент <=0...
{ printf("\n \n Oshibka! V massive nayden element <= 0."); // Вывести сообщение об ошибке.
break; } // Остановить цикл.
else
if (mass[i]%NOD!=0) // Если след. элемент массива делится на предпологаемый НОД без остатка,
{ flag=1; } // тогда ставим флаг на true.
NOD--; // Здесь уменьшаем значение НОД.
}
...
if ((NOD<0) || (NOD==0)) // Если НОД <=0...
{ printf("\n \n Chisla ne imeut obshih deliteley.\n"); } // числа не имеют общих делителей.
else // Иначе
{ printf("\n \n NOD = %d. \n", NOD); } // Выводим знначние НОД.
Однако, проверка не работает, если 0 выпадат дальше 1-ой позиции в массиве ![]() Сообщение отредактировано: Shmaniche - 31.05.2012 19:42 |
Krjuger |
![]()
Сообщение
#15
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
Что за такое страшное условие.Прям в дрож бросает.
if ((mass[i]<0) || (mass[i]==0))
Можно записать,как if (mass[i]<=0)
Затем ты его явно не туда вставил,еесли ты хочешь,чтобы выводилось сообщение об ошибке,то надо вставлять сразу после начала первого цикла.
NOD = mass[0]; // Предпологаем, что первый элемент массива - это НОД.
for(i=1; i<N; i++)
if (mass[i]<=0)
{ printf("\n \n Oshibka! V massive nayden element <= 0."); // Вывести сообщение об ошибке.
break; } // Остановить цикл.
else
{
if(NOD > mass[i]) // Если предполгаемый НОД больше след. элемент массива,
{ NOD = mass[i]; } // тогда след.элемент - НОД.
flag=1; // Флаг на true
while(flag==1) // Пока флаг = true делаем.
{
flag=0; // Флаг = false.
for(i=0; i<N; i++)
if(mass[i]%NOD!=0) // Если след. элемент массива делится на предпологаемый НОД без остатка,
{ flag=1; } // тогда ставим флаг на true.
NOD--; // Здесь уменьшаем значение НОД.
}
NOD++; // Здесь увеличиваем значение НОД.
printf("\n \n NOD = %d. \n", NOD);
}
|
Федосеев Павел |
![]()
Сообщение
#16
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 298 Пол: Мужской Реальное имя: Федосеев Павел Репутация: ![]() ![]() ![]() |
Я бы реализовал всю программу следующим образом:
а) вынес расчёт НОД (GCD) в функцию б) последовательно обращался к этой функции int GCD(int a, int b) - не я придумал - честно "тиснул" из "http://e-maxx.ru/algo/euclid_algorithm"
{
int tmp;
while(b)
{
a%=b;
tmp=a; a=b; b=tmp; /*swap(a, b);*/
}
return a;
}
int main()
{
...................................................
NOD=mass[0];
for(i=1; i<N; i++)
{
NOD=GCD(NOD, mass[i]);
}
...............................................
}
|
Shmaniche |
![]() ![]()
Сообщение
#17
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 79 Пол: Мужской Репутация: ![]() ![]() ![]() |
Krjuger, твоя проверка на фурычит. А вот решение Павла довольно интересна
![]() Сообщение отредактировано: Shmaniche - 1.06.2012 10:53 |
Krjuger |
![]()
Сообщение
#18
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
Да,я закрывающую скобку не туда поставил.Да и вообще с еще 1 флагом проще.
minus=false;
NOD = mass[0]; // Предпологаем, что первый элемент массива - это НОД.
for(i=1; i<N; i++)
if (mass[i]<=0)
{ minus=true;
break; } // Остановить цикл.
else
{
if(NOD > mass[i]) // Если предполгаемый НОД больше след. элемент массива,
{ NOD = mass[i]; } // тогда след.элемент - НОД.
}
if (!minus)
{
flag=1; // Флаг на true
while(flag==1) // Пока флаг = true делаем.
{
flag=0; // Флаг = false.
for(i=0; i<N; i++)
if(mass[i]%NOD!=0) // Если след. элемент массива делится на предпологаемый НОД без остатка,
{ flag=1; } // тогда ставим флаг на true.
NOD--; // Здесь уменьшаем значение НОД.
}
NOD++; // Здесь увеличиваем значение НОД.
printf("\n \n NOD = %d. \n", NOD);
}
else
{ printf("\n \n Oshibka! V massive nayden element <= 0."); // Вывести сообщение об ошибке.
}
|
Shmaniche |
![]()
Сообщение
#19
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 79 Пол: Мужской Репутация: ![]() ![]() ![]() |
Есть вариант проще:
int NOD_Function(int a, int b); // Объявляем функцию вычисления НОД.
int NOD_Function(int a, int b)
{ if (b==0) // Если второе число равно 0.
{return a; } // Вернуть значение первого.
else // Иначе
{ return NOD_Function(b, a%b); } // Вернуть значение функции НОД, используя рекурретность.
}
Думаю как применять эту функцию и как обойти случай, когда все элементы массива равны нулю - догадаетесь сами. ![]() Сообщение отредактировано: Shmaniche - 1.06.2012 10:53 |
Krjuger |
![]()
Сообщение
#20
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
Цитата Думаю как применять эту функцию и как обойти случай, когда все элементы массива равны нулю - догадаетесь сами. Ты в загадки с нами играешь что ли?Нам все равно и гадать нет нужны. То что ты сделал не сработает на тесте а=10 б=0,оно выдаст 10.Так что думай дальше. |
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 17:50 |