forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Число->Слово (http://forum.boolean.name/showthread.php?t=902)

impersonalis 11.05.2006 18:06

Курса4 с перового курса. Решение не о4ень изящное - ибо в лом было выпендриваться ( и так делал под win и прочими самопридуманными усложнениями -т.к. в первоначальном варианте зада4ка просто школьная)

Задание - преобразования числа в его кириллическу запись (123=сто двадцать три). Верхний предел оговорён (в задаче - просто), у меня - по модулю.

Код:

//функция генерации строки по переданному в аргументе
//x трёхзначному числу разряда n.
//Возвращаемая строка передаётся как аргумент char out[]
bool decod3(int x,int n,char out[]){
        int a23=x%100;//последние 2 цифры
        int a1=x/100;//первая цифра

        //выбор названия первой цифры

        switch(a1){
 *case 1: {strcat(out,"сто ");break;}
 *case 2: {strcat(out,"двести ");break;}
 *case 3: {strcat(out,"триста ");break;}
 *case 4: {strcat(out,"четыреста ");break;}
 *case 5: {strcat(out,"пятьсот ");break;}
 *case 6: {strcat(out,"шестьсот ");break;}
 *case 7: {strcat(out,"семьсот ");break;}
 *case 8: {strcat(out,"восемьсот ");break;}
 *case 9: {strcat(out,"девятьсот ");break;}
 *default: break;
        }
        //выбор названия оставшихся 2ух

        //так как числительные от 10 до 19 включительно имеют
        //собственные названия не соответствующие алгоритму
        //кол-во десяток + кол-во единиц,
        //их обрабатываем отдельно
        if((a23>9)&&(a23<20)){
 *switch(a23){
 *        case 10: {strcat(out,"десять ");break;}
 *        case 11: {strcat(out,"одиннадцать ");break;}
 *        case 12: {strcat(out,"двенадцать ");break;}
 *        case 13: {strcat(out,"тринадцать ");break;}
 *        case 14: {strcat(out,"четырнадцать ");break;}
 *        case 15: {strcat(out,"пятнадцать ");break;}
 *        case 16: {strcat(out,"шестнадцать ");break;}
 *        case 17: {strcat(out,"семнадцать ");break;}
 *        case 18: {strcat(out,"восемнадцать ");break;}
 *        case 19: {strcat(out,"девятнадцать ");break;}
 *        default: break;
 *}
 *//если разряд тысяч, то конкатенируем к строке слово
 *//"тысяч"
 *if(n==1)strcat(out,"тысяч ");
        }

        //если числа не лежат в [10;19], то:
        else{

 *//если число>10 (и >19 так как это обработано выше),
 *//то определяем название десятка
 *if(a23>10){
 *        switch(a23/10){
 * *case 2: {strcat(out,"двадцать ");break;}
 * *case 3: {strcat(out,"тридцать ");break;}
 * *case 4: {strcat(out,"сорок ");break;}
 * *case 5: {strcat(out,"пятьдесят ");break;}
 * *case 6: {strcat(out,"шестьдесят ");break;}
 * *case 7: {strcat(out,"семьдесят ");break;}
 * *case 8: {strcat(out,"восемьдесят ");break;}
 * *case 9: {strcat(out,"девяносто ");break;}
 * *default: break;
 *        }
 *        a23%=10;//получаем последнюю цифру - число единиц
 *}

 *//после выполнения предыдущего блока в переменной a23
 *//хранится число единиц - младшая цифра, так как
 *//если число было больше 10, то его десяток был обработан
 *//а от самого числа взят остаток от деления на 10
 *//т.е. число<10 - младшая цифра;
 *//если же число было меньше 10 то предыдущий
 *//условный блок не выполняется - десяток числа не обрабатывается
 *//за его отсутствием
 *switch(a23){
 *        //случай: 0 единиц
 *        //добавляем название разряда
 *        case 0: {
 * *if(n==1)strcat(out,"тысяч ");
 * *break;}
 *        //случай: 1 единица
 *        //добавляем числительное и, в зависимости от
 *        //разряда, название разряда
 *        case 1: {
 * *if(n==0)strcat(out,"один ");
 * *else if(n==1)strcat(out,"одна тысяча ");
 * *break;}
 *        //аналогично...
 *        case 2: { * *
 * *if(n==0)strcat(out,"два ");
 * *else if(n==1)strcat(out,"две тысячи ");
 * *break;}
 *        case 3: { * *
 * *if(n==0)strcat(out,"три ");
 * *else if(n==1)strcat(out,"три тысячи ");
 * *break;}
 *        case 4: { * *
 * *if(n==0)strcat(out,"четыре ");
 * *else if(n==1)strcat(out,"четыре тысячи ");
 * *break;}
 *        case 5: { * *
 * *if(n==0)strcat(out,"пять ");
 * *else if(n==1)strcat(out,"пять тысяч ");
 * *break;}
 *        case 6: { * *
 * *if(n==0)strcat(out,"шесть ");
 * *else if(n==1)strcat(out,"шесть тысяч ");
 * *break;}
 *        case 7: { * *
 * *if(n==0)strcat(out,"семь ");
 * *else if(n==1)strcat(out,"семь тысяч ");
 * *break;}
 *        case 8: { * *
 * *if(n==0)strcat(out,"восемь ");
 * *else if(n==1)strcat(out,"восемь тысяч ");
 * *break;}
 *        case 9: { * *
 * *if(n==0)strcat(out,"девять ");
 * *else if(n==1)strcat(out,"девять тысяч ");
 * *break;}
 *        default: break;
 *}

        }
//Если функция завершила свою работу без ошибок
return true;//вернуть ИСТИНУ
}       

//функция перевода стоки input[], содержащей число,
//в строку output[], содержащую числительные
bool translate(char input[],char output[]){
 *//обнуление массива output путём присвоения первому байту
 *//нулевого значения
 *output[0]=0;
 *//получения числа из строки
 *long x=atoi(input);
 *//если число превышает указанные в задачи пределы,
 *//то вернуть ЛОЖЬ
 *if(abs(x)>999999){return false;}
 *//если число равно 0, то записать "ноль" в строку
 *//output и выйти из функции с ИСТИНОЙ
 *if(x==0){strcat(output,"ноль ");return true;}
 *//если число меньше нуля, то скопировать слово "минус"
 *//в строку output, а само число умножить на -1
 *if(x<0){strcat(output,"минус ");x*=-1;}
 *//если число превышает 999, то обработать первые
 *//3 цифры как разряд тысяч и записать в переменную
 *//3 последних цифры
 *if(x>999){decod3(x/1000,1,output);x%=1000;}
 *//обработать число (<1000)
 *decod3(x,0,output);
 *//вернуть ИСТИНУ
 *return true;
}


impersonalis 11.05.2006 18:20

Вложений: 2
Сама прога - юзание строго с моего разрешения! 8)

