Re: задачи по Visual C++ 6
От: glyph  
Дата: 28.09.05 07:09
Оценка: 7 (2) :))) :)))
Здравствуйте, <Аноним>, Вы писали:

А>Помогите пожалуйста решить задачки, а то ну никак не получаются


Ошибочка вышла. Надо или цену указать, или ник женский взять.
... << RSDN@Home 1.1.4 beta 3 rev. 193>>
Re: задачи по Visual C++ 6
От: desperado_gmbh http://www.livejournal.com/users/tolstopuz
Дата: 05.10.05 13:09
Оценка: 44 (3) :)
Здравствуйте, Аноним, Вы писали:

А>3. Два натуральных числа называются "дружественными", если одно из них равно сумме протых делителей другого. Найти все пары "дружественных" чисел в диапазоне [n1, n2].


Дружественными называются два натуральных числа, каждое из которых равно сумме правильных делителей другого (т. е. делителей, меньших этого числа). Например:

x=220. 1+2+4+5+10+11+20+22+44+55+110 = 284.
y=284. 1+2+4+71+142 = 220.

Если написать программу строго по заданию, преподаватель на зачете введет n1=220, n2=284, увидит, что программа не выдает этого решения, и скажет, что все неправильно. Это один из основных принципов разработки программ — заказчик хочет получить не то, что написано в техническом задании, а то, что он имел в виду, когда его писал.
Re[2]: задачи по Visual C++ 6
От: desperado_gmbh http://www.livejournal.com/users/tolstopuz
Дата: 06.10.05 11:05
Оценка: 34 (3)
Здравствуйте, Katenok, Вы писали:

K>что-то не то она считает выводит что в диапазоне (200,500) числа с 351-500 дружественные, но выводит их не парами


Попробуй ответить на вопросы, не запуская программу, а только читая. Не исправляй пока ничего, просто ответь на вопросы прямо здесь.

#include <math.h>
#include <iostream>
using namespace std;
#include <stdio.h>

void main ()

{
int n1, n2,i;
// Чему здесь равны n1 и n2 и почему?
for (int A=n1; A<=n2; A++)
// Сколько раз выполнится этот цикл? Где кончается тело этого цикла?
cout << "n1=? n2=?" << "\n";
cin >> n1>>n2;
// Чему здесь равно A и почему?
cout << A << "\n";

// Сколько раз выполнится следующий блок кода и почему?
{
    int res=0;
    int B;
// Чему здесь равно B и почему?
    printf("\n");

    for (int i=1;i<A;i++)
    {
        if (A%i==0) {B=B+i;/*printf("\n");*/}
// Чему станет равно B после первого шага этого цикла и почему?
    }
    printf("B=%d",B);
    if (B==A) {res=1;}
// Что означает переменная res и где она используется?
}

{
    int res=0;
    int B;
// Чему здесь равно B и почему?
    int C;
    printf("\n");

    for (int i=1;i<B;i++)
    {
        if (B%i==0) {C=C+i;/*printf("\n");*/}
    }
    printf("C=%d",C);
    if (C==B) {res=1;}
}

for (int C=n1; C<=n2; C++)
{
if (A=C) printf("\nNumber %d drug\n",C);

}

for (int B=n1; B<=n2; B++)
{

if (A=B) printf("\nNumber %d drug\n",B);
}
}
Re[3]: задачи по Visual C++ 6
От: Кодт Россия  
Дата: 28.09.05 09:30
Оценка: 15 (2)
Начнём со второй, как более простой.

А>>по 2 код:

А>>{

А>> float x,y,z;
А>>  printf("Введите значения x, y, z : ");
А>>  scanf("%f%f%f", &x, &y, &z);
А>>  S=max(x+y+z, xyz)+3max(xy2, z2);
А>>  printf("Значение S=%.3f", z);
А>>}


Очевидно, что выражение max(x+y+z,xyz)+3max(xy2,z2) — это математическая запись, в которой операторы умножения и возведения в степень "подразумеваются".
В Си таких подразумеваний нет, поэтому нужно их расставить.
Возведения в степень тоже нет, но здесь всего лишь квадраты, можно ограничиться умножением на само себя.
Формула приобретает вид max(x+y+z,x*y*z)+3*max(x*y*y,z*z)

В задании говорится что-то про #define. По всей видимости, предлагается определить функцию max (собственно, в Си она и так определена как макрос).
Специально, чтобы не пересекаться со стандартным идентификатором, назовём наше рукоделие по-другому: с большой буквы.
#define Max(a,b) ........
//         ~~~~~ обрати внимание на нюанс: если у макроса есть аргументы, то скобка должна идти сразу за именем, без пробела
//               иначе это будет расценено как макрос без аргументов, результат которого начинается на (a,b)

Определение функции max очень просто
           | a, если a>b
max(a,b) = |
           | b, в остальных случаях (если a==b, то без разницы, что выбирать)

Если бы мы писали настоящую функцию, то могли бы воспользоваться конструкцией if(a>b) return a; else return b;
Но макрос предполагает, что это выражение. Следовательно, нам нужен оператор ветвления. И он есть!
// конструкция
if( C ) return X; else return Y;
// выражение
    C ?        X     :        Y

Приоритет оператора ветвления очень низкий, поэтому если мы прямо так его подставим в исходную формулу, получится ерунда
// Max(x+y+z, x*y*z)             + 3 * .....
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   x+y+z > x*y*z ? x+y+z : x*y*z + 3 * .....
//                         ~~~~~~~~~~~~~~~~~ всё это попало в ветку 'else' нашего выражения Max(...)

Чтобы такого не было, нужно завернуть макрос в скобки.
#define Max(a,b)  (...... ? ...... : ......)

Если один из аргументов сам содержит оператор ветвления, сравнения или логические, то в выражении a<b может получиться каша.
Поэтому общепринято, что аргументы макроса также заворачиваются в скобки.
#define Max(a,b)  ( (a)>(b) ............ )

Ну вот. А теперь на основании всего, что я здесь рассказал, попробуй написать задание.
Удачи!
Перекуём баги на фичи!
Re[9]: задачи по Visual C++ 6
От: desperado_gmbh http://www.livejournal.com/users/tolstopuz
Дата: 07.10.05 10:45
Оценка: 9 (2)
Здравствуйте, Katenok, Вы писали:

K>1. Получим множество чисел А из диапазона [n1,n2]. Значения n1, n2 зададим с клавиатуры

K>2. Для всех чисел А из этого диапазона найдем сумму их делителей В
K>3. Для всех полученных чисел В найдем сумму их делителей С
K>4. Если В=А, и В принадлежит [n1,n2], то выводим его.
K>5. Если С=А, и С принадлежит [n1,n2], то выводим его.

Во-первых, шаг 1 сейчас выглядит как "Разбить три яйца и вылить их на сковородку. Три яйца достать из холодильника". Для человека это приемлемое описание, но компилятор не понимает, где взять три яйца, читая первое предложение. Он тупой, для него предложения надо переставить.

Далее, после шага 2 у нас получается много сумм делителей, с которыми потом работает шаг 3. Далее Шаг три для этой кучи чисел опять считает суммы делителей и помещает в новую кучу чисел. Есть языки, где это совершенно естественный способ, но на C++, тем более на данном этапе обучения, лучше действовать с числами по очереди.

Далее, после шага 3 мы имеем три кучи чисел: все A из диапазона (из шага 1), все суммы их делителей B (из шага 2) и все суммы сумм делителей C (из шага 3). И вдруг мы говорим: "Если B=A". У нас куча A и куча B, что именно мы сравниваем?

Кроме того, зачем сравнивать число A и сумму его делителей? В условии этого не было. Четвертый шаг лишний.

А если попробовать вот так, чтобы работать не "для всех", а "для каждого"?

1. Получить с клавиатуры значения n1 и n2.
2. Для каждого A из диапазона [n1,n2] выполнить следующие действия:
2.1. Найти сумму его делителей B.
2.2. Если B принадлежит [n1,n2], то выполнить следующие действия:
2.2.1. Для числа B найти сумму его делителей C.
2.2.2. Если C=A, то вывести A и B.

Кстати, проверить число на принадлежность диапазону можно всего двумя сравнениями, без циклов.
Re[2]: задачи по Visual C++ 6
От: Кодт Россия  
Дата: 04.10.05 21:20
Оценка: 3 (2)
Здравствуйте, Katenok, Вы писали:

K>Что-то со второй задачкой все равно совсем ничего не получается .. не работает и все.. может я что не понимаю.. вот такой у меня код получился:

K>#include <iostream>
K>using namespace std;
K>#include <iomanip> // это тебе не пригодится
K>#include <stdio.h>
K>#include <math.h> // и это тоже не нужно

K>#define Max(a,b) ((a)>(b))
// Ну и что он делает? Находит, что a больше b, и?... И всё.
// Нужно написать его так, чтобы в случае a>b он выбирал a, иначе - b.
// Для этого используй оператор ветвления condition ? when_true : when_false
// где condition, when_true и when_false - соответствующие выражения.
// Давай, у тебя уже всё есть, чтобы написать Max правильно.

K>int main ()
K>{
K>  int x,y, S, c;
K>  float z; 
K>  printf("Введите значения x, y, z : ");

// После того, как пользователь увидел эту надпись, он введёт числа.
// А твоя программа должна их прочитать! Используй функцию scanf
// или поток ввода cin >>...

K>{ // К чему относится эта скобка? Очевидно, ни к чему.

K>  if(x+y+z > x*y*z) return a=x+y+z; else return a=x*y*z;
K>  if(3*x*y*y > 3*z*z) return b=3*x*y*y; else return b=3*z*z;
    // return возвращает значение из текущей функции наружу.
    // То есть из main куда-то в операционную систему.

K>S=Max(a+b); // Что ты хочешь этим сказать? У тебя здесь нет переменных a,b
K>//S=Max((x+y+z > x*y*z ? x+y+z : x*y*z) + (3*x*y*y > 3*z*z ? 3*x*y*y : 3*z*z));
    // А вот эта строчка почти что была правильна...
    // Только слово Max было лишнее, поскольку ты сама развернула Max(x+y+z,x*y*z)
    // А тебе нужно как раз не разворачивать, а возложить эту задачу на Max.
    // Практически, здесь будет та самая формула max(x+y+z,xyz)+3max... -
    // только записанная на языке Си.

K>cout << "S = " << S << endl;
    // Здесь всё правильно... если к этому моменту ты вычислишь S.
    // Кстати, стилистически лучше будет, если ты станешь пользоваться
    // только cin/cout или только scanf/printf. Вперемешку это некрасиво.
K>}

K>Помогите пожалуйста

Давай, попробуй. Спокойно, рассудительно, без панических настроений. Мы поддержим и поможем.
У тебя почти всё готово, только нужно исправить 3 места: определение макроса Max, ввод чисел и запись формулы для S.
Перекуём баги на фичи!
Re[11]: задачи по Visual C++ 6
От: desperado_gmbh http://www.livejournal.com/users/tolstopuz
Дата: 07.10.05 11:53
Оценка: 3 (1) :)
Здравствуйте, Кодт, Вы писали:

К>Массив нам не нужен!


Ну почему же

map(lambda x:[x[0],x[1]],filter(lambda x: (x[0]==x[2])&(x[0]<=x[1]),map(lambda y:[y[0],y[1],sum(filter(lambda x:y[1]%x==0,range(1,y[1])))],filter(lambda x:x[1]<3000,map(lambda y:[y,sum(filter(lambda x:y%x==0,range(1,y)))],range(1,3000))))))
Re[2]: задачи по Visual C++ 6
От: Кодт Россия  
Дата: 05.10.05 08:42
Оценка: :))
Здравствуйте, Katenok, Вы писали:

K>С превой получилось, спасибо

K>А вот вторую замучала уже..

Пожалуйста, когда пишешь на форум, обрамляй сишный код тэгами [ccode] / [/ccode] (или [c] / [/c]). Иначе читать сложно.

K>Вот... 9 ошибок выдает

Ну-сс, разбор полётов.
K>#include <iostream>
K>using namespace std;
K>#include <stdio.h> // это уже лишнее, поскольку ты не используешь printf/scanf

K>#define Max(a,b) (((a)>(b))? a:b)
  // Практически правильно. Чтобы совсем чисто было, надо писать ... (a):(b)

  // а вот эти две строчки к чему относятся?! Они совершенно не нужны!
K>a=(x+y+z > x*y*z ? x+y+z : x*y*z)
K>b=(3*x*y*y > 3*z*z ? 3*x*y*y : 3*z*z)


K>int main ()
K>{
K>  int S, c; // c нигде не используется.
K>  float z=7;
K>  int x = 2, y = 5;
    // здесь написана ботва. Ты выводишь ( << ) в поток ввода (cin) числа, которые тебе ещё неизвестны.
K>  cin << "x = " << x << " y = " << y <<"z="<<z<< endl;
    // Тебе нужно вывести вопрос "введите x,y,z :" в поток вывода (cout)
    // и потом ввести числа x,y,z из потока ввода - cin >> x ... ну дальше сама догадайся.

K>  S=Max(a+b) // Здесь написано: S = максимум от (a+b) и чего ещё? То есть, ерунда написана. Долой.
K>//S=Max((x+y+z, x*y*z)+3*(x*y*y, z*z)); // зачем закомментировала? Как раз эта строка... на грани правильности
    //                     ^ 3 умножить на максимум от (xyy,zz). Но где же здесь слово "максимум", т.е. Max ? Забыла.
    
K>  cout << "S = " << S << endl; // вот здесь всё правильно.
K>}


P.S.
Я специально не пишу готовых решений, т.к. тебе всё-таки нужно учиться.
Лучше всего, если ты это будешь делать не пробами и ошибками, а с учебником или методичкой. А ещё лучше, если возьмёшь препода за пуговицу. Ибо что это за препод, который кинулся заданием и забил на учеников.

P.P.S.
Всё больше и больше кошачьих на RSDN!
Перекуём баги на фичи!
Re[10]: задачи по Visual C++ 6
От: Кодт Россия  
Дата: 07.10.05 10:55
Оценка: +2
Здравствуйте, Radmir, Вы писали:

R>поэтому шаг 1

R>Запросить у пользователя n1 и n2
R>

R>теперь нам надо найти суммы делителей для всех A из этого диапазона.
R>Для хранения этих сумм нам соответственно нужен массив. т.к. для каждого числа суммы делителей разные.
R>Вохможно два варианта решиения либо динамически выделить память для этого массива либо создать заранее довольно большой массив.
R>Воспользвумся вторым вариантом т.к. он проще.

Массив нам не нужен!
Чтобы посчитать сумму делителей, можно находить их по одному и тут же суммировать.
Перекуём баги на фичи!
Re[12]: задачи по Visual C++ 6
От: Кодт Россия  
Дата: 07.10.05 13:39
Оценка: 6 (1)
Здравствуйте, desperado_gmbh, Вы писали:

К>>Массив нам не нужен!

_>Ну почему же
_>map(lambda x:[x[0],x[1]],filter(lambda x: (x[0]==x[2])&(x[0]<=x[1]),map(lambda y:[y[0],y[1],sum(filter(lambda x:y[1]%x==0,range(1,y[1])))],filter(lambda x:x[1]<3000,map(lambda y:[y,sum(filter(lambda x:y%x==0,range(1,y)))],range(1,3000))))))

Не пугай девушку! Ты бы ещё на K написал, или на APL.

Впрочем, пугать так пугать!

Фильтровать необязательно. До последнего момента можно пользоваться полноразмерными массивами, заменяя фильтрацию умножением на 0.

В языках APL и K можно выполнять операции скаляр*скаляр, скаляр*вектор, вектор*вектор (поэлементно).
Итак... на некоем псевдоязыке, который легко переводится на реально существующие.
# базовые функции: векторы возрастающих компонентов, векторы одинаковых компонентов
range0(x) = [0..x-1]
rangexy(x,y) = [x..y-1] = range0(y-x) + x
ones(x) = [1,1,...1] x штук

ones1(a) = ones(a-1)          # массив из a-1 единиц
range1(a) = range0(a-1) + 1   # [1..a-1]
ns1(a) = ones1(a)*a           # массив из a-1 чисел a

reminders(a) = ns1(a) mod range1(a)            # остатки от деления a на 1..a-1
maskreminders(a) = reminders(a) == 0           # там, где остатки нулевые, в массиве масок будут 1, остальное - 0
divisors(a) = range1(a) * maskreminders(a)     # тем самым мы оставим ненулевыми только подлинные делители
sumdiv(a) = fold + 0 divisors(a)               # сумма делителей

sumdiv2(a) = sumdiv(sumdiv(a))
friendly(a) = (a == sumdiv2(a)                 # проверка, есть ли у числа a друг

rangenm(nm) = rangexy(nm[0],nm[1]+1)           # nm - массив из двух чисел, n1,n2; результат функции - [n1..n2]
maskfriends(nm) = map friendly rangexy(nm)     # массив, где 1 отмечают позиции дружественных чисел

friends(nm) = rangenm(nm) * maskfriends(nm)    # массив, где ненулевые числа имеют друзей

# можно ещё продолжить, отфильтровав дружественные числа, лежащие вне диапазона n1,n2...

Как видим, каждая из функций является композицией над одним и тем же аргументом. Так что скомбинировать их в одну мега-функцию — труда не составит.
Единственное, что здесь неприятно, это повтор функции sumdiv. В языке APL, насколько я помню, функций высшего порядка нет (банальные комбинаторы map и fold — не в счёт), но можно просто скопировать её формулу несколько раз.
Перекуём баги на фичи!
Re: задачи по Visual C++ 6
От: Кодт Россия  
Дата: 27.09.05 18:37
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>Помогите пожалуйста решить задачки, а то ну никак не получаются


Поможем. Но не сделаем работу за тебя.

Тащи сюда свой код, мысли, найденные препятствия...
Перекуём баги на фичи!
Re: задачи по Visual C++ 6
От: Кодт Россия  
Дата: 27.09.05 18:38
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>3. Два натуральных числа называются "дружественными", если одно из них равно сумме протых делителей другого. Найти все пары "дружественных" чисел в диапазоне [n1, n2].


Некорректное определение. Сумма простых делителей числа 12=2*2*3 — это 2+2+3=7 или 2+3=5?
Перекуём баги на фичи!
Re[2]: задачи по Visual C++ 6
От: Кодт Россия  
Дата: 05.10.05 14:00
Оценка: :)
Да... уж! Тогда можно захардкодить эти числа Их ведь должно быть немного. Заодно препод будет удивлён скоростью работы

В диапазоне 1...50000 найдены:
perfect 6
perfect 28
friends 220 284
perfect 496
friends 1184 1210
friends 2620 2924
friends 5020 5564
friends 6232 6368
perfect 8128
friends 10744 10856
friends 12285 14595
friends 17296 18416
Перекуём баги на фичи!
Re[4]: задачи по Visual C++ 6
От: Radmir Россия  
Дата: 06.10.05 11:43
Оценка: +1
Здравствуйте, Katenok, Вы писали:

[skiped]
_>>for (int C=n1; C<=n2; C++)
_>>{
_>>if (A=C) printf("\nNumber %d drug\n",C);

_>>}


_>>for (int B=n1; B<=n2; B++)

_>>{

_>>if (A=B) printf("\nNumber %d drug\n",B);

_>>}
_>>}[/c]

Еще обрати внимание на ваделенное.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Лучше спросить дорогу чем заблудиться
Re[11]: задачи по Visual C++ 6
От: desperado_gmbh http://www.livejournal.com/users/tolstopuz
Дата: 07.10.05 11:19
Оценка: :)
Здравствуйте, Кодт, Вы писали:

К>И ещё кстати, если A==B (совершенное число — дружественное самому себе), то нет смысла вычислять C:

К>Поскольку B=f(A) == A, то C=f(B) == f(A) == B == A.
К>Эту проверку можно вставить, скажем, сразу после 2.1.

Да, у нее вначале так и было. Но, как известно, it is easier to make correct code fast than to make fast code correct
задачи по Visual C++ 6
От: Аноним  
Дата: 27.09.05 18:02
Оценка:
Помогите пожалуйста решить задачки, а то ну никак не получаются

1. Ввести последовательность символов, заканчивающуюся '@'. Распечатать только те из них, которые расположены до первого символа ':'.
2. Даны целые числа x, y и вещественное число z. Используя директиву #define для нахождения наибольшего из чисел, вычислить
S=max(x+y+z, xyz)+3max(xy2, z2).
3. Два натуральных числа называются "дружественными", если одно из них равно сумме протых делителей другого. Найти все пары "дружественных" чисел в диапазоне [n1, n2].
Re: задачи по Visual C++ 6
От: Аноним  
Дата: 28.09.05 08:36
Оценка:
Здравствуйте, Аноним, Вы писали:


Эх.. ник мне женский брать и не надо, я и так девушка, в МАИ учусь, программирвание вообще к нашей специализации отношения не имеет, а вот на последнем курсе такой курс прочитать решили и задали 25 задач, 13 из них я как то поборола, а вот с этими не получается вообще ничего
По поводу некорректного условия, другого нет и надо решить именно с этим.

Насчет кодов.
по 1 вот такое получилось:
{
int iln=0,
int c;
puts("Введите последовательность символов, заканчивающуюся '@'");
while((c=getchar())!='@')

for ((c=getchar())!=':')
)
printf (" \n[%2d] %d",++iln, c);

}
по 2 код:
{

float x,y,z;
printf("Введите значения x, y, z : ");
scanf("%f%f%f", &x, &y, &z);
S=max(x+y+z, xyz)+3max(xy2, z2);
printf("Значение S=%.3f", z);
}

Глупость наверное полная, но я ужасно разбираюсь во всяких таких програмках
Re[2]: задачи по Visual C++ 6
От: Кодт Россия  
Дата: 28.09.05 08:59
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Эх.. ник мне женский брать и не надо, я и так девушка, в МАИ учусь, программирвание вообще к нашей специализации отношения не имеет, а вот на последнем курсе такой курс прочитать решили и задали 25 задач, 13 из них я как то поборола, а вот с этими не получается вообще ничего :(

А>По поводу некорректного условия, другого нет и надо решить именно с этим.

А>Насчет кодов.

А>по 1 вот такое получилось:
А>{ 
А>    int iln=0,
А>int c;
А>puts("Введите последовательность символов, заканчивающуюся '@'"); 
А>while((c=getchar())!='@')

А> for ((c=getchar())!=':')
А>) 
А>printf (" \n[%2d] %d",++iln, c);

А>}

А>по 2 код:
А>{

А> float x,y,z;
А>  printf("Введите значения x, y, z : ");
А>  scanf("%f%f%f", &x, &y, &z);
А>  S=max(x+y+z, xyz)+3max(xy2, z2);
А>  printf("Значение S=%.3f", z);
А>}

А>Глупость наверное полная, но я ужасно разбираюсь во всяких таких програмках :(

Действительно, глупость... ну что же, поехали.
Перекуём баги на фичи!
Re[3]: задачи по Visual C++ 6
От: Кодт Россия  
Дата: 28.09.05 10:11
Оценка:
Теперь про коды
К>
А>>{ 
А>>    int iln=0,
А>>int c;
А>>puts("Введите последовательность символов, заканчивающуюся '@'"); 
А>>while((c=getchar())!='@')

А>> for ((c=getchar())!=':')
А>>) 
А>>printf (" \n[%2d] %d",++iln, c);

А>>}
К>


