Помогите пожалуйста решить задачки, а то ну никак не получаются
1. Ввести последовательность символов, заканчивающуюся '@'. Распечатать только те из них, которые расположены до первого символа ':'.
2. Даны целые числа x, y и вещественное число z. Используя директиву #define для нахождения наибольшего из чисел, вычислить
S=max(x+y+z, xyz)+3max(xy2, z2).
3. Два натуральных числа называются "дружественными", если одно из них равно сумме протых делителей другого. Найти все пары "дружественных" чисел в диапазоне [n1, n2].
Здравствуйте, Аноним, Вы писали:
А>3. Два натуральных числа называются "дружественными", если одно из них равно сумме протых делителей другого. Найти все пары "дружественных" чисел в диапазоне [n1, n2].
Некорректное определение. Сумма простых делителей числа 12=2*2*3 — это 2+2+3=7 или 2+3=5?
Здравствуйте, <Аноним>, Вы писали:
А>Помогите пожалуйста решить задачки, а то ну никак не получаются
Ошибочка вышла. Надо или цену указать, или ник женский взять.
... << 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);
}
Глупость наверное полная, но я ужасно разбираюсь во всяких таких програмках
Здравствуйте, Аноним, Вы писали:
А>Эх.. ник мне женский брать и не надо, я и так девушка, в МАИ учусь, программирвание вообще к нашей специализации отношения не имеет, а вот на последнем курсе такой курс прочитать решили и задали 25 задач, 13 из них я как то поборола, а вот с этими не получается вообще ничего :( А>По поводу некорректного условия, другого нет и надо решить именно с этим.
А>Насчет кодов. А>по 1 вот такое получилось:
А>>{
А>> 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) ............ )
Ну вот. А теперь на основании всего, что я здесь рассказал, попробуй написать задание.
Удачи!
Главная ошибка здесь — в перепутанном чтении символов. Не забываем, что 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); }
// ~~ обычно перевод строки добавляют в конец вывода, а не в начало.
}
#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));
Здравствуйте, 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.
Здравствуйте, 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.
Я специально не пишу готовых решений, т.к. тебе всё-таки нужно учиться.
Лучше всего, если ты это будешь делать не пробами и ошибками, а с учебником или методичкой. А ещё лучше, если возьмёшь препода за пуговицу. Ибо что это за препод, который кинулся заданием и забил на учеников.
Учебник у меня есть один Шиманович, и еще какой-то но совсем бесполезный... если бы не учебники я вообще бы ничего не написала, а препод на нас забивает потому что мы вечерники да еще и курс последний... вот и разбираюсь потихоньку... мне еще потом на экзамене прийдется 3 задачи решать за 20 минут..
И если не трудно подскажите что с 3 задачкой делать, а то как баран на новые ворота на нее смотрю..
Вот задачку по книжке решала... а ответ не такой как надо получается
Задача. Для заданной матрицы найти минимум среди сумм модулей элементов диагоналей, параллельных главной диагонали.
Здравствуйте, 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 должен быть доступен этой функции — т.е., например, это глобальная переменная.
Попробуй закодировать эти алгоритмы.
Тебе будет очень полезно, если каждую строку кода ты станешь сопровождать комментарием (как бы объясняя самой себе). Это позволит избежать глупых ошибок и слепых попыток.
Здравствуйте, Аноним, Вы писали:
А>3. Два натуральных числа называются "дружественными", если одно из них равно сумме протых делителей другого. Найти все пары "дружественных" чисел в диапазоне [n1, n2].
Дружественными называются два натуральных числа, каждое из которых равно сумме правильных делителей другого (т. е. делителей, меньших этого числа). Например:
Если написать программу строго по заданию, преподаватель на зачете введет n1=220, n2=284, увидит, что программа не выдает этого решения, и скажет, что все неправильно. Это один из основных принципов разработки программ — заказчик хочет получить не то, что написано в техническом задании, а то, что он имел в виду, когда его писал.