Технический форум

Технический форум (http://www.tehnari.ru/)
-   C/C++/С# (http://www.tehnari.ru/f42/)
-   -   Помогите решить задачи на C++ (http://www.tehnari.ru/f42/t23642/)

Bleak 08.04.2009 20:22

Помогите решить задачи на C++
 
Помогите, пожалуйста.
1. Дан прямоугольник с размерами a*b.От него отрезают квадраты максимального размера,пока это возможно.Затем от оставшегося прямоугольника вновь отрезают квадраты максимально возможного размера и т.д.На какие квадраты и в каком их количестве будет разрезан исходный прямоугольник?
2.Дано к грибов. Вводя определенное число,нам экран выдает "Мы собрали к [гриб,грибов или гриба]"пример: Мы собрали 1 гриб или 22 гриба.

заранее спасибо!!!

abv-lam 12.04.2009 15:11

Про грибы типа так...
/* грыбы*/

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

void main()
{
int size = 0;
int octatok = 0;
char buf[255]; // включение русского языка в консоли
char res [9];

CharToOem("Введите количество грибов: ",buf);
CharToOem("Mы нашли ",res);
cout << buf;
cin >> size;
octatok=size;

if (size == 1) CharToOem(" гриб",buf);
else
{
while (true)
{
octatok=octatok%10;
if (octatok<9)break;
}
if (octatok == 2 && octatok == 3 && octatok == 4 ) CharToOem(" грибa",buf);
else CharToOem(" грибов",buf);
}

// Вывод результата

cout << res << size << buf<< endl;

cin.get();
}

PS: я не спец в Сях, возможно есть более красивое решение...

abv-lam 12.04.2009 15:21

во второй задаче в условие не въехал, это задача на нахождение машинного нуля?

Bleak 12.04.2009 18:54

вот пример в цифрах.
дан прямоугольник с размерами 425*131.От него отрезают квадраты со стороной 131.,пока это возможно.Затем от оставшегося прямоугольника вновь отрезают квадраты со стороной,равно 425-131*3=32 ,и т.д.На какие квадраты и в каком количестве будет разрезан исходный прямоугольник.

abv-lam 12.04.2009 21:43

/*квадраты*/

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

void main()
{
int a, b, temp, step=0;
int kvadr[100];
char buf[255]; // включение русского языка в консоли


CharToOem("Введите стороны прямоугольника a = ",buf);
cout << buf;
cin >> a;
CharToOem("Введите стороны прямоугольника b = ",buf);
cout << buf;
cin >> b;

while(a!=0 && b!=0)
{
if (a<b)
{
temp=a;
a=b;
b=temp;
}
kvadr[step]=b;
step++;
a=a-b;
}


// Вывод результата

CharToOem("Шаг --- Сторона квадрата",buf);
cout << buf<< endl;
for (int i=0; i< step; i++)
{
cout << i+1 << " --- " << kvadr[i]<< endl;
}

cin.get();
}

Прога работает, хотя я написал ее скорее в стиле паскаля, (ну не сишник я...) И еще массив kvadr[] я объявил на 100 элементов.

abv-lam 12.04.2009 22:14

Про грибы. Только сообразил, что 101 это тоже гриб, поэтому должно быть так

/* грыбы*/

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


/************************************************** *************
Главный модуль
************************************************** ***************/

void main()
{
int size = 0;
int octatok = 0;
char buf[255]; // включение русского языка в консоли
char res [9];

CharToOem("Введите количество грибов: ",buf);
CharToOem("Mы нашли ",res);
cout << buf;
cin >> size;
octatok=size;

if (size == 1) CharToOem(" гриб",buf);
else
{
while (true)
{
octatok=octatok%10;
if (octatok<9)break;
}
if (octatok == 1 && size!=11) CharToOem(" гриб",buf);
else
{
if (octatok == 2 || octatok == 3 || octatok == 4 ) CharToOem(" грибa",buf);
else CharToOem(" грибов",buf);

}
}

// Вывод результата

cout << res << size << buf<< endl;

cin.get();
}

csbwalker 14.04.2009 11:12

По поводу грибов.
Если я правильно понимаю код, то:
Цитата:

while (true)
{
octatok=octatok%10;
if (octatok<9)break;
}
1. при числе оканчивающимся на "9" войдёт в бесконечный цикл
2. octatok%10 всегда будет < 10
поэтому логичнее будет написать вместо этого куска кода строчку:
Цитата:

octatok %= 10;
Потом - если число равно "12", "13", "14" нужно выводить "грибов", а будет "гриба".

Предлагаю свой вариант:
Код:

#include <iostream>

using namespace std;

int main(int argc, char **argv)
{
int k;

        cout << "Введите количество грибов: ";
        cin >> k;

        cout << "Мы собрали: " << tmp << k << " ";

        if ((k > 10) && (k < 20))
                cout << "грибов";
        else
        {
                k %= 10;
                if (k == 1)
                        cout << "гриб";
                else if ((k == 2) || (k == 3) || (k == 4))
                        cout << "гриба";
                else
                        cout << "грибов";
        }
}

Или, в случае если кодировка редактора и кодировка консоли различны и это Windows, то с перекодировкой:
Код:

#include <windows.h>
#include <iostream>

using namespace std;

int main(int argc, char **argv)
{
int k;
char tmp[256];

        CharToOem("Введите количество грибов: ", tmp);
        cout << tmp;
        cin >> k;

        CharToOem("Мы собрали: ", tmp);
        cout << tmp << k << " ";

        if ((k > 10) && (k < 20))
                CharToOem("грибов", tmp);
        else
        {
                k %= 10;
                if (k == 1)
                        CharToOem("гриб", tmp);
                else if ((k == 2) || (k == 3) || (k == 4))
                        CharToOem("гриба", tmp);
                else
                        CharToOem("грибов", tmp);
        }
        cout << tmp << "\n";
}


csbwalker 14.04.2009 12:09

С прогой по квадратам полностью согласен, но сделал бы чуть попроще вывод результата, и м.б. убрал бы жёсткую завязку на винды, но тут на вкус и цвет...
На всякий случай постю свой вариант :)
Код:

#include <iostream>

using namespace std;

bool pri(int &a, int &b)
// Приводит стороны так, что бы "a" было < "b"
// Если прямоугольник вырожденный - возвращает false
{
        if ((a == 0) || (b == 0))
                return false;
        if (a > b)
        {
        int t = a;
                a = b;
                b = t;
        }
        return true;
}

int main(int argc, char **argv)
{
int a, b;
        // Вводим параметры
        cout << "Enter a: ";
        cin >> a;

        cout << "Enter b: ";
        cin >> b;

        while( pri(a, b) ) // Выполняем пока прямоугольник не вырожденный
        {
                // Выводим размерность и количество для текущего квадрата
                cout << "\n" << a << "x" << a << " : " << b / a;
                // Уменьшаем размер прямоугольника
                b %= a;
        };
}


Bleak 16.04.2009 22:10

Большое,как говорится,человеческое спасибо.

Fonochka 26.04.2009 15:50

Здравствуйте! Мне жутко нужна помощь....Допуск к экзамену.... Нужно написать программу стекового калькулятора на Си(((( У меня никак не получается.... Вот условие самой задачи: "На входе - строка, содержащая выражение в постфиксной записи. На выходе - строка, результат вычислений.
пример:
ввод:
1 23 + 4 -
5 1 - *.
вывод:
80
Числа: целые неотрицательные.
Должны поддерживаться следующие двуместные арифметические операции: + - * /
Каждая из них берет аргумент со стека, сначала первый, потом - второй, выполняет над ним действие и результат помещает на вершину стека.
Кроме того должна поддерживаться операция '.' - она берет один аргумент со стека и печатает его на вывод."
Вот такая задача.... Заранее очень благодарна хоть в какой-то помощи))


Часовой пояс GMT +4, время: 12:00.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.