Главная ошибка здесь — в перепутанном чтении символов. Не забываем, что getchar() каждый раз возвращает новый символ.
Поэтому лучше выразить ход мысли по шагам. (Голимое goto :) ) а потом уже переписать покрасивее.
1. Читаем символ c
2. Если c=='@', то конец
3. Если c==':', запомним этот факт
4. Если ':' ещё не встречалось, то выводим c
5. Идём на следующий круг

Собственно, (1) и (2) можно совместить в заголовке while, как это у тебя сделано. Но вот реализацию 3 и 4 лучше сделать через булеву переменную.

Или можно пойти другим путём, эквивалентным этому
1. Читаем символ c
2. Если c=='@' то конец вообще
3. Если c==':' то конец цикла
4. Выводим c
5. Продолжаем

следующий цикл выполняется, когда мы встретили ':' до того, как встретили '@'

6. Читаем c
7. Если c=='@' то конец
8. Продолжаем

Но, думаю, это менее очевидный и более заморочный способ.

Итого,
do_print = true;
while((c=getchar()) != '@')
{
  if(c==':') do_print = false;
  if(do_print) { printf("[%d] %d\n", ++iln, c); }
//                                    ~~ обычно перевод строки добавляют в конец вывода, а не в начало.
}
Перекуём баги на фичи!
Re: задачи по Visual C++ 6
От: Katenok  
Дата: 28.09.05 14:21
Оценка:
Огромное пасибо!!! Пойду попробую...
Re: задачи по Visual C++ 6
От: Katenok  
Дата: 04.10.05 14:59
Оценка:
Что-то со второй задачкой все равно совсем ничего не получается .. не работает и все.. может я что не понимаю.. вот такой у меня код получился:

#include <iostream>
using namespace std;
#include <iomanip>
#include <stdio.h>
#include <math.h>


#define Max(a,b) ((a)>(b))
//void main ()
int main ()
{
int x,y, S, c;
float z;
printf("Введите значения x, y, z : ");

{
if(x+y+z > x*y*z) return a=x+y+z; else return a=x*y*z;

if(3*x*y*y > 3*z*z) return b=3*x*y*y; else return b=3*z*z;

S=Max(a+b);
//S=Max((x+y+z > x*y*z ? x+y+z : x*y*z) + (3*x*y*y > 3*z*z ? 3*x*y*y : 3*z*z));

cout << "S = " << S << endl;
}

Помогите пожалуйста
Re[2]: задачи по Visual C++ 6
От: ЯпонИц Россия www.yaponiz.com
Дата: 04.10.05 16:01
Оценка:
Здравствуйте, Katenok, Вы писали:

#include <iostream>
using namespace std;
#include <iomanip>
#include <stdio.h>
#include <math.h>


#define Max(a,b) ((a)>(b))
//void main ()
int main ()
{
  int x,y, S, c;
  float z; 
  printf("Введите значения x, y, z : "); // А где сам ввод значений?

{
      if(x+y+z > x*y*z) return a=x+y+z; else return a=x*y*z; // при вызове return происходит выход из программы

      if(3*x*y*y > 3*z*z) return b=3*x*y*y; else return b=3*z*z;

S=Max(a+b); // а разве тут плюс?
//S=Max((x+y+z > x*y*z ? x+y+z : x*y*z) + (3*x*y*y > 3*z*z ? 3*x*y*y : 3*z*z));

cout << "S = " << S << endl; // либо везде используете cout|cin, либо вообще их не используйте.
}


K>Помогите пожалуйста

Да легко
Я не волшебник, я только учусь.
Posted by RSDN@HOME.
Re: задачи по Visual C++ 6
От: Аноним  
Дата: 04.10.05 17:03
Оценка:
Ввод значений происходит с клавиатуры.


S=max(x+y+z, xyz)+3max(xy2, z2) плюс отсюда

return — убрать ???


в этом выражени что не так?
S=Max((x+y+z > x*y*z ? x+y+z : x*y*z) + (3*x*y*y > 3*z*z ? 3*x*y*y : 3*z*z));
Re[2]: задачи по Visual C++ 6
От: Кодт Россия  
Дата: 04.10.05 21:21
Оценка:
Здравствуйте, Katenok, Вы писали:

K>Огромное пасибо!!! Пойду попробую...


А с первой получилось?
Перекуём баги на фичи!
Re: задачи по Visual C++ 6
От: Katenok  
Дата: 05.10.05 07:23
Оценка:
С превой получилось, спасибо
А вот вторую замучала уже..

#include <iostream>
using namespace std;
#include <stdio.h>
#define Max(a,b) (((a)>(b))? a:b)
a=(x+y+z > x*y*z ? x+y+z : x*y*z)
b=(3*x*y*y > 3*z*z ? 3*x*y*y : 3*z*z)


int main ()
{
int S, c;
float z=7;
int x = 2, y = 5;
cin << "x = " << x << " y = " << y <<"z="<<z<< endl;

S=Max(a+b)
//S=Max((x+y+z, x*y*z)+3*(x*y*y, z*z));

cout << "S = " << S << endl;
}


Вот... 9 ошибок выдает
Re[3]: задачи по Visual C++ 6
От: Katenok  
Дата: 05.10.05 09:16
Оценка:
Учебник у меня есть один Шиманович, и еще какой-то но совсем бесполезный... если бы не учебники я вообще бы ничего не написала, а препод на нас забивает потому что мы вечерники да еще и курс последний... вот и разбираюсь потихоньку... мне еще потом на экзамене прийдется 3 задачи решать за 20 минут..
Re: задачи по Visual C++ 6
От: Katenok  
Дата: 05.10.05 09:51
Оценка:
И если не трудно подскажите что с 3 задачкой делать, а то как баран на новые ворота на нее смотрю..

Вот задачку по книжке решала... а ответ не такой как надо получается
Задача. Для заданной матрицы найти минимум среди сумм модулей элементов диагоналей, параллельных главной диагонали.

 / #include <iostream>
#include <math.h>
using namespace std;
#define Amax 128

void main()
{
    printf("Input A-dimension:");
    int sA=0,i,j,k;
    scanf("%d",&sA);
        if(sA>Amax)sA=Amax;
//    sA=4;
    float A[Amax][Amax];
        getchar();
        printf("Budete vvodit\'?[y/n]");
        char yn=0;
        scanf("%c",&yn);
    printf("Input A:\n");
    for(i=0;i<sA;i++)
    {
        for(j=0;j<sA;j++)
//            A[i][j]=(i*(int)sA+j+1)%10;
                      if(yn=='y')
            scanf("%f",&A[i][j]);
                      else  
                        A[i][j]=float(rand())/32768*100-50;
    }
    for(i=0;i<sA;i++)
    {
        printf("\n");
        for(j=0;j<sA;j++)
            printf("%6.2f ",A[i][j]);
    }
    float mtmp=0,min1=32768;
    for(k=-(sA-1);k<sA;k++)
    {
        mtmp=0;
        printf("\n");
                printf("Elements: ");            
        for(i=0;i<sA;i++)
        {
            j=i-k;
            if((j>=0)&&(j<sA))
                        {
                mtmp+=fabs(A[i][j]);
                                printf("[%d,%d] ",i,j);
                        }       
        }
        printf("local Sum=%6.2f",mtmp);
        if(mtmp<min1)min1=mtmp;
    }
    printf("\nMin=%10.2f\n",min1);
        getchar();getchar();
}
Re[2]: задачи по Visual C++ 6
От: Кодт Россия  
Дата: 05.10.05 10:24
Оценка:
Здравствуйте, Katenok, Вы писали:

K>И если не трудно подскажите что с 3 задачкой делать, а то как баран на новые ворота на нее смотрю..


Решение в лоб:
1. Получить множество простых чисел <= n2. Это чтобы затем быстро раскладывать числа на простые множители.
2. Для каждого числа A из [n1,n2]
— Найти сумму его простых множителей — B
— Проверить, входит ли B в диапазон [n1,n2]; если нет, то переходим к следующему числу.
— Если A>B, то мы уже проверяли его; переходим к следующему числу.
— Если A=B, это "друг самому себе", или совершенное число. Выводим и переходим к следующему числу.
— Наконец, A<B. Нужно проверить, является ли A другом для B. Находим сумму простых множителей B — число C.
— Если A=C, то B друг A и A друг B. Выводим их.

Как строить множество простых чисел.
Количество простых чисел в диапазоне [1,n2] — что-то около квадратного корня из n2, но точно сказать невозможно. Поэтому нам потребуется контейнер, который может расширяться — например, std::vector<int>.
Простой способ: пробежим все числа x от 1 до n2 и проверим, делятся ли они на элементы вектора p (primes). Если очередное число делится — записываем в конец вектора (он отсортирован по возрастанию).
Тут есть несколько оптимизаций.
— Во-первых, нет смысла проверять числа, кратные 2. Более того, можно проверять числа равные 6k-1, 6k+1 (не кратные ни 2, ни 3).
— Во-вторых, если мы убедились, что число x не делится числа p[0],p[1],...p[t-1] и p[t]*p[t] > x, то нет смысла проверять делимость на все остальные простые числа: если один из гипотетических делителей больше квадратного корня из x, то должен быть второй делитель, меньший квадратного корня — а мx только что проверили, что их нет.
— В-третьих, можно руками вбить стартовый набор простых чисел (скажем, до 100).

Как находить сумму делителей.
Пусть x — число, которое мы изучаем. t — номер простого числа. s — сумма.
Изначально s=0, t=0.
Для каждого простого числа p[t] мы
— проверяем, если x < p[t], то завершаем все проверки и возвращаем сумму.
— проверяем, делится ли x на него: if(x % p[t] == 0)...
— если делится, то прибавляем это число к s: s += p[t]; и продолжаем проверять для этого же числа.
— переходим к следующему простому числу: ++t.

Поскольку эта подзадача у нас возникает дважды — B = сумма_делителей(A) и C = сумма_делителей(B) — то есть смысл вынести её в отдельную функцию.
Естественно, что предварительно заполненный вектор p должен быть доступен этой функции — т.е., например, это глобальная переменная.

Попробуй закодировать эти алгоритмы.
Тебе будет очень полезно, если каждую строку кода ты станешь сопровождать комментарием (как бы объясняя самой себе). Это позволит избежать глупых ошибок и слепых попыток.
Перекуём баги на фичи!
Re[3]: задачи по Visual C++ 6
От: desperado_gmbh http://www.livejournal.com/users/tolstopuz
Дата: 05.10.05 14:32
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Да... уж! Тогда можно захардкодить эти числа Их ведь должно быть немного. Заодно препод будет удивлён скоростью работы


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

К>В диапазоне 1...50000 найдены:

К>friends 10744 10856
К>friends 12285 14595
К>friends 17296 18416

Да, следующая пара (63020, 76084), поэтому можно сделать так:

1. Объявить все числа в программе как unsigned short, сказав, что на большее все равно не хватит времени.
2. Написать несколько циклов, делающих что-то похожее на правду.
3. Где-нибудь ближе к концу заобфусцировать табличку и тихонько подменить рассчитанные числа правильными.

Re[4]: задачи по Visual C++ 6
От: Кодт Россия  
Дата: 05.10.05 15:35
Оценка:
Здравствуйте, desperado_gmbh, Вы писали:

_>Да, следующая пара (63020, 76084), поэтому можно сделать так:


_>1. Объявить все числа в программе как unsigned short, сказав, что на большее все равно не хватит времени.

_>2. Написать несколько циклов, делающих что-то похожее на правду.
_>3. Где-нибудь ближе к концу заобфусцировать табличку и тихонько подменить рассчитанные числа правильными.

На Атлоне-1400 он 50000 проверил примерно за пару минут (при том, что я не только этим занимался)... а 100000 уже минут за 10 — алгоритм-то квадратичный.
Так что нужно грамотно эмулировать скрип мозгов

Уж лучше привести честное решение, благо оно простое как сибирский валенок.
Перекуём баги на фичи!
Re[3]: задачи по Visual C++ 6
От: Katenok  
Дата: 05.10.05 17:17
Оценка:
У меня вот такое чудо-юдо получается...

#include <math.h>
#include <iostream>
using namespace std;
#include <stdio.h>

void main ()

{
int n1, n2,i;
for (int A=n1; A<=n2; A++)
cout << "n1=? n2=?" << "\n";
cin >> n1>>n2;
cout << A << "\n";

{
    int res=0;
    int B=1;
    printf("\n");

    for (int i=1;i<A;i++)
    {
        if (A%i==0) {B=B+i;printf("\n");}
    }
    printf("B=%d",B);
    if (B==A) {res=1;}
    return res;
}

for (int B=n1; B<=n2; B++)
{
if (A=B) printf("\nNumber %d drug\n",B);
}
}/
Re[4]: задачи по Visual C++ 6
От: desperado_gmbh http://www.livejournal.com/users/tolstopuz
Дата: 05.10.05 17:42
Оценка:
Здравствуйте, Katenok, Вы писали:

K>У меня вот такое чудо-юдо получается...


#include <math.h>
#include <iostream>
using namespace std;
#include <stdio.h>

void main ()

{
int n1, n2,i;
for (int A=n1; A<=n2; A++)
cout << "n1=? n2=?" << "\n";
// Как это? Печатаем в цикле много раз "n1=? n2=?"? Кстати, сколько раз? Здесь n1 и n2 еще не определены.

cin >> n1>>n2;
cout << A << "\n";

{
    int res=0;
    int B=1;
// Лишняя единица на случай, если делителей не хватит?
    printf("\n");

    for (int i=1;i<A;i++)
    {
        if (A%i==0) {B=B+i;printf("\n");}
    }
// Как ни странно, основной цикл почти правильный. Только зачем там десятки или сотни раз выводить пустую строку?
    printf("B=%d",B);
    if (B==A) {res=1;}
// Здесь B - сумма делителей числа A. Она равна самому A, если A совершенное. А нам нужно слегка другое - дружественные.
// То есть мы должны точно так же посчитать сумму делителей B, например, в каком-нибудь C.
// А потом сравнить, равны ли A и C.
    return res;
// Куда return? Домой?
}

for (int B=n1; B<=n2; B++)
{
if (A=B) printf("\nNumber %d drug\n",B);
}
// Неужели самый простой способ проверить, находится ли B между n1 и n2 - это перебрать все числа? :)
}
Re: задачи по Visual C++ 6
От: Katenok  
Дата: 06.10.05 05:08
Оценка:
что-то не то она считает выводит что в диапазоне (200,500) числа с 351-500 дружественные, но выводит их не парами

#include <math.h>
#include <iostream>
using namespace std;
#include <stdio.h>

void main ()

{
int n1, n2,i;
for (int A=n1; A<=n2; A++)
cout << "n1=? n2=?" << "\n";
//À числа из диапазона от n1 до n2 , вводим например n1=256 и n2=400.

cin >> n1>>n2;
cout << A << "\n";

{
    int res=0;
    int B;
    printf("\n");

    for (int i=1;i<A;i++)
    {
        if (A%i==0) {B=B+i;/*printf("\n");*/}
    }
    printf("B=%d",B);
    if (B==A) {res=1;}
}

{
    int res=0;
    int B;
    int C;
    printf("\n");

    for (int i=1;i<B;i++)
    {
        if (B%i==0) {C=C+i;/*printf("\n");*/}
    }
    printf("C=%d",C);
    if (C==B) {res=1;}
}

for (int C=n1; C<=n2; C++)
{
if (A=C) printf("\nNumber %d drug\n",C);

}

for (int B=n1; B<=n2; B++)
{

if (A=B) printf("\nNumber %d drug\n",B);
}
}
Re[2]: задачи по Visual C++ 6
От: Кодт Россия  
Дата: 06.10.05 11:28
Оценка:
Здравствуйте, Katenok, Вы писали:

K>что-то не то она считает выводит что в диапазоне (200,500) числа с 351-500 дружественные, но выводит их не парами


desperado_gmbh уже прокомментировал твою первую попытку. Кстати, полезно ответить на его вопросы.
Попутно, сделай вот что.
Напиши алгоритм не сразу на С/С++, а словами... но по шагам.

Можно за несколько заходов:

(первая попытка)
1. Для каждого числа A из n1..n2... Стоп! Откуда мы узнаем n1,n2?

(вторая попытка)
1. Прочитать n1,n2.
2. Для каждого числа A из n1..n2
2.1. Найти B — сумму делителей A, следующим способом:
2.2. Для каждого d от 1 до A-1
2.2.1. Если d — делитель, то прибавить его к B... Стоп! К чему прибавляем первый раз? (Чему равно B до начала цикла)

и так далее.
Перекуём баги на фичи!
Re[3]: задачи по Visual C++ 6
От: Katenok  
Дата: 06.10.05 11:30
Оценка:
_>
#include <math.h>
_>#include <iostream>
_>using namespace std;
_>#include <stdio.h>

_>void main ()

_>{
_>int n1, n2,i;
_>// Чему здесь равны n1 и n2 и почему? их мы задаем например диапозон от 560 до 899 значит n1=560 n2=899
_>for (int A=n1; A<=n2; A++)
_>// Сколько раз выполнится этот цикл? Где кончается тело этого цикла? 
     Заканчивается тело цикла:(cout << A << "\n";
)
_>cout << "n1=? n2=?" << "\n";
_>cin >> n1>>n2;
_>// Чему здесь равно A и почему? А - это числа диапазона заданного, им и равно
_>cout << A << "\n";

_>// Сколько раз выполнится следующий блок кода и почему? пока не переберем все А
_>{
_>    int res=0;
_>    int B;
_>// Чему здесь равно B и почему? В-сумма делителей числа A, изначально равно 0
_>    printf("\n");

_>    for (int i=1;i<A;i++)
_>    {
_>        if (A%i==0) {B=B+i;/*printf("\n");*/}
_>// Чему станет равно B после первого шага этого цикла и почему? сумме делителей первого числа А
_>    }
_>    printf("B=%d",B);
_>    if (B==A) {res=1;}
_>// Что означает переменная res и где она используется? хранить результат полученный
_>}

_>{
_>    int res=0;
_>    int B;
_>// Чему здесь равно B и почему? полученные в предыдущем цикле B
_>    int C;
_>    printf("\n");

_>    for (int i=1;i<B;i++)
_>    {
_>        if (B%i==0) {C=C+i;/*printf("\n");*/}
_>    }
_>    printf("C=%d",C);
_>    if (C==B) {res=1;}
_>}

_>for (int C=n1; C<=n2; C++)
_>{
_>if (A=C) printf("\nNumber %d drug\n",C);

_>}

_>for (int B=n1; B<=n2; B++)
_>{

_>if (A=B) printf("\nNumber %d drug\n",B);
_>}
_>}
Re[4]: задачи по Visual C++ 6
От: desperado_gmbh http://www.livejournal.com/users/tolstopuz
Дата: 06.10.05 12:01
Оценка:
Здравствуйте, Katenok, Вы писали:

_>>void main ()


_>>{

_>>int n1, n2,i;
_>>// Чему здесь равны n1 и n2 и почему? их мы задаем например диапозон от 560 до 899 значит n1=560 n2=899
Задаем-то мы их ниже, в той строчке, где cin. В этом месте программы они еще не заданы, значит, неопределены. Там мусор.
Может случайно оказаться, например, что мусор выглядит как n1=153, n2=152, и следующий цикл не выполнится вообще ни разу,
то есть вопрос пользователю не будет задан. А может случиться, что n1=1001, n2=1100, и вопрос будет задан 100 раз.
_>>for (int A=n1; A<=n2; A++)
_>>// Сколько раз выполнится этот цикл? Где кончается тело этого цикла?
K> Заканчивается тело цикла: (cout << A << "\n"; )
Компилятор думает по-другому. Для него тело цикла — один оператор, то есть следующая строка.
Чтобы поместить в цикл несколько операторов, есть фигурные скобки.
Но в любом случае непонятно, зачем спрашивать n1 и n2 много раз в цикле. Пользователь хочет ввести их только один раз.
_>>cout << "n1=? n2=?" << "\n";
_>>cin >> n1>>n2;
_>>// Чему здесь равно A и почему? А — это числа диапазона заданного, им и равно
A не может быть равно сразу нескольким числам, только какому-нибудь одному.
А так цикл уже давно кончился, то A либо равно тому значению n1, то было в том цикле,
либо на единицу больше того значения n2, которое было в том цикле.
А они оба были неопределены — их задали только что, в предыдущей строке.
Значит, и A неопределено. Там опять мусор.
В любом случае пользоваться тем int A, которое было внутри цикла, после цикла уже не нужно,
а более свежие компиляторы (например, Visual C++ 7.1) вообще не разрешили бы этого делать.
_>>cout << A << "\n";

_>>// Сколько раз выполнится следующий блок кода и почему? пока не переберем все А

Как компилятор об этом узнает? Цикл давно кончился, поэтому код между следующими фигурными скобками
выполнится только один раз с тем самым мусором в A.
_>>{
_>> int res=0;
_>> int B;
_>>// Чему здесь равно B и почему? В-сумма делителей числа A, изначально равно 0
Компилятор так не думает. Если написано "int B;", то B изначально не равно 0, а неопределено.
_>> printf("\n");

_>> for (int i=1;i<A;i++)

_>> {
_>> if (A%i==0) {B=B+i;/*printf("\n");*/}
_>>// Чему станет равно B после первого шага этого цикла и почему? сумме делителей первого числа А
Сумме делителей оно должно стать после полного завершения цикла.
Но к нему еще прибавится то самое неопределенное начальное значение B. То есть в сумме опять мусор.
_>> }
_>> printf("B=%d",B);
_>> if (B==A) {res=1;}
_>>// Что означает переменная res и где она используется? хранить результат полученный
Что в ней хранится — в принципе понятно, хотя это не совсем то, что требуется по условию задачи.
Но где именно используется этот полученный результат?
_>>}

_>>{

_>> int res=0;
_>> int B;
_>>// Чему здесь равно B и почему? полученные в предыдущем цикле B
Нет. Так как B было определено внутри блока, который кончился четыре строчки назад (там, где "{"), после этой скобки компилятор о нем забыл. Теперь это новое B, которое опять же неопределено.
_>>}[/c]
Re[3]: задачи по Visual C++ 6
От: Кодт Россия  
Дата: 06.10.05 13:48
Оценка:
Здравствуйте, desperado_gmbh, Вы писали:

Добавлю ещё:
  .....

  // Сколько итераций выполнят эти циклы, для каждого A?
  // Что должно делаться в скобках оператора if, и что там делается на самом деле?
  // Сколько раз условие будет истинно, и сколько - должно быть истинно?
  // Можно ли их существенно упростить? ;)

_>for (int C=n1; C<=n2; C++)
_>{
_>if (A=C) printf("\nNumber %d drug\n",C);

_>}

_>for (int B=n1; B<=n2; B++)
_>{

_>if (A=B) printf("\nNumber %d drug\n",B);
_>}
_>}
Перекуём баги на фичи!
Re[4]: задачи по Visual C++ 6
От: Katenok  
Дата: 07.10.05 04:47
Оценка:
Все с 3 задачей запуталась окончательно

вот еще вопросик по такому коду задачи:


//Задача  В последовательность введенных символов (последний '$') определить порядковый 
//номер первой буквы R (с учетом верхнего/нижнего регистров)

#include<stdio.h>
#include<iostream>
using namespace std;
void main()
{ 
int c, ner=0, r=0, pornr=0;
puts("Введите последовательность символов, заканчивающуюся '$'"); 
while((c=getchar())!='$')
  switch(c)
{
case 'r':  case 'R': r++; pornr=r+ner; break;

default: ner++;
}
printf("\nБыло введено:\nБукв 'R': %3d\n", pornr);

}

//Почемуто считает порядковый номер последней R, а не первой не смотря нa break.
Re[5]: задачи по Visual C++ 6
От: Radmir Россия  
Дата: 07.10.05 05:13
Оценка:
Здравствуйте, Katenok, Вы писали:

K>Все с 3 задачей запуталась окончательно


K>вот еще вопросик по такому коду задачи:



K>
//Задача  В последовательность введенных символов (последний '$') определить порядковый 
K>//номер первой буквы R (с учетом верхнего/нижнего регистров)

K>#include<stdio.h>
K>#include<iostream>
K>using namespace std;
K>void main()
K>{ 
K>int c, ner=0, r=0, pornr=0;
K>puts("Введите последовательность символов, заканчивающуюся '$'"); 
K>while((c=getchar())!='$')
K>  switch(c)
K>{
K>    case 'r':
K>    case 'R':
K>        r++;  // Это переменная зачем ?
K>        pornr=r+ner; // здесь тоже r лишняя
K>    break;

K>default: ner++;
K>}
K>printf("\nБыло введено:\nБукв 'R': %3d\n", pornr);

K>}

K>//Почемуто считает порядковый номер последней R, а не первой не смотря нa break.


1. Данный break является "выходом" из case, а не из цикла. Для того чтобы найти позицию R используй флаги.
Например заведи какую-нибудь переменную типа bool и присовой ей до входа в цикл значение false; если найдешь бекву R поверь если этот флаг равен false то соответственно ты нашла первую букву. запомни ее позицию и установи значение флага true.

З.Ы. Если ты попытаешься в данной программе преждевременно выйти из цикла то ее работа не будет соответствовать постановки задачи. т.к. в условии сказано что последовательность должна заканциваться '$' а если ты выдешь из цикла то до '$' дело не дойдет.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Лучше спросить дорогу чем заблудиться
Re[6]: задачи по Visual C++ 6
От: Katenok  
Дата: 07.10.05 08:29
Оценка:
по поводу предыдущей задачки с кодом, а можно ее как нить без флагов решить? у меня же она работает. и считает, но только не первое значение R, а последнее..

мммм.. пыталась исправит по тому что вы тут понаписали 3 задачу ... вот что выходит.. я явно что-то не понимаю
#include <math.h>
#include <iostream>
using namespace std;
#include <stdio.h>
#include <windows.h>

void main ()

{
static int n1, n2;
int i;
char str[128];
CharToOem("Введите значение n1  ",str);cout<<str;cin>>n1;
CharToOem("Введите значение n2  ",str);cout<<str;cin>>n2;

for (int A=n1; A<=n2; A++)
cout << A << "\n";

{
    int res=0;
    int B=0;
   // printf("\n");

    for (int i=1;i<A;i++)
    {
        if (A%i==0) {B=B+i;/*printf("\n");*/}
    }
    printf("B=%d",B);
    {if (B==A) {res=1;}}
    return res;

    else

        {
    int C=0;
   // printf("\n");

    for (int i=1;i<B;i++)
    {
        if (B%i==0) {C=C+i;/*printf("\n");*/}
    }
    printf("C=%d",C);
    if (C==B) {res=1;}
    return res;
    } }

for (int C=n1; C<=n2; C++)
{
if (A=C) printf("\nNumber %d drug\n",A,C);
}

for (int B=n1; B<=n2; B++)
{
if (A=B) printf("\nNumber %d drug\n",A,B);
} }
Re[7]: задачи по Visual C++ 6
От: Radmir Россия  
Дата: 07.10.05 08:56
Оценка:
Здравствуйте, Katenok, Вы писали:

K>по поводу предыдущей задачки с кодом, а можно ее как нить без флагов решить? у меня же она работает. и считает, но только не первое значение R, а последнее..

Так поэтому она и берет последнее значение. потому что не знает о том что она уже один раз нашла 'R'

K>мммм.. пыталась исправит по тому что вы тут понаписали 3 задачу ... вот что выходит.. я явно что-то не понимаю

K>
K>#include <math.h>
K>#include <iostream>
K>using namespace std;
K>#include <stdio.h>
K>#include <windows.h>

K>void main ()

K>{
K>static int n1, n2;
K>int i;
K>char str[128];
K>CharToOem("Введите значение n1  ",str);
K>cout<<str;
K>cin>>n1;
K>CharToOem("Введите значение n2  ",str);
K>cout<<str;
K>cin>>n2;

K>for (int A=n1; A<=n2; A++) // Еще раз посмотри где заканчивается тело цикла ?
K>cout << A << "\n";

K>{
K>    int res=0;
K>    int B=0;
K>   // printf("\n");

K>    for (int i=1;i<A;i++)
K>    {
K>        if (A%i==0) {B=B+i;/*printf("\n");*/}
K>    }
K>    printf("B=%d",B);
K>    {if (B==A) {res=1;}} // Для  чего внешние {}
K>    return res; // Куда ты возвращаешь res

K>    else    // к чему отностися else

K>        {
K>    int C=0;
K>   // printf("\n");

K>    for (int i=1;i<B;i++)
K>    {
K>        if (B%i==0) {C=C+i;/*printf("\n");*/}
K>    }
K>    printf("C=%d",C);
K>    if (C==B) {res=1;}
K>    return res;    // Куда ты возвращаешь res
K>    } }

K>for (int C=n1; C<=n2; C++)
K>{
K>if (A=C) printf("\nNumber %d drug\n",A,C); // еще раз обрати внимание на выделенное выражение
K>}

K>for (int B=n1; B<=n2; B++)
K>{
K>if (A=B) printf("\nNumber %d drug\n",A,B); // тоже самое.
K>} }
K>


Мой тебе совет попробуй написать в словесной форме полностью алгоритм работы программы
например:
1. Вывести на экран "Введите значение n1"
2. Считать занчение с клавитуры. в n1
1. Вывести на экран "Введите значение n2"
2. Считать занчение с клавитуры. в n2
3. Цикл от n1 до n2
3.1 присвоети значение res = 0
и т.д.
т.е. перед тем как кодировать полность определись как должно работать твоя программа.
выложи свой алгоритм мы его обсудим а потом возъмемся за кодирование.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Лучше спросить дорогу чем заблудиться
Re[8]: задачи по Visual C++ 6
От: Katenok  
Дата: 07.10.05 09:30
Оценка:
Вот то что я себе представляю как алгоритм этой программы и пытаюсь закодировать, но не получается из-за нехватки знаний и понимания с++

1. Получим множество чисел А из диапазона [n1,n2]. Значения n1, n2 зададим с клавиатуры
2. Для всех чисел А из этого диапазона найдем сумму их делителей В
3. Для всех полученных чисел В найдем сумму их делителей С
4. Если В=А, и В принадлежит [n1,n2], то выводим его.
5. Если С=А, и С принадлежит [n1,n2], то выводим его.
Re[9]: задачи по Visual C++ 6
От: Radmir Россия  
Дата: 07.10.05 10:12
Оценка:
Здравствуйте, Katenok, Вы писали:

K>Вот то что я себе представляю как алгоритм этой программы и пытаюсь закодировать, но не получается из-за нехватки знаний и понимания с++


K>1. Получим множество чисел А из диапазона [n1,n2]. Значения n1, n2 зададим с клавиатуры

K>2. Для всех чисел А из этого диапазона найдем сумму их делителей В
K>3. Для всех полученных чисел В найдем сумму их делителей С
K>4. Если В=А, и В принадлежит [n1,n2], то выводим его.
K>5. Если С=А, и С принадлежит [n1,n2], то выводим его.

Во первых твой алгоритм не правилный.
Во вторых он слишком "абстрактный".
Давай попробуем рассуждать так:
Что нам надо сделать — найти дружественные чила в диапазоне [n1,n2]
соответственно как у тебя и написано в алгоритме нам надо сначчало узнать этот диапазон.

поэтому шаг 1
Запросить у пользователя n1 и n2

теперь нам надо найти суммы делителей для всех A из этого диапазона.
Для хранения этих сумм нам соответственно нужен массив. т.к. для каждого числа суммы делителей разные.
Вохможно два варианта решиения либо динамически выделить память для этого массива либо создать заранее довольно большой массив.
Воспользвумся вторым вариантом т.к. он проще.

соответственно шаг 2
создадим массив типа int для хранения сумм (размером например 1000)
и обнулим его.

т.к. массив у нас начинается всегда с 0 будем считать что в S[0] будет хранится сумма для n1 в S[1] n1+1 ...S[999] n1+999
теперь нам надо посчитать суммы делителей.
Соответственно это надо делать в цикле.
поэтому шаг 3
цикл для A от n1 до n2

что же как нам найти делители числа?
у тебя в программе написано абсолютно верно что если останок от деления равен 0 то число является делителем.
Нам надо найти все днлители числа.
поэтому нам нужен еще один цикл
поэтому шаг 3.1
цикл для C от 2 до sqrt (A)


поэтому шаг 3.1.1
Если (A % C == 0 ) тогда S[n1-A] = S[n1-A] + C

шаг 3.1.2
конец цикла 3.1


шаг 3.2
конец цикла 3


попробуй пока закодировать это кусок. Потом продолжим
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Лучше спросить дорогу чем заблудиться
Re[10]: задачи по Visual C++ 6
От: Кодт Россия  
Дата: 07.10.05 10:59
Оценка:
Здравствуйте, desperado_gmbh, Вы писали:

_>1. Получить с клавиатуры значения n1 и n2.

_>2. Для каждого A из диапазона [n1,n2] выполнить следующие действия:
_>2.1. Найти сумму его делителей B.
_>2.2. Если B принадлежит [n1,n2], то выполнить следующие действия:
_>2.2.1. Для числа B найти сумму его делителей C.
_>2.2.2. Если C=A, то вывести A и B.

_>Кстати, проверить число на принадлежность диапазону можно всего двумя сравнениями, без циклов.


И ещё кстати, если A==B (совершенное число — дружественное самому себе), то нет смысла вычислять C:
Поскольку B=f(A) == A, то C=f(B) == f(A) == B == A.
Эту проверку можно вставить, скажем, сразу после 2.1.
Перекуём баги на фичи!
Re[11]: задачи по Visual C++ 6
От: Radmir Россия  
Дата: 07.10.05 11:00
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Radmir, Вы писали:


R>>поэтому шаг 1

R>>Запросить у пользователя n1 и n2
R>>

R>>теперь нам надо найти суммы делителей для всех A из этого диапазона.
R>>Для хранения этих сумм нам соответственно нужен массив. т.к. для каждого числа суммы делителей разные.
R>>Вохможно два варианта решиения либо динамически выделить память для этого массива либо создать заранее довольно большой массив.
R>>Воспользвумся вторым вариантом т.к. он проще.

К>Массив нам не нужен!

К>Чтобы посчитать сумму делителей, можно находить их по одному и тут же суммировать.
Как я помнь дружественные числа это числа суммы делителей которых равны.
Соответственно проще всего найти суммы делителей всех чисел из диапазона [n1;n2]
А затем найти те у которых суммы равны.
Т.е. проще всего это сделыть с помощю массива.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Лучше спросить дорогу чем заблудиться
Re[11]: задачи по Visual C++ 6
От: Radmir Россия  
Дата: 07.10.05 11:06
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Radmir, Вы писали:


R>>поэтому шаг 1

R>>Запросить у пользователя n1 и n2
R>>

R>>теперь нам надо найти суммы делителей для всех A из этого диапазона.
R>>Для хранения этих сумм нам соответственно нужен массив. т.к. для каждого числа суммы делителей разные.
R>>Вохможно два варианта решиения либо динамически выделить память для этого массива либо создать заранее довольно большой массив.
R>>Воспользвумся вторым вариантом т.к. он проще.

К>Массив нам не нужен!

К>Чтобы посчитать сумму делителей, можно находить их по одному и тут же суммировать.
Блин!
точно ошибся.
Массив нам не нужен.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Лучше спросить дорогу чем заблудиться
Re[12]: задачи по Visual C++ 6
От: Katenok  
Дата: 07.10.05 11:35
Оценка:
а-ааа все вкоруг такие умные.. а я опять затупила.. в первоначальном коде, в чем я напутала???? в воде n1 n2, и в циклах со скобкамит заблудилась??? или там вообще полная бяка??? я счас точно с ума сойду, первые две задачки по сравнению с этой сказка...
Re[13]: задачи по Visual C++ 6
От: Radmir Россия  
Дата: 07.10.05 11:45
Оценка:
Здравствуйте, Katenok, Вы писали:

K>а-ааа все вкоруг такие умные.. а я опять затупила.. в первоначальном коде, в чем я напутала???? в воде n1 n2, и в циклах со скобкамит заблудилась??? или там вообще полная бяка??? я счас точно с ума сойду, первые две задачки по сравнению с этой сказка...

Не отчаивася. прорвемся.
Теперь у нас есть "рабочий" алгоритм от "desperado_gmbh"

Вставляем алогритм в текст программы в виде коментариев и для каждой операции делаем соответствующий код на С++
#include <math.h>
#include <iostream>
using namespace std;
#include <stdio.h>
K>#include <windows.h>

void main ()
{
    int n1, n2;
        //1. Получить с клавиатуры значения n1 и n2.
        CharToOem("Введите значение n1  ",str);
        cout<<str;
        cin>>n1;
        CharToOem("Введите значение n2  ",str);
        cout<<str;
        cin>>n2;
        //2. Для каждого A из диапазона [n1,n2] выполнить следующие действия:
        for (int A=n1; A<=n2; A++)
        {
            //продолжи дальше сама
            //2.1. Найти сумму его делителей B.
            
            //2.2. Если B принадлежит [n1,n2], то выполнить следующие действия:
            //2.2.1. Для числа B найти сумму его делителей C.
            //2.2.2. Если C=A, то вывести A и B.
        }
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Лучше спросить дорогу чем заблудиться
Re[12]: задачи по Visual C++ 6
От: Katenok  
Дата: 07.10.05 17:30
Оценка:
Хочу вернуться еще к вот этой задачке, я добавила в код флаги, и убрала то что было лишним, но у меня она почему то считает не с первого элемента а с 0, т.е. в последовательности dddRrrr$ первая R находится на 5 месте..

//Задача  В последовательность введенных символов (последний '$') определить порядковый 
//номер первой буквы R (с учетом верхнего/нижнего регистров)

#include<stdio.h>
#include<iostream>
using namespace std;
void main()
{ 
int c, ner=0, r=0, pornr=0;
bool z=false;
puts("Введите последовательность символов, заканчивающуюся '$'"); 
while((c=getchar())!='$')
  switch(c)
{
case 'r':  case 'R': pornr=+ner; z=true;
    break;

default: ner++;
}
printf("\nБыло введено:\nБукв 'R': %3d\n", pornr);}
Re[11]: задачи по Visual C++ 6
От: Katenok  
Дата: 07.10.05 17:48
Оценка:
А это код моей злосчастной задачки.. вот таким он у меня получается

#include <math.h>
#include <iostream>
using namespace std;
#include <stdio.h>
#include <windows.h>

void main ()

{
int n1, n2;
char str[128];
CharToOem("Введи значение n1  ",str);cout<<str;cin>>n1;
CharToOem("Введи значение n2  ",str);cout<<str;cin>>n2;

for (int A=n1; A<=n2; A++)
//2. Для каждого A из диапазона [n1,n2] выполнить следующие действия:
            //продолжи дальше сама
            //2.1. Найти сумму его делителей B.
{
    int res=0;
    int B=0;

    
    {for (int i=1;i<A;i++)
    { if (A%i==0) {B=B+i;}}
  
    {if (B==A) {res=1;}}
    return res;}
 //2.2. Если B принадлежит [n1,n2], то выполнить следующие действия:
    {for (int B=n1; B<=n2; B++)}
    //2.2.1. Для числа B найти сумму его делителей C.
       int C=0;
        {
      for (int i=1;i<B;i++)
    {
        if (B%i==0) {C=C+i;}
    }
      {    if (C==B) {res=1;}
      return res;}
    } }

//2.2.2. Если C=A, то вывести A и B.
{
if (C==A) printf("\nNumber %d drug\n",A,B);
} }
Re[12]: задачи по Visual C++ 6
От: Radmir Россия  
Дата: 08.10.05 03:35
Оценка:
Здравствуйте, Katenok, Вы писали:

K> А это код моей злосчастной задачки.. вот таким он у меня получается


K>
K>#include <math.h>
K>#include <iostream>
K>using namespace std;
K>#include <stdio.h>
K>#include <windows.h>

K>void main ()

K>{
K>int n1, n2;
K>char str[128];
K>CharToOem("Введи значение n1  ",str);cout<<str;cin>>n1;
K>CharToOem("Введи значение n2  ",str);cout<<str;cin>>n2;

K>for (int A=n1; A<=n2; A++)
K>//2. Для каждого A из диапазона [n1,n2] выполнить следующие действия:
K>            //продолжи дальше сама
K>            //2.1. Найти сумму его делителей B.
K>{
K>    int res=0;
K>    int B=0;

K>    {for (int i=1;i<A;i++) // Для чего {
K>    { if (A%i==0) {B=B+i;}}
  
K>    {if (B==A) {res=1;}} // Объясни эту строку
K>    return res;}  // куда ты возвращаешь res ?
K> //2.2. Если B принадлежит [n1,n2], то выполнить следующие действия:
K>    {for (int B=n1; B<=n2; B++)} // Для чего внешние {...}
K>    //2.2.1. Для числа B найти сумму его делителей C.
K>       int C=0;
K>        {
K>      for (int i=1;i<B;i++)
K>    {
K>        if (B%i==0) {C=C+i;}
K>    }
K>      {    if (C==B) {res=1;}
K>      return res;} // куда ты возвращаешь res ?
K>    } }

K>//2.2.2. Если C=A, то вывести A и B.
K>{
K>if (C==A) printf("\nNumber %d drug\n",A,B);
K>} }
K>


Некоторые замечания:
1.
"{...}" называются операторными с помощью них сосдаются так называемые составные операторы
например возмем слеующий код:
int i;
int b;
for ( i=1;i<A;i++)
    B=B+i;
    C=C+i;

в этом случае в цикле будет выполнятся только строка B=B+i;
а стока C=C+i; выполнится только после того как пройдет весь цикл.
для того чтобы в цикле выполнялись обе стоки надо их заключить в операторные скобки:

int i;
int b;
for ( i=1;i<A;i++)
{
    B=B+i;
    C=C+i;
}

теперь внимательно посмотри на свой код и расставть опреаторные скобки правильно.
2. return это точка выхода из функции т.е. если при выполнении функции мы "натыкаемся" на return то это комманда выхода из функции
например
void main ()
{
    int i;
    // ...
    // здесь мы задем зачение i
    //...
    //    если i == 0 то выходим из программы
    if (i == 0)
        return;
    // ...
    // если не равна то работаем дальше
}

следующий момент
Ты можешь только возврящать переменные того типа который указан в качестве возврящаемого параметра
например:
если ты пишешь
  int main()
    {
    //...

то соответственно ты должна возвращать только тип int
если
  void main()
    {
    //...

то соответственно ты не можешь возврашать какие-либо значения то-есть надо писать просто return;

3. Функция main является основной "функцией" программы и если ты внутри нее вызываешь return, то это означает завершение работы программы соответственно возвращаемые тобой значения ни кем не обработаются (по правде они обрабатываются, но пока считай что они ни кем не обрабатываются). Так что записть внутри main return res; не имеет смысла.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Лучше спросить дорогу чем заблудиться
Re[13]: задачи по Visual C++ 6
От: Radmir Россия  
Дата: 08.10.05 04:29
Оценка:
Здравствуйте, Katenok, Вы писали:

K>Хочу вернуться еще к вот этой задачке, я добавила в код флаги, и убрала то что было лишним, но у меня она почему то считает не с первого элемента а с 0, т.е. в последовательности dddRrrr$ первая R находится на 5 месте..


K>
K>//Задача  В последовательность введенных символов (последний '$') определить порядковый 
K>//номер первой буквы R (с учетом верхнего/нижнего регистров)

K>#include<stdio.h>
K>#include<iostream>
K>using namespace std;
K>void main()
K>{ 
K>int c, ner=0, r=0, pornr=0;
K>bool z=false;
K>puts("Введите последовательность символов, заканчивающуюся '$'"); 
K>while((c=getchar())!='$')
K>  switch(c)
K>{
K>case 'r':  case 'R': pornr=+ner; z=true; // напиши pornr=ner так понятнее :)
K>    break;

K>default: ner++;
K>}
K>printf("\nБыло введено:\nБукв 'R': %3d\n", pornr);} // мне кажется должно быть написано "позиция первой буква R ..."
K>

Во первых программисты всегда считают с 0
Во вторых В этом плане в алгоритме работы все правильно. просто выводи pornr+1
но вот в поиске символа закралась ошибка.
попробуй ввести например строку dddRrrrdr$
Ты фраг то выставляешь. Но вот вопрос где ты его проверяешь?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Лучше спросить дорогу чем заблудиться
Re[14]: задачи по Visual C++ 6
От: Katenok  
Дата: 08.10.05 11:38
Оценка:
А-а-аа мне дурно... я зарылась в этих скобочках.. если я правильно поняла то вот так...


//2.1. Найти сумму его делителей B.
K>{
K>    int res=0;
K>    int B=0;

K>    for (int i=1;i<A;i++)  
L>    K>    { if (A%i==0) B=B+i;}
  
K>    {if (B==A) res=1;} // Если В=А то запоминаем этот результат
L>    
K>    return ;}  // в начало цикла?
K> //2.2. Если B принадлежит [n1,n2], то выполнить следующие действия:
K>    for (int B=n1; B<=n2; B++) 
K>    //2.2.1. Для числа B найти сумму его делителей C.
K>       int C=0;
K>        {
K>      for (int i=1;i<B;i++)
K>    {
K>        if (B%i==0) C=C+i; }
K>      {    if (C==B) res=1;
K>      return ;} // в начало этого цикла
K>    } }

K>//2.2.2. Если C=A, то вывести A и B.
K>{
K>if (C==A) printf("\nNumber %d drug\n",A,B);
K>} }
K>


А в другой задаче где ошибка в поиске символа ??? Добавила в выводе выводи pornr+1
и вроде все правильно считает...
Флаг проверяю когда прога найдет R...
Re[15]: задачи по Visual C++ 6
От: Radmir Россия  
Дата: 08.10.05 12:00
Оценка:
Здравствуйте, Katenok, Вы писали:

K>А-а-аа мне дурно... я зарылась в этих скобочках.. если я правильно поняла то вот так...

Да со скобочками у тебя проблема

K>
K>//2.1. Найти сумму его делителей B.
K>>{
K>>    int res=0;
K>>    int B=0;

K>>    for (int i=1;i<A;i++)  // начинается цикл но ГДЕ он заканчивается?
K>    { if (A%i==0) B=B+i;} 
  
K>>    {if (B==A) res=1;} // Если В=А то запоминаем этот результат

K>>    return ;}  // в начало цикла? return выход из программы для перехода на начало цикла continue;
K>> //2.2. Если B принадлежит [n1,n2], то выполнить следующие действия:
K>>    for (int B=n1; B<=n2; B++) // начинается цикл но ГДЕ он заканчивается?
K>>    //2.2.1. Для числа B найти сумму его делителей C.
K>>       int C=0;
K>>        {
K>>      for (int i=1;i<B;i++)
K>>    {
K>>        if (B%i==0) C=C+i; }
K>>      {    if (C==B) res=1;
K>>      return ;} // в начало этого цикла
K>>    } }

K>>//2.2.2. Если C=A, то вывести A и B.
K>>{
K>>if (C==A) printf("\nNumber %d drug\n",A,B);
K>>} }
K>>
K>


для простоты понимания попробуем переформатировать твой код вот так:
void main()
{ 
    int res=0;
    int B=0;

    for (int i=1;i<A;i++)  // начинается цикл но ГДЕ он заканчивается?
    {
        if (A%i==0) B=B+i;
    } 

    {
        if (B==A) res=1;
    } // Если В=А то запоминаем этот результат
    return;
}  // в начало цикла? return выход из программы для перехода на начало цикла continue;
//2.2. Если B принадлежит [n1,n2], то выполнить следующие действия:
for (int B=n1; B<=n2; B++) // начинается цикл но ГДЕ он заканчивается?
//2.2.1. Для числа B найти сумму его делителей C.
int C=0;
{
    for (int i=1;i<B;i++)
    {
        if (B%i==0) C=C+i;
    }
    {
        if (C==B) res=1;
        return ;
    } // в начало этого цикла
}
}
//2.2.2. Если C=A, то вывести A и B.
{
    if (C==A) printf("\nNumber %d drug\n",A,B);
}
}