impersonalis 11.05.2006 18:22

Вложений: 2
Необходимые (если у вас не установлен Вижуал Студио) библиотеки

jimon 12.05.2006 00:19

интерисно что за dll юзает такая "большая" прога ? :)

impersonalis 12.05.2006 00:23

Цитата:

Originally posted by jimon@11.5.2006, 22:19
интерисно что за dll юзает такая "большая" прога ? :)

MFC

jimon 12.05.2006 19:39

imho MFC = зло
как никрути :(

win32api != зло

tormoz 12.05.2006 20:54

Цитата:

Originally posted by jimon@12.5.2006, 17:39
imho MFC = зло
как никрути :(

win32api != зло

флуд тоже зло :lol:

impersonalis 12.05.2006 23:46

2jimon:
продолжая аналогию:
win api =зло
любой_язык_и_интерфейс=зло
ассемблер=зло
да но то пошло - и машинный код =зло, т.к. вариативность ПК как такогого ограничена.
И вообще юзать гвотовые компьютеры - ламерство! Надо свои собирать...да... Кстати - юзать готовые матери/винты/видяхи - недальновидность и зло... кстати паять их паяльниками(не произведёнными самостоятельно) - тоже зло, т.к. заводские паяльники не обладают необходимой вариатностью и придуманы ламерами.

Короче jimon - ты нарвёшься...

jimon 13.05.2006 22:36

в моем посте было хорошее и правильное слово : imho
а в твоем нет
делай выводы :) я никого нихочу переубедить - просто я так щитаю, и имею право выразить свою точку зрения

alcoSHoLiK 13.05.2006 23:54

Цитата:

Originally posted by jimon@13.5.2006, 19:36
имею право выразить свою точку зрения

... по теме или в Болтовне.


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot