Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2010, 01:06   #1
Todeskin
 
Регистрация: 08.09.2010
Сообщений: 5
Восклицание Немогу правильно закончить

Программа должна число писать прописью. Функция должна отдать пропись ........ Как правильно её оформить,
что бы увидеть число прописью???
Среда ms visual c++6.0

Код:
//программа с функцией замены числа прописью
#include <iostream>
char *towords(int )
int main()
{
	int n=17;
int f=--n;
int* p;
p=&f;
(*p)--;
*p==?
char b[];
towords = &b;
towords(a);
cout<< "number is " <<  b << endl;
return 0;
}

char *towords(int numb){
    //массив, для определения разряда, в котором находимся(сотни,десятки,еденицы...)
    int osn[11]={0,1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
 
    //массив оснований
    char *basis[11][10]={
        {"","","","","","","","","",""},
        {"","один","два","три","четыре","пять","шесть","семь","восемь","девять"},
        {"","десять","двадцать","тридцать","сорок","пятьдесят","шестьдесят","семьдесят","восемьдесят","девяносто"},
        {"","сто","двести","триста","четыреста","пятьсот","шестьсот","семьсот","восемьсот","девятьсот"},
        {"","одна","две","три","четыре","пять","шесть","семь","восемь","девять"},
        {"","десять","двадцать","тридцать","сорок","пятьдесят","шестьдесят","семьдесят","восемьдесят","девяносто"},
        {"","сто","двести","триста","четыреста","пятьсот","шестьсот","семьсот","восемьсот","девятьсот"},
        {"","один","два","три","четыре","пять","шесть","семь","восемь","девять"},
        {"","десять","двадцать","тридцать","сорок","пятьдесят","шестьдесят","семьдесят","восемьдесят","девяносто"},
        {"","сто","двести","триста","четыреста","пятьсот","шестьсот","семьсот","восемьсот","девятьсот"},
        {"","один","два","три ","четыре","пять","шесть","семь","восемь","девять"}};
 
    //массив окончаний
    char *termination[10][10]={
        {"","","","тысяч","","","миллионов","","","миллиардов"},
        {"","","","тысяча","","","миллион","","","миллиард"},
        {"","","","тысячи","","","миллиона","","","миллиарда"},
        {"","","","тысячи","","","миллиона","","","миллиарда"},
        {"","","","тысячи","","","миллиона","","","миллиарда"},
        {"","","","тысяч","","","миллионов","","","миллиардов"},
        {"","","","тысяч","","","миллионов","","","миллиардов"},
        {"","","","тысяч","","","миллионов","","","миллиардов"},
        {"","","","тысяч","","","миллионов","","","миллиардов"},
        {"","","","тысяч","","","миллионов","","","миллиардов"}};
 
    char *dec[10]={"десять","одиннадцать","двенадцать","тринадцать","четырнадцать","пятнадцать","шестнадцать","семнадцать","восемнадцать","девятнадцать"};
 
    int n1=numb;
    int cnt=0;
 
    //подсчет количесива цифр в числе
    while (numb){
        numb/=10;
        ++cnt;
    }
 
    char result[100]={};
    int celoe=0;
 
    while (n1){
          if (!((cnt+1) % 3)){
            if ((n1/osn[cnt])==1){
                    n1%=osn[cnt];
                    --cnt;
                    celoe=n1/osn[cnt];
                    n1%=osn[cnt];
                    strcat(result, dec[celoe]);
                --cnt;
                if (!(cnt % 3)){
                    strcat(result, " ");
                strcat(result, termination[0][cnt]);
                strcat(result, " ");
                }
            }
            if (!cnt) break;
        }
        celoe=n1/osn[cnt];
        n1%=osn[cnt];
        strcat(result, basis[cnt][celoe]);
        --cnt;
        strcat(result, " ");
        if (!(cnt % 3)){
            strcat(result, termination[celoe][cnt]);
            strcat(result, " ");
        }
    }
    CharToOem(result,result);
    return result;
}

Последний раз редактировалось Stilet; 08.09.2010 в 08:54.
Todeskin вне форума Ответить с цитированием
Старый 08.09.2010, 07:38   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Имеется ввиду это?
Код:
  ...
  CharToOem(result,result);
  system("pause");
  return 0; // main должна возвращать 0 в случае успешного завершения и иное число в случае возникновения ошибки
}
pu4koff вне форума Ответить с цитированием
Старый 08.09.2010, 08:43   #3
Todeskin
 
Регистрация: 08.09.2010
Сообщений: 5
По умолчанию

http://programmersforum.ru/member.php?u=3369
я имею ввиду в int main() объявление функции, передача её значения и получение символьного представления.
Как вообще правильно использовать функцию с указателем??????
Т.е. char *towords(int numb), что бы вывевсти число прописью?
Todeskin вне форума Ответить с цитированием
Старый 08.09.2010, 08:59   #4
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

