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

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


Ошибочка вышла. Надо или цену указать, или ник женский взять.
... << RSDN@Home 1.1.4 beta 3 rev. 193>>
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 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[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: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[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[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[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: задачи по 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, увидит, что программа не выдает этого решения, и скажет, что все неправильно. Это один из основных принципов разработки программ — заказчик хочет получить не то, что написано в техническом задании, а то, что он имел в виду, когда его писал.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.