Может при таком форматировании поможет

K>А в другой задаче где ошибка в поиске символа ??? Добавила в выводе выводи pornr+1

K>и вроде все правильно считает...
K>Флаг проверяю когда прога найдет R...
Ты мой пример попробывала?
работает все правильно?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Лучше спросить дорогу чем заблудиться
Re[16]: задачи по Visual C++ 6
От: Katenok  
Дата: 08.10.05 13:49
Оценка:
R>Ты мой пример попробывала?
R>работает все правильно?

Да с твоим примером работает правильно, а вот в чем фишка не поняла
Re[16]: задачи по Visual C++ 6
От: Katenok  
Дата: 08.10.05 13:54
Оценка:
Вот так получается при упрощенном коде, но ведь у меня так они раньше и стояли??? или опять что-то не то
void main()
{ 
    int res=0;
    int B=0;

   { for (int i=1;i<A;i++)  // начинается цикл но ГДЕ он заканчивается?
    {
        if (A%i==0) B=B+i;
    } 

    {
        if (B==A) res=1;
    } 
    continue;
}  } // вот тут он заканчивается

{for (int B=n1; B<=n2; B++) // начинается цикл но ГДЕ он заканчивается?

int C=0;
{
    for (int i=1;i<B;i++)
    {
        if (B%i==0) C=C+i;
    }
    {
        if (C==B) res=1;
continue;
    }} // вот тут заканчивается этот цикл 
}
}
//2.2.2. Если C=A, то вывести A и B.
{
    if (C==A) printf("\nNumber %d drug\n",A,B);
}
}
Re[15]: задачи по Visual C++ 6
От: Radmir Россия  
Дата: 08.10.05 14:14
Оценка:
Количество открывающихся "{" и закрывающихся "}" скобок должно быть одинаково. У тебя их разное количество.
Давай попробубуем заново написать код программы.
Будем пользоваться следующими правилами:
1. Все "{" и "}" будем комментировать для чего мы их ставим
2. Выравникать каждую "{" и "}"
{
  // блок 1
  {
    // блок 2
    {
       // блок 3
    }
  }

  { 
       // блок 4
  }

}


