Форум программистов, компьютерный форум CyberForum.ru

Функция потока - C++

Восстановить пароль Регистрация
 
Khorok
1 / 1 / 0
Регистрация: 13.03.2013
Сообщений: 20
13.03.2013, 02:01     Функция потока #1
Подскажите пожалуйста, как сделать Перевод числа оформить как функцию потока. Ввод числа происходит до запуска потока, а вывод строки – по его завершению. Собственно функции реализованы, но проблемы с декомпозицией в одну функцию.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
//#include <stdafx.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale>
 
 static char *sot[]={"сто","двести","триста","четыреста",
             "пят","шест", "сем","восем","девят" };
 static char *desiat[]={" dvadsat"," тридцать"," сорок"," пят"," шест",
                " сем"," восем"," девяносто" };
 static char *edm[]={""," один"," два"," три"," четыре"," пять"," шесть",
             " семь"," восемь",
             " девять"," десять"," один"," две"," три",
             " четыр"," пят"," шест"," сем"," восем"," девят" };
 static char *edw[]={" одна"," две" };
 static char *nmtr[]={" тысяч"," миллион"," миллиард", " триллион",
               " квадриллион", " квинтиллион", " сектиллион", " септаллион", NULL };
         
 static char *nokm[]={ "а" , "ов" };
 static char *nokt[]={ "а", "и", "" };
/* ------------------ */
 int sklon(int dd)    
{ int n, r;
 
    r = 2;
    n = dd % 100;
    if (n>4 && n<20) return(r);
    n = n % 10;
    if      (n==1)       r = 0;
    else if (n>1 && n<5) r = 1;
    return(r);
}
int Propis3(unsigned long L, int n, char *s, int rg) // Число прописью
{ int R, ns, nd, r; char *p; unsigned long M;
 
   if (n==0 && L==0) {
     strcat(s, " ноль ");
     return n;
   }
   M = L / 1000;
   R = L % 1000;
   if (M != 0) Propis3(M, n+1, s, 0);  
   if (R==0) return R;
   ns = R / 100;
   if (ns)    sprintf(s+strlen(s), " %s", sot[ns-1]);
   if (ns>=5) strcat(s, "ьсот");
   R = R % 100;  
   nd = R / 10;  
   if (nd >= 2) {
      strcat(s, desiat[nd-2]);
      if (nd>=5 && nd<=8) strcat(s, "ьдесят");
      R = R % 10;
   }
  // r = sklon(R);
   if (n==1 && R>0 && R<3) p = edw[R-1];
   else                    p = edm[R];
   if (rg==1 && n==0) {
     if      (R==1) p = " одна";
     else if (R==2) p = " две";
   }
   if (rg==2 && n==0 && R==1) p = " одна";
   strcat(s, p);
   if (R > 10) strcat(s, "надцать");
   if (n > 0) {
     strcat(s, nmtr[n-1]);
     if     (n==1) strcat(s, nokt[r]);
     else if (r>0) strcat(s, nokm[r-1]);
   }
}
 
static char *drob[] = {
   " десят", " сот", " тысячн", " деятитысячн", " стотысячн",
   " миллионн", " десятимиллионн", " стомиллионн", " миллиардн",
   " десятимиллиардн", " стомиллиардн", " триллионн"  };
/* ------------------ */
void main()
{   
 
    setlocale(LC_ALL,"Russian");
    char b[200], s[1000], *d, *p; unsigned long L; int nn, k, rg;
 
a: printf(">");
   gets(b);
   if (strlen(b)==0) return;
   d = strchr(b, '.');
   if (d==NULL) rg = 0;
   else         rg = 2;
   s[0] = '\0';
   L = atol(b);
   Propis3(L, 0, s, rg);
   if (d!=NULL) {
     k = L % 10;
     if (k!=1) p = "целых";
     else      p = "целая";
     sprintf(s+strlen(s), " %s и ", p);
     L = atol(d+1);
     nn = 0;  // Кол-во дробных знаков
     for (nn=0, d=d+1; *d!='\0' && *d>='0' && *d<='9'; d++, nn++) ;
     if (nn==0) nn = 1;
     Propis3(L, 0, s+strlen(s), 1);
     strcat(s, drob[nn-1]);
     k = L % 10;
     if (k!=1) strcat(s, "ых");
     else      strcat(s, "ая");
   }
   printf("%s\n", s);
   goto a;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.03.2013, 02:01     Функция потока
Посмотрите здесь:

Очищение потока C++
Создание потока из потока. C++
Функция для записи в буфер из потока C++
C++ Очистка потока
C++ Функция потока не видит структуру класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
13.03.2013, 10:24     Функция потока #2
Я бы вообще всё переписал, потому что это жесть!
Цитата Сообщение от Khorok Посмотреть сообщение
проблемы с декомпозицией в одну функцию
Декомпозиция - это разделение на несколько.
Khorok
1 / 1 / 0
Регистрация: 13.03.2013
Сообщений: 20
13.03.2013, 15:37  [ТС]     Функция потока #3
Tulosba, почему жесть ?
Можете предоставить свой вариант ?
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
13.03.2013, 16:32     Функция потока #4
Цитата Сообщение от Khorok Посмотреть сообщение
почему жесть ?
1. Код у Вас по сути сишный. Если заменить <locale> на <locale.h>, то плюсов и вовсе не останется.
2. Слишком часто используются не говорящие имена переменных ( L, n, s, rg, R, ns, nd, r, p, M ).
3. Для цикла используется goto. Хотя есть же for/while.
4. Форматирование кода ужасное. Всё навалено в кучу.

Ну и напоследок, проверьте входное значение ".999999"
Цитата Сообщение от Khorok Посмотреть сообщение
Можете предоставить свой вариант ?
Могу дать ссылочку.
Khorok
1 / 1 / 0
Регистрация: 13.03.2013
Сообщений: 20
13.03.2013, 19:12  [ТС]     Функция потока #5
Tulosba, проблема в том, что у меня число не целое.
Yandex
Объявления
13.03.2013, 19:12     Функция потока
Ответ Создать тему
Опции темы

Текущее время: 04:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru