Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на строки
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
UtaH
Народ, помогите плз решить задачу. Даётся текстовая строка представляющая собой правильную запись целого числа, напр "одиннадцать" .на ввод строки должно выводиться её числовое значение т.е. если вводится "сто двадцать четыре" должно вывестись
124. Загонять case на каждое числительное мне как-то не особо :-[
sandman
давно ничего не писал, но может такая бредовая идея подойдет:

создать 2 массива, в одном из которых будут строковые знаечния (один,два...десять...) а в другом соответсвующие числа, с такими же индексами.
example:
array['один','два',итакдалее] of string
array[1,2,...] of integer
далее разбить входящую строку на слова и анализировать каждое слово, просматривая массив строк и на сопоставляя соответствующие элементы числового массива, складывая их в последствии...
p.s. что-нибудь из этого понял?  ;)
fms
есть решение наоборот. из числа в текст. т.е. 124="сто двадцать четыре"

если нужно могу выложить.
APAL
Может поможет:

Код

Function GetNumFromSt(Sc : String) : LongInt;
Var Cs         : String;
   N1s,N2s,Ks : Byte;
   ddd,iii    : Integer;
Begin
 N1s:=0;
 Ks:=0;
   While (N1s=0) and (Ks<=Length(Sc)) do
     Begin
       Inc(Ks);
       If (Sc[Ks]>='0') and (Sc[Ks]<='9') then N1s:=Ks;
     End;
   If N1s=0 then
          Begin
            GetNumFromSt:=0;
            Exit;
          End;
   N2s:=N1s;
   While (Sc[N2s]>='0') and (Sc[N2s]<='9') do
                                             Inc(N2s);
   Cs:='';
   Dec(N2s);
   For Ks:=N1s to N2s do Cs:=Cs+Sc[Ks];
   Val(Cs,ddd,iii);
   GetNumFromSt:=ddd;
End;
UtaH
Sandman, а если там числа до 999999999?
fms
ну не надо дак не надо..  ;D
UtaH
FMS,выложи плиз может поможет ;D
fms
знаете.. только там на С. хотя какая разница? переделать можно.. ;D


#include <stdio.h>
#include <string.h>

#define DG_POWER 6 // Энто допустимая степень числа 1000 для __int64:
// При необходимости его легко увеличить,
struct s_POWER { // дополнив массив 'a_power' и заменив
int sex; // тип __int64 на более серьезный
char *one;
char *four;
char *many;
} a_power[]= {
{0,NULL ,NULL ,NULL }, // 1
{1,"тысяча " ,"тысячи " ,"тысяч " }, // 2
{0,"миллион " ,"миллиона " ,"миллионов " }, // 3
{0,"миллиард " ,"миллиарда " ,"миллиардов " }, // 4
{0,"триллион " ,"триллиона " ,"триллионов " }, // 5
{0,"квадриллион ","квадриллиона ","квадриллионов "}, // 6
{0,"квинтиллион ","квинтиллиона ","квинтиллионов "} // 7
};

struct s_UNIT {
char *one[2];
char *two;
char *dec;
char *hun;
} digit[10]= {
{{"" ,"" },"десять " ,"" ,"" },
{{"один " ,"одна " },"одиннадцать " ,"десять " ,"сто " },
{{"два " ,"две " },"двенадцать " ,"двадцать " ,"двести " },
{{"три " ,"три " },"тринадцать " ,"тридцать " ,"триста " },
{{"четыре ","четыре "},"четырнадцать ","сорок " ,"четыреста "},
{{"пять " ,"пять " },"пятнадцать " ,"пятьдесят " ,"пятьсот " },
{{"шесть " ,"шесть " },"шестнадцать " ,"шестьдесят " ,"шестьсот " },
{{"семь " ,"семь " },"семнадцать " ,"семьдесят " ,"семьсот " },
{{"восемь ","восемь "},"восемнадцать ","восемьдесят ","восемьсот "},
{{"девять ","девять "},"девятнадцать ","девяносто " ,"девятьсот "}
};

string dig2str (__int64 p_summa, int p_sex, char *p_one, char *p_four, char *p_many)
{
int i,mny;
string str,result="";
__int64 divisor; //делитель

a_power[0].sex = p_sex;
a_power[0].one = p_one;
a_power[0].four = p_four;
a_power[0].many = p_many;

if(p_summa == (__int64)0) return string("ноль ")+p_many;
if(p_summa < (__int64)0) {result="минус "; p_summa = -p_summa;}

for(i=0,divisor=(__int64)1; i<DG_POWER; i++)
divisor *= (__int64)1000;
for(i=DG_POWER-1; i>=0; i--){
divisor /= 1000;
mny = (int)(p_summa / divisor);
p_summa %= divisor;
str="";
if(mny==0){
if(i>0) continue;
str += a_power[i].one;
}else{
if(mny>=100){str += digit[mny/100].hun; mny%=100;}
if(mny>=20 ){str += digit[mny/10 ].dec; mny%=10; }
if(mny>=10 ) str += digit[mny-10 ].two; else
if(mny>=1 ) str += digit[mny].one[a_power[i].sex];
switch(mny){
case 1: str += a_power[i].one; break;
case 2: case 3:
case 4: str += a_power[i].four; break;
default: str += a_power[i].many; break;
};
}
result += str;
}
return result;
}
UtaH
Спасибо огромное. Щас вот переводить буду :o
fms
2UtaH
удачи.. она тебе пригодится..  ;D
UtaH
Спасибо за помощь на олимпиаде хоть не позорнулась.
2fms: это ты из книжки выписала?
fms
2UtaH

неа.. в инете как то нашла.. понравилось.. сохранила.. ну вот и пригодилось.. вроде.  ;D
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.