2. тело цикла должно начинаться с "{" и заканчиваться "}"

т.е. например
for (int i=1;i<A;i++)  
{  //начало тела цикла
   // здесь идет много строк кода
   // ...
   // вложенный цикл
   for (int B=n1; B<=n2; B++) 
   {//начало тела вложенного цикл цикла
      // здесь идет много строк кода
      // выполняющегося во вложенном цикла
   }// конец тела вложенного цикла

}// конец тела цикла

3. тоже самое должно быть и с условиями

if (B%i==0)
{ // начало блока который выполняется если условие верно

  // здесь идет код

} // конец блока условия
else
{// начало блока который выполняется если условие нкеверно

  // здесь идет код

}конец блока else

Попробуй написть свой код используя эти правила должно все получиться


Теперь по поводу задачи с R
посмотрим внимательно твой код:

У тебя все правильно толко надо вставить проверку флага.
Я тебе покажу где
//Задача  В последовательность введенных символов (последний '$') определить порядковый 
//номер первой буквы R (с учетом верхнего/нижнего регистров)
#include<stdio.h>
#include<iostream>
using namespace std;
void main()
{ 
int c, ner=0, r=0, pornr=0;
bool z=false;
puts("Введите последовательность символов, заканчивающуюся '$'"); 
while(((c=getchar())!='$') && (z == false)) // или здесь
  switch(c)
{
case 'r':  case 'R': if (z == false) {pornr=+ner; z=true;} // или здесь
    break;

default: ner++;
}
printf("\nБыло введено:\nБукв 'R': %3d\n", pornr);}