Todeskin
Ты хочешь, что-бы функция принимала число "10" а возвращала "десять"?

Ну и возвращай строки, зачем тебе указатели?

Код:
string func() {
return string("stroka");
}
ну или
Код:
string func() {
return "stroka";
}
Код:
Ну или если хочешь юзать это извращение с указателями:
char* func() {
    char *str("stroka");
return str;
}

Последний раз редактировалось the_deer_one; 08.09.2010 в 09:06.
the_deer_one вне форума Ответить с цитированием
Старый 08.09.2010, 09:13   #5
Todeskin
 
Регистрация: 08.09.2010
Сообщений: 5
Вопрос

Код:
int main()
{
int n=47;
????????????????
}
Как объявить функцию char *towords(int ) в основной программе и правильно ей передать 47, а потом вывести "сорок семь",
с этими "извращенными указателями"

the_deer_one

Код:
char towords(int numb){
    //массив, для определения разряда, в котором находимся(сотни,десятки,еденицы...)
    int osn[11]={0,1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
 
    //массив оснований
    char basis[11][10]={
        };
 
    //массив окончаний
    char termination[10][10]={      };
 
    char dec[10]={"десять","одиннадцать","двенадцать","тринадцать","четырнадцать","пятнадцать","шестнадцать","семнадцать","восемнадцать","девятнадцать"};
 
    int n1=numb;
    int cnt=0;
 
    //подсчет количесива цифр в числе
    while (numb){
        numb/=10;
        ++cnt;
    }
 
    char result[100]={};
    int celoe=0;
 
    while (n1){
          if (!((cnt+1) % 3)){
            if ((n1/osn[cnt])==1){
                    n1%=osn[cnt];
                    --cnt;
                    celoe=n1/osn[cnt];
                    n1%=osn[cnt];
                    strcat(result, dec[celoe]);
                --cnt;
                if (!(cnt % 3)){
                    strcat(result, " ");
                strcat(result, termination[0][cnt]);
                strcat(result, " ");
                }
            }
            if (!cnt) break;
        }
        celoe=n1/osn[cnt];
        n1%=osn[cnt];
        strcat(result, basis[cnt][celoe]);
        --cnt;
        strcat(result, " ");
        if (!(cnt % 3)){
            strcat(result, termination[celoe][cnt]);
            strcat(result, " ");
        }
    }
    CharToOem(result,result);
    return result;
}
а вот так можно???

From Stilet: Я что за тебя должен всякий раз пост поправлять? Форматируй код спецтегом по кнопке #. В противном случае нарушение выпишу

Последний раз редактировалось Stilet; 08.09.2010 в 10:27.
Todeskin вне форума Ответить с цитированием
Старый 08.09.2010, 10:32   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

нельзя. result - локальная переменная и при завершении функции она уничтожится. Нужно либо принимать в качестве параметра указатель на строковый буфер под строку:
Код:
// numb - число, которое переводится в строку
// result - принимающая результат строка
// result_len -  Максимальная длина принимающей строки. Чтобы не вылезти за пределы выделенной памяти
void towords(int numb, char *result, int result_len)
{
  ...
}
Такой вариант является наиболее безопасным в плане работы с памятью (если конечно внутри функции ничего не намудрите.
Так же есть вариант выделять память под строку в функции:
Код:
char* towords(int numb)
{
  ...
  char* result = new char[100];
  ...
  return result;
}
Тут недостаток в том, что пользователь функции должен не забывать очищать память:
Код:
char *str = towords(10);
cout << str << endl;
delete[] str; // Удалили память, выделенную в towords
Так же есть уже озвученный вариант с использованием класса string из STL. Можно прикрутить "умные" указатели для автоматической очистки памяти.
Я бы использовал string (всё же это стандартная штука). Ну а если уж класс этот под запретом, то описанный мною первый вариант, как более кошерный в плане управления памятью.
pu4koff вне форума Ответить с цитированием
Старый 08.09.2010, 11:17   #7
Todeskin
 
Регистрация: 08.09.2010
Сообщений: 5
По умолчанию

pu4koff
Я вообще-то хочу понять, как эту функцию правильно использовать в основном теле программы!!!!!!!!!То есть в int main, или я её правильно объявил??? И забрал массив b???
Todeskin вне форума Ответить с цитированием
Старый 08.09.2010, 12:14   #8
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

Цитата:
Я вообще-то хочу понять, как эту функцию правильно использовать в основном теле программы!!!!!!!!!
Примерно так.

Код:
#include <iostream>
#include <stdlib.h>
using namespace std;

//объявление функции
char* func(int i) {
    char *str("stroka");
return str;
}

int main() {
    cout<<func(47)<<endl; // А в основном теле её можно спокойно вызывать
    system("pause");
    return 1;
}
the_deer_one вне форума Ответить с цитированием
Старый 08.09.2010, 12:19   #9
Todeskin
 
Регистрация: 08.09.2010
Сообщений: 5
По умолчанию

вот это работает!!!!
но компилятор говорит
error C2668: 'insert' : ambiguous call to overloaded function
Error executing cl.exe.
---> in.insert(0, 15-in.length(), ' ');
если не использовать, тогда маленькие числа не переводит.....
и всё время вместо чисел пишет билеберду, как от неё избавиться???



Цитата:
#include <string>
#include <iostream>

std::string triada(const std::string& in, int tn)
{
if (in == " ") return "";
if (in == "000") return "";

static std::string sotni[9] =
{"сто", "двести", "триста", "четыреста", "пятьсот",
"шестьсот", "семьсот", "восемьсот", "девятьсот"};
static std::string dubl[10] =
{"десять", "одиннадцать", "двенадцать", "тринадцать", "четырнадцать",
"пятнадцать", "шестнадцать", "семнадцать", "восемнадцать", "девятнадцать"};
static std::string des[8] =
{"двадцать", "тридцать", "сорок", "пятьдесят",
"шестьдесят", "семьдясят", "восемьдясят", "девяносто"};
static std::string ed[9] = {"один", "два", "три", "четыре", "пять", "шесть","семь", "восемь", "девять"};
static std::string edj[9] = {"одна", "две", "три", "четыре", "пять", "шесть","семь", "восемь", "девять"};
static std::string ind[5] = {"", " тысяч", " миллион", " миллиард", " триллион"};

std::string out;
std::string post;

// количество сотен, если есть
if (in[0] != ' ' && in[0] != '0')
{
out = out + sotni[in[0]-'1'];
}

// случай 10-19 в двузначной части числа
if (in[1] == '1')
{
out = out + " " + dubl[in[2]-'0'];
}

// десятки 20-90
if (in[1] != '1' && in[1] != ' ' && in[1] != '0')
{
out = out + " " + des[in[1]-'2'];
}

// единицы
if (in[2] != '0' && in[1] != '1')
{
// если кол-во тысяч то используем другое окончание
if (tn == 1)
out = out + " " + edj[in[2]-'1'];
else
out = out + " " + ed[in[2]-'1'];
}

// добавляем приписку о тысячах, миллионах и т.д.
if (tn > 0)
{
if (in[1] != '1')
{
// если 20-90 десятков
// окончания для тысяч
if (tn == 1)
switch (in[2])
{
case '1': post = ind[tn] + "а"; break; // xx1
case '2': post = ind[tn] + "и"; break; // хх2
case '3': post = ind[tn] + "и"; break; // хх3
case '4': post = ind[tn] + "и"; break; // хх4
default : post = ind[tn] + ""; break; // хх5-хх9
}
// окончания для миллионов и далее
if ((tn==2)||(tn==3)||(tn==4))
switch (in[2])
{
case '1': post = ind[tn] + ""; break; // xx1
case '2': post = ind[tn] + "а"; break; // хх2
case '3': post = ind[tn] + "а"; break; // хх3
case '4': post = ind[tn] + "а"; break; // хх4
default : post = ind[tn] + "ов"; break;// хх5-хх9
}
}
else
{
// случай 10-12 в двузначной части
switch (tn)
{
case 1 : post = ind[tn]; break; // тысячи
default : post = ind[tn] + "ов"; break; // миллионы и далее
}
}
}
out = out + post;
return out;
}

std::string summa(std::string in)
{
std::string out;
std::string trs[5];
std::string tro[5];
int n;

// дополняем in в начале нулями до 15 знаков
in.insert(0, 15-in.length(), ' ');

// вставляем в trs[] части строки из in
trs[0].insert(trs[0].begin(), in.c_str()+12, in.c_str()+15);
trs[1].insert(trs[1].begin(), in.c_str()+9, in.c_str()+12);
trs[2].insert(trs[2].begin(), in.c_str()+6, in.c_str()+9);
trs[3].insert(trs[3].begin(), in.c_str()+3, in.c_str()+6);
trs[4].insert(trs[4].begin(), in.c_str(), in.c_str()+3);

// получаем части числа
for (n=0;n<5;n++)
{
tro[n] = triada(trs[n], n);
}
// собираем число
out = tro[4]+" "+tro[3]+" "+tro[2]+" "+tro[1]+" "+tro[0];
return out;
}

int main()
{
std::string s = summa("243101812002031");
// чтобы не писать крюкозябр, выставляем локаль
setlocale(LC_ALL, "Russian");
std::cout << s << std::endl;
}
Todeskin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Закончить БД в IBExpert 365307ксю БД в Delphi 4 22.06.2010 20:06
Как закончить БД? valenina БД в Delphi 17 15.06.2010 10:14
ЗАКОНЧИТЬ ПРОГРАММУ! 4ika Общие вопросы C/C++ 3 10.02.2010 02:20
Закончить работу по MS Access L0102591 Помощь студентам 0 22.01.2010 22:12