Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод слова в нужном склонении 
:(
    Опции темы
Ufyljy
  Дата 30.10.2007, 02:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 5.10.2007

Репутация: нет
Всего: 1



** Создано: 30/10/2007
     Автор: 

     Коррекции:
     Благодарности: wils0n, DjoNIK, FREEDEV, Kuvaldis, Lazin, Optimus =2, SergeCpp

Код

#include<stdio.h>
#include<conio.h>

#define br putchar('\n');

main()
{
      int a,b,i;
      for(;;)
      {
             printf("Enter a: "); scanf("%d",&a);
             if(a == -123){break;}
             do
             {
                      b=0, i=0; 

                       if(i==0)
                       {
                               if((a == 2) || (a == 4) || (a == 3))
                               {
                                  printf("%d rublya",a); b=b+1;
                               }
                               else i++;  
                       }

                       if(i==1)
                       {
                               if((a==1) || (a%20==1) || (a%30==1))
                               {
                                         printf("%d rubl",a); b=b+1;
                               }
                               else i++;
                       }
                       
                       if(i==2)
                       {
                               if((a%20==2) || (a%30==2) || (a%20==3) || (a%30==3) || (a%20==4) || (a%30==4))
                               {
                                            printf("%d rublya",a); b=b+1;
                               }
                               else {printf("%d rubley",a); b=b+1;}
                       }
                               
             }
            while(b != 1); br;
      }
      
           
      getch();
}



Суть проги - в зависимости от числа мы добавляем к нему слово "рубль"
в правильном склонении.

Вопрос следующий: можно ли эту задачу было реализовать покороче, не так
как у меня. 


Это сообщение отредактировал(а) Ufyljy - 30.10.2007, 02:10
PM MAIL   Вверх
archimed7592
Дата 30.10.2007, 05:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Ну, начнём с того, что она неправильно работает smile.
Цитата

Enter a: 213
213 rublya нужно rubley
Enter a: -123


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

#include<stdio.h>
#include<conio.h>
#define br putchar('\n');
main()
{
    int a;
    while(1)
    {
        printf("Enter a: "); scanf("%d",&a);
        if(a == -123)
            break;
        if((a == 2) || (a == 4) || (a == 3))
        {
            printf("%d rublya",a);
        }
        else if((a==1) || (a%20==1) || (a%30==1))
        {
            printf("%d rubl",a);
        }
        else if((a%20==2) || (a%30==2) || (a%20==3) || (a%30==3) || (a%20==4) || (a%30==4))
        {
            printf("%d rublya",a);
        }
        else
        {
            printf("%d rubley",a);
        }
        br;
    }

       
    getch();
}

Непонятно зачем нужен был вложенный do..while, зачем нужна переменная b, зачем нужно было делать управление работой через i...

Добавлено через 12 минут и 23 секунды
Код

/*
1    рубль
2    рубля
3    рубля
4    рубля
5    рублей
6    рублей
7    рублей
8    рублей
9    рублей
10    рублей
11    рублей
12    рублей
13    рублей
14    рублей
15    рублей
16    рублей
17    рублей
18    рублей
19    рублей
20    рублей
21    рубль
*/
#include<stdio.h>
#include<conio.h>
#define br putchar('\n');
main()
{
    while(1)
    {
        int a;
        printf("Enter a: "); scanf("%d",&a);
        if(a == -123)
            break;
        {
            int d = a % 10;
            int h = a % 100;
            int teen = h >= 11 && h <= 19;
            const char *w = "";
            if (d == 1 && !teen)
                w = "rubl";
            else if(d >= 2 && d <= 4 && !teen)
                w = "rublya";
            else
                w = "rubley";
            
            printf("%d %s", a, w);
            br;
        }
    }

       
    getch();
}


Код

archimed7592@PC ~/testlabs/g++
$ ./a.exe
Enter a: 213
213 rubley
Enter a: 1
1 rubl
Enter a: 2
2 rublya
Enter a: 3
3 rublya
Enter a: 4
4 rublya
Enter a: 5
5 rubley
Enter a: 6
6 rubley
Enter a: 7
7 rubley
Enter a: 8
8 rubley
Enter a: 9
9 rubley
Enter a: 10
10 rubley
Enter a: 11
11 rubley
Enter a: 12
12 rubley
Enter a: 13
13 rubley
Enter a: 14
14 rubley
Enter a: 15
15 rubley
Enter a: 16
16 rubley
Enter a: 17
17 rubley
Enter a: 18
18 rubley
Enter a: 19
19 rubley
Enter a: 20
20 rubley
Enter a: 21
21 rubl
Enter a: 22
22 rublya
Enter a: 23
23 rublya
Enter a: 24
24 rublya
Enter a: 25
25 rubley
Enter a: -123

archimed7592@PC ~/testlabs/g++
$



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Ufyljy
  Дата 30.10.2007, 09:01 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 5.10.2007

Репутация: нет
Всего: 1



А у меня логики нету, зато классно.. вопрос стиля
За прогу огромное спасибо.

> По сути вот это то же самое, только намного понятней любому программисту
Нет, не надо утрировать)) я поимел ввиду то, что способ реализации этой проги совершенно другой, а 
не просто подкорректить всякие b=b+1;


Это сообщение отредактировал(а) Ufyljy - 30.10.2007, 09:06
PM MAIL   Вверх
archimed7592
Дата 30.10.2007, 09:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Ufyljy @  30.10.2007,  09:01 Найти цитируемый пост)
А у меня логики нету, зато классно.. вопрос стиля

Я думаю, что это плохой стиль. Учись писать программы, понятные не одному тебе.

Цитата(Ufyljy @  30.10.2007,  09:01 Найти цитируемый пост)
я поимел ввиду то, что способ реализации этой проги совершенно другой, а 
не просто подкорректить всякие b=b+1;

Я бы сказал, что у меня способ реализации понятный, а у тебя, чтобы враг не догадался(если бы там было около тысячи подобных строк, то точно никто не догадается "как ЭТО может работать").



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Ufyljy
Дата 30.10.2007, 09:09 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 5.10.2007

Репутация: нет
Всего: 1



Я и не спорю, что у тя все гуд.

Нет-нет, смысл в том, чтобы задача была реализована другим спосом.
Например, через символьный тип, другой подход к задаче.
PM MAIL   Вверх
Ufyljy
  Дата 30.10.2007, 09:39 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 5.10.2007

Репутация: нет
Всего: 1



Вгляделся в твой исходный код, и понял, что я мало чего понял в этом коде.

1) int teen = h >= 11 && h <= 19; - вообще такую конструкцию я вижу впервые; ты переменной teen  присваиваешь значение переменной h, которая в диапазоне от 11 до 19? Другими словами, переменной teen присваиваются те значения h, которые входят в промежуток от 11 до 19?

2) const char *w=""; - непонятно const перед char, и указатель перед w
3) while(1) - это "бесконечное пока"? Можешь объяснить это типа фокус, фишка?
PM MAIL   Вверх
MAKCim
Дата 30.10.2007, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Ufyljy, 
 smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
archimed7592
Дата 30.10.2007, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Ufyljy @  30.10.2007,  09:09 Найти цитируемый пост)
Например, через символьный тип, другой подход к задаче. 

У меня такой же подход, как и у тебя, только короче и понятнее.


Цитата(Ufyljy @  30.10.2007,  09:39 Найти цитируемый пост)
 int teen = h >= 11 && h <= 19; - вообще такую конструкцию я вижу впервые; ты переменной teen  присваиваешь значение переменной h, которая в диапазоне от 11 до 19? Другими словами, переменной teen присваиваются те значения h, которые входят в промежуток от 11 до 19?

Нет. Равносильно следующему:
Код

int teen;
if (h >= 11 && h <= 19)
    teen = 1;
else
   teen = 0;

Или этому:
Код

int teen = (h >= 11 && h <= 19 ? 1 : 0);

Или этому(в твоём стиле smile)
Код

int teen;
do
{
    int i = 0;
    if (i == 0 && h >= 11 && h <= 19)
        teen = 1;
    else
        i++;
    if (i == 1)
        teen = 0;
    
} while(0);

Ну и где понятней? smile

Цитата(Ufyljy @  30.10.2007,  09:39 Найти цитируемый пост)
2) const char *w=""; - непонятно const перед char, и указатель перед w

Если язык Си, то IIRC, const будет выдавать только предупреждения.
В С++ попытка изменить значение по указателю на константу приведёт к ошибке компиляции:
Код

const char *s = "123";
s[2] = '5'; // ошибка компиляции



Цитата(Ufyljy @  30.10.2007,  09:39 Найти цитируемый пост)
while(1) - это "бесконечное пока"? Можешь объяснить это типа фокус, фишка? 

А for(;;) - это что фокус, фишка? Вот while(1) - то же самое.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Ufyljy
Дата 30.10.2007, 11:37 (ссылка)    | (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 5.10.2007

Репутация: нет
Всего: 1



2 MAKCim: Че?
2 Архимед: что за оператор "?"
и 1 - здесь истина, 0 - ложно?
PM MAIL   Вверх
archimed7592
Дата 30.10.2007, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Ufyljy @  30.10.2007,  11:37 Найти цитируемый пост)
2 MAKCim: Че?

Через плечо. RTFM!

Цитата(Ufyljy @  30.10.2007,  11:37 Найти цитируемый пост)
что за оператор "?"

Тринарный условный оператор. Тебе помог мой ответ? Нет? Тогда RTFM!

Цитата(Ufyljy @  30.10.2007,  11:37 Найти цитируемый пост)
1 - здесь истина, 0 - ложно? 

0 - ложь.
НЕ 0 - истина.
Не помогло? RTFM!


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Lazin
Дата 30.10.2007, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Ufyljy, если будешь задавать вопросы вроде 
Цитата(Ufyljy @  30.10.2007,  11:37 Найти цитируемый пост)
что за оператор "?"

тебя самого склонять будут  smile 
PM MAIL Skype GTalk   Вверх
FREEDEV
Дата 30.10.2007, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 6.3.2007
Где: Украина->Одесс а

Репутация: нет
Всего: 3



опять все закончилось RTFMом  smile 
Ufyljy, это все концепции С++, которые очень полезно знать, они действительно сделают твой код более читабельным.
Пока можешь особо не заморачиваться, главное чтоб в итоге твои программы работали, со временем все поймешь. Ну, и нужно больше читать уже готовых исходников.

--------------------
Microsoft Windows Visla ©
PM MAIL   Вверх
archimed7592
Дата 30.10.2007, 15:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



FREEDEV, не смеши мои тапочки. Тут нет ни одной концепции(как в общем, так и С++ в частности). Тут есть базовые(очень базовые) основы языка Си. Человек, задающий подобные вопросы с тем же успехом мог бы спросить "а что такое число?" "а кто я?" "а где я?" "а что я здесь делаю?" "а как зовут мою кошку?" и т.д.
А насчёт "можешь не заморачиваться" - нет, ну конечно можно не заморачиваться, но, боюсь, что с таким алгоритмическим стилем программист из него не получится, а если и получится, то такой, который проверяет булеву переменную на истину в лучших традициях индусов(БОР)
if (b.toString().Length < 5)


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
FREEDEV
Дата 31.10.2007, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 6.3.2007
Где: Украина->Одесс а

Репутация: нет
Всего: 3



Цитата(archimed7592 @  30.10.2007,  15:12 Найти цитируемый пост)
базовые(очень базовые) основы языка Си

Может так оно и есть, но каждый с чего-то начинал. Нельзя сесть и начать писать "правильно", к этому нужно прийти. Ну не знает он оператора "?",  - познакомиться позже, главное было б желание.


Цитата(archimed7592 @  30.10.2007,  15:12 Найти цитируемый пост)
в лучших традициях индусов(БОР)if (b.toString().Length < 5)
 так надо еще постараться smile

--------------------
Microsoft Windows Visla ©
PM MAIL   Вверх
Ufyljy
Дата 31.10.2007, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 5.10.2007

Репутация: нет
Всего: 1



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

К сожалению у меня в методичке нету оператора "?",
поэтому и спрашиваю

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

Люди, поймите, все относительно. Везде разные системы отчета.

> Тринарный условный оператор
А чем отличается унарный оператор от тринарного?

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0860 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.