если у тебя не будет проверки флага то в следующей последовательности

"aRaaaaR"
результат будет не 1(если считать с 0) а 5
Лучше спросить дорогу чем заблудиться
Re[16]: задачи по Visual C++ 6
От: Katenok  
Дата: 08.10.05 15:37
Оценка:
Думаю проверку флага надо вставить в первом случае..

а по поводу другой, у меня ошибка только в неправильных скобочках, и нехватке else??
Re[17]: задачи по Visual C++ 6
От: desperado_gmbh http://www.livejournal.com/users/tolstopuz
Дата: 09.10.05 06:39
Оценка:
Здравствуйте, Katenok, Вы писали:

K>а по поводу другой, у меня ошибка только в неправильных скобочках, и нехватке else??


Еще не нужен res и все операции с ним — все равно он вообще нигде не используется. На шаге 2.2 ("ЕСЛИ") почему-то вместо if написан for. Шаг 2.2.2 почему-то стоит не рядом с 2.2.1, а после завершения цикла. Остальную кучку мелких ошибок покажу после исправления крупных.

Но идея писать в комментарии к return, куда надо вернуться, мне нравится. На месте компилятора я бы этот комментарий обязательно прочитал и учел
Re[18]: задачи по Visual C++ 6
От: Katenok  
Дата: 10.10.05 06:18
Оценка:
Вот моя очередная попытка побороть скобки.... мне уже жутко стыдно..

void main ()

{
int n1, n2;
char str[128];
CharToOem("Введите значение n1  ",str);cout<<str;cin>>n1;
CharToOem("Введите значение n2  ",str);cout<<str;cin>>n2;

for (int A=n1; A<=n2; A++)    
    { 
    int B=0;
    for (int i=1;i<A;i++)
        {if (A%i==0) B=B+i;
         else (B==A) printf("\nNumber %d drug\n",A,B);
        }

    for (int B=n1; B<=n2; B++)
        {
        int C=0;
        for (int i=1;i<B;i++)
            {if (B%i==0) C=C+i;
            else (C==A) printf("\nNumber %d drug\n",A,C);
            }
        }
    }      
}
Re[19]: задачи по Visual C++ 6
От: desperado_gmbh http://www.livejournal.com/users/tolstopuz
Дата: 10.10.05 08:24
Оценка:
Здравствуйте, Katenok, Вы писали:

Напоминаю алгоритм:

1. Получить с клавиатуры значения n1 и n2.
2. Для каждого A из диапазона [n1,n2] выполнить следующие действия:
2.1. Найти сумму его делителей B.
2.2. Если B принадлежит [n1,n2], то выполнить следующие действия:
2.2.1. Для числа B найти сумму его делителей C.
2.2.2. Если C=A, то вывести A и B.

K> for (int B=n1; B<=n2; B++)

K> {
K> int C=0;
K> for (int i=1;i<B;i++)
K> {if (B%i==0) C=C+i;
K> else (C==A) printf("\nNumber %d drug\n",A,C);
K> }
K> }

На шаге 2.2 ("ЕСЛИ") почему-то вместо if написан for. Еще появились какие-то два else, хотя в алгоритме нет ни одного слова "ИНАЧЕ". Да и вывод на печать в алгоритме идет в одном месте, а не в двух, потому что оптимизацией заниматься еще рано.
Re[20]: задачи по Visual C++ 6
От: Katenok  
Дата: 10.10.05 09:06
Оценка:
#include <math.h>
#include <iostream>
using namespace std;
#include <stdio.h>
#include <windows.h>

void main ()

{
int n1, n2;
char str[128];
CharToOem("Ââåäè çíà÷åíèå n1  ",str);cout<<str;cin>>n1;
CharToOem("Ââåäè çíà÷åíèå n2  ",str);cout<<str;cin>>n2;

for (int A=n1; A<=n2; A++)    
    { 
    int B=0;
    for (int i=1;i<A;i++)
        {if (A%i==0) B=B+i;
         
        }

        {if (B=n1 && B<=n2)
        int C=0;
        for (int i=1;i<B;i++)
            {if (B%i==0) C=C+i;
            if (C==A) printf("\nNumber %d drug\n",A,B);
            }
        }
    }      
}
Re[2]: задачи по Visual C++ 6
От: ssm Россия  
Дата: 10.10.05 09:16
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Поможем. Но не сделаем работу за тебя.


прошло две недели, а все идет к этому
Re[21]: задачи по Visual C++ 6
От: desperado_gmbh http://www.livejournal.com/users/tolstopuz
Дата: 10.10.05 09:24
Оценка:
Здравствуйте, Katenok, Вы писали:

K>for (int A=n1; A<=n2; A++)

K> {
K> int B=0;
K> for (int i=1;i<A;i++)
K> {if (A%i==0) B=B+i;
K> }
K> {if (B=n1 && B<=n2)

Во-первых, не =, а >=. Во-вторых, "если ..., то выполнить СЛЕДУЮЩИЕ ДЕЙСТВИЯ:". То есть в фигурные скобки должен быть заключен список следующих действий, а не сам if.

K> int C=0;

K> for (int i=1;i<B;i++)
K> {if (B%i==0) C=C+i;
K> if (C==A) printf("\nNumber %d drug\n",A,B);
K> }


Надо сначала досчитать делители, а потом уже сравнивать результат. А ты наоборот, пытаешься сравнивать внутри цикла по i — опять скобка не там. Кроме того, ты выводишь два числа, а %d написан только один раз. Второе не выведется.
Re[22]: задачи по Visual C++ 6
От: Katenok  
Дата: 10.10.05 10:40
Оценка:
чтоже я тупая то такая

K>for (int A=n1; A<=n2; A++) 
K> { 
K> int B=0;
K> for (int i=1;i<A;i++)
K> if (A%i==0) B=B+i;
K> if (B>=n1 && B<=n2)

K> {int C=0;
K> for (int i=1;i<B;i++)
K> if (B%i==0) C=C+i;
K> if (C==A) cout <<A<<B<<"\n";
K> }
Re[23]: задачи по Visual C++ 6
От: desperado_gmbh http://www.livejournal.com/users/tolstopuz
Дата: 10.10.05 11:15
Оценка:
Здравствуйте, Katenok, Вы писали:

K>чтоже я тупая то такая


K>> if (C==A) cout <<A<<B<<"\n";


Кажется, пора приделывать к этому заголовок и пробовать откомпилировать, а потом запустить. Ну разве что пробел между A и B вывести не помешает
Re[24]: задачи по Visual C++ 6
От: Katenok  
Дата: 10.10.05 11:30
Оценка:
Здравствуйте, desperado_gmbh, Вы писали:

_>Кажется, пора приделывать к этому заголовок и пробовать откомпилировать, а потом запустить. Ну разве что пробел между A и B вывести не помешает


не работает, ошибок не выдает, ввожу n1 n2 и все конец программы никаких дружественных чисел не выводит
Re[25]: задачи по Visual C++ 6
От: desperado_gmbh http://www.livejournal.com/users/tolstopuz
Дата: 10.10.05 11:47
Оценка:
Здравствуйте, Katenok, Вы писали:

K> не работает, ошибок не выдает, ввожу n1 n2 и все конец программы никаких дружественных чисел не выводит


Покажи еще раз полный текст. Какие n1 и n2 вводишь?
Re[26]: задачи по Visual C++ 6
От: Katenok  
Дата: 10.10.05 12:20
Оценка:
Здравствуйте, desperado_gmbh, Вы писали:

_>Здравствуйте, Katenok, Вы писали:


K>> не работает, ошибок не выдает, ввожу n1 n2 и все конец программы никаких дружественных чисел не выводит


_>Покажи еще раз полный текст. Какие n1 и n2 вводишь?


для n1= 156 n2=864, да какие тут не вводила ни на что не реагирует

#include <math.h>
#include <iostream>
using namespace std;
#include <stdio.h>
#include <windows.h>

void main ()

{
int n1, n2;
char str[128];
CharToOem("Введи значение n1  ",str);cout<<str;cin>>n1;
CharToOem("Введи значение n2  ",str);cout<<str;cin>>n2;

for (int A=n1; A<=n2; A++)    
    { 
    int B=0;
    for (int i=1;i<A;i++)
        if (A%i==0) B=B+i;
         
        

        if (B=n1 && B<=n2)
        {int C=0;
        for (int i=1;i<B;i++)
            if (B%i==0) C=C+i;
            if (C==A) printf("\nNumber %d drug\n",A,B);
        }
    }
      
}
Re[27]: задачи по Visual C++ 6
От: desperado_gmbh http://www.livejournal.com/users/tolstopuz
Дата: 10.10.05 12:32
Оценка:
Здравствуйте, Katenok, Вы писали:

K>>> не работает, ошибок не выдает, ввожу n1 n2 и все конец программы никаких дружественных чисел не выводит


Вот это ты писала два часа назад. Я ответил, что можно запускать.

K> if (B>=n1 && B<=n2)

K> {int C=0;
K> for (int i=1;i<B;i++)
K> if (B%i==0) C=C+i;
K> if (C==A) cout <<A<<B<<"\n";
K> }

А вот что ты запускаешь:

K> if (B=n1 && B<=n2)

K> {int C=0;
K> for (int i=1;i<B;i++)
K> if (B%i==0) C=C+i;
K> if (C==A) printf("\nNumber %d drug\n",A,B);
K> }

Найди два отличия.
Re[11]: задачи по Visual C++ 6
От: Katenok  
Дата: 10.10.05 17:03
Оценка:
Ура!!!!!!!!!! Заработала!!!!!!!!!! Пасибо огромное!!!!!!!
Re: задачи по Visual C++ 6
От: Katenok  
Дата: 11.10.05 08:17
Оценка:
У меня вот еще какая проблема возникла, некоторые библиотеки не активны, в одной задачке #include "stdafx.h" не срабатывает пишет "fatal error C1083: Cannot open include file: 'stdafx.h': No such file or directory", а если убираю то ему не нравится по тексту long long и компилятор за него цепляется. а в другой ругается на strlen, если подключаю #include <string.h> #include <strstream.h> , то пишет тоже самое "fatal error C1083: Cannot open include file:"
Re: задачи по Visual C++ 6
От: Katenok  
Дата: 18.10.05 06:39
Оценка:
Вот не получается в этой задачке выполнить первое задание "найти количество трехзначных чисел", получилось только найти эти числа и распечатать их... подскажите плиз как посчитать выведенные числа???

Найти количество трехзначных чисел, кратных 15, но не кратных 30. Распечатать эти числа


#include <iostream>
using namespace std;
#include <windows.h>
#include <math.h>
#include <stdio.h>

void main ()

{
    int c, ka=0, kost=0;
for (int i = 105; i < 1000; i ++)

{
  if(i%15==0 && i%30!=0)
      cout<<i<<endl;
}
Re[2]: задачи по Visual C++ 6
От: Кодт Россия  
Дата: 18.10.05 10:27
Оценка:
Здравствуйте, Katenok, Вы писали:

K>Вот не получается в этой задачке выполнить первое задание "найти количество трехзначных чисел", получилось только найти эти числа и распечатать их... подскажите плиз как посчитать выведенные числа???


K>Найти количество трехзначных чисел, кратных 15, но не кратных 30. Распечатать эти числа


Ну, поехали!
K>#include <iostream>
K>using namespace std;

// Зачем включены вот эти три заголовка? Ты же ими вообще не пользуешься.
K>#include <windows.h>
K>#include <math.h>
K>#include <stdio.h>

K>void main ()
K>{
    // Что это за переменные? В дальнейшем они нигде не используются, а c ещё и не инициализирована.
K>  int c, ka=0, kost=0;

K>  for (int i = 105; i < 1000; i ++)
K>  {
K>    if(i%15==0 && i%30!=0)
K>      cout<<i<<endl;
K>  }

  // Нужна ещё одна закрывающая скобка. Ну, видимо, это опечатка была
  }

Пара замечаний вне текста программы:

1) Ты ввела переменные c, ka, kost. Их имена "не говорящие".
Есть "общечеловеческие" соглашения о смысле коротких имён: примерно такие
— i,j,k — индексы
— n,m — размеры (количество)
— c,s — подсчитываемое количество и сумма (count, sum)
— x,y,z, u,v — значения (компонентов многомерного пространства и скалярные)
— t — время или промежуточная переменная
— конвенции, принятые в предметной области (например, физике или экономике)
Если привить переменной существенно иной смысл, не вытекающий ни из конвенции, ни из сокращения в очевидном контексте (скажем, s может значить sum, size, source) — то это внесёт путаницу.
Альтернатива — это давать длинные имена, иногда с префиксом, означающим тип: nSum, szSource.
Куцые сокращения, особенно на русско-английском — очень мрачно. kost это исковерканное cost (стоимость), или k_ostatok, или что-то ещё?
Разделение слов в идентификаторе можно выполнять
— прыгающим регистром
— — первая часть в верхнем регистре, вторая в нижнем (как бы в субскрипте)
— — — Ftr = сила трения, F(orce — принятый физический знак) tr(enija — транслит, но если с программой связан текст, где фигрурирует Fтр, то это приемлемо)
— — капитализация первых букв
— — — SumOddNumbers
— подчёркиванием
— — — sum_odd_numbers
— — — f_tr
Есть разные рекомендации по выбору того или иного стиля, главное — не мешать их.

2) По алгоритму.
У тебя цикл for(i=105;i<1000;++i)
Почему ты начала не с 100 (это же тоже трёхзначное)? Наверное, потому что первое трёхзначное, интересующее тебя — это 105.
Тогда зачем инкрементировать на 1? Можно сразу на 15 и более не проверять делимость на 15.
for(i=105;i<1000;i+=15).
Пойдём дальше. Каждое второе из чисел, делящихся на 15, делится на 30. Просто возьмём и перепрыгнем через них:
for(i=105;i<1000;i+=30)
То есть нам вообще нет нужды проверять делимость внутри цикла!

А подсчитать количество чисел очень просто: заведи счётчик (не забудь обнулить перед входом в цикл) и внутри цикла инкрементируй его.

Твой ход!
Перекуём баги на фичи!
Re[3]: задачи по Visual C++ 6
От: Katenok  
Дата: 18.10.05 11:29
Оценка:
Эти переменные остатки от текста программы где я пыталась посчитать числа... у меня почему то считает до 1 и все

#include <iostream>
using namespace std;
#include <windows.h>
#include <math.h>
#include <stdio.h>

void main ()

{
    int i;

for(i=105;i<1000;i+=30)

{ cout<<i<<endl;}
int sum=0;
{if(i%15==0 && i%30!=0) {sum++;
cout<<"sum="<<sum<<endl;}}
}
Re[4]: задачи по Visual C++ 6
От: Кодт Россия  
Дата: 18.10.05 11:44
Оценка:
Здравствуйте, Katenok, Вы писали:

K>Эти переменные остатки от текста программы где я пыталась посчитать числа... у меня почему то считает до 1 и все


Ладно, не хочешь сама убрать заголовки (тоже остались?) — уберу я
Но вот бешеное форматирование (произвольные отступы и неряшливо расставленные фигурные скобки) — исправляй.

K>#include <iostream>
K>using namespace std;

K>void main ()

K>{
K>    int i;

K>for(i=105;i<1000;i+=30)

K>{ cout<<i<<endl;}
K>int sum=0;
K>{if(i%15==0 && i%30!=0) {sum++;
K>cout<<"sum="<<sum<<endl;}}
K>}

Переменная sum объявлена и инициализируется внутри цикла. Естественно, что если ты её всё время обнуляешь, то что она там сосчитает?
Вытащи её перед циклом.

Кроме того, если i начинается со 105 с шагом 30, то условие i%15==0 && i%30!=0 всегда истинно.
Перекуём баги на фичи!
Re[5]: задачи по Visual C++ 6
От: Katenok  
Дата: 18.10.05 12:07
Оценка:
Вот постаралась посимпатичней отформатировать, sum вытащила вперед но все равно считает тока до 1

#include <iostream>
using namespace std;


void main ()

{
int i;
int sum=0;

for(i=105;i<1000;i+=30)

    { cout<<i<<endl;}

    {sum++; cout<<"sum="<<sum<<endl;}
    
}
Re[6]: задачи по Visual C++ 6
От: Кодт Россия  
Дата: 18.10.05 13:01
Оценка:
Здравствуйте, Katenok, Вы писали:

K>Вот постаралась посимпатичней отформатировать, sum вытащила вперед но все равно считает тока до 1


Замечательно! Красиво отформатированная программа сразу покажет тебе, где ты опять наступаешь на грабли.
K>#include <iostream>
K>using namespace std;

K>void main ()

K>{
K>int i;
K>int sum=0;

K>for(i=105;i<1000;i+=30)

K>      { cout<<i<<endl;} // относится ли этот блок к циклу?

K>      {sum++; cout<<"sum="<<sum<<endl;} // а этот блок - относится?
        // Правомерно ли ты сделала отступ, как бы говоря, что блок внутри цикла?
K>}

В каком из блоков должно выполнятся увеличение sum?
Перекуём баги на фичи!
Re[7]: задачи по Visual C++ 6
От: Katenok  
Дата: 18.10.05 13:48
Оценка:
Вот так она считает но выводит sum каждый раз после i по возрастающей

#include <iostream>
using namespace std;

void main ()

{
int i;
int sum=0;

for(i=105;i<1000;i+=30)

        { cout<<i<<endl; 
            {sum++; cout<<"sum="<<sum<<endl;} 
        }
       
}
Re[8]: задачи по Visual C++ 6
От: __LP  
Дата: 18.10.05 14:02
Оценка:
Здравствуйте, Katenok, Вы писали:

K>Вот так она считает но выводит sum каждый раз после i по возрастающей


K>
K>#include <iostream>
K>using namespace std;

K>void main ()

K>{
K>int i;
K>int sum=0;

K>for(i=105;i<1000;i+=30)

K>        { cout<<i<<endl; 
K>            {sum++; cout<<"sum="<<sum<<endl;} 
K>        }
       
K>}
K>


Для чистоты дела можешь еще убрать лишние фигурные скобки и выводить значение sum, когда оно подсчитано полностью.
#include <iostream>
using namespace std;

void main ()

{
int i;
int sum=0;

for(i=105;i<1000;i+=30)
   { 
       cout<<i<<endl; 
       sum++;
   }
cout<<"sum="<<sum<<endl;        
}
C++ можно выучить за 21 день! ...если дни — полярные.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.