Преобразовать число из входной строки в словесную форму - C (СИ)
Формулировка задачи:
Необходимо найти ошибку в программе на СИ / C (Си)
Помогите пожалуйста найти ошибку в программе. Задание было преобразовать число из входной строки в словесную форму (числа от 0 до 1000). Но на выходе программа выдает набор символов вместо ожидаемого результата.
Код C
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <ctype.h>
char* getSotni(char x1)
{
char s[11] = "\0";
switch (x1)
{
case '1': strcpy(s,"sto"); break;
case '2': strcpy(s,"dvesti"); break;
case '3': strcpy(s,"trista"); break;
case '4': strcpy(s,"chetiresta"); break;
case '5': strcpy(s,"piatsot"); break;
case '6': strcpy(s,"shestsot"); break;
case '7': strcpy(s,"semsot"); break;
case '8': strcpy(s,"vosemsot"); break;
case '9': strcpy(s,"devatsot"); break;
default: break;
}
return s;
}
char* GetDeciatki(char x2, char x3)
{
char s[15] = "\0";
switch (x2)
{
case 1:
switch (x3)
{
case '0': strcpy(s, "ten"); break;
case '1': strcpy(s,"eleven"); break;
case '2': strcpy(s,"twelve"); break;
case '3': strcpy(s,"thirteen"); break;
case '4': strcpy(s,"fourteen"); break;
case '5': strcpy(s,"fifteen"); break;
case '6': strcpy(s,"sixteen"); break;
case '7': strcpy(s,"seventeen"); break;
case '8': strcpy(s,"eighteen"); break;
case '9': strcpy(s,"nineteen"); break;
default: break;
}
break;
case '2': strcpy(s,"twenty"); break;
case '3': strcpy(s,"thirty"); break;
case '4': strcpy(s,"fourty"); break;
case '5': strcpy(s,"fifty"); break;
case '6': strcpy(s,"sixty"); break;
case '7': strcpy(s,"seventy"); break;
case '8': strcpy(s,"eighty"); break;
case '9': strcpy(s,"ninety"); break;
default: break;
}
return s;
}
char* getEdin(char x3)
{
char s[11] = "\0";
switch (x3)
{
case '1': strcpy(s,"one"); break;
case '2': strcpy(s,"two"); break;
case '3': strcpy(s,"three"); break;
case '4': strcpy(s,"four"); break;
case '5': strcpy(s,"five"); break;
case '6': strcpy(s,"six"); break;
case '7': strcpy(s,"seven"); break;
case '8': strcpy(s,"eight"); break;
case '9': strcpy(s,"nine"); break;
default: break;
}
return s;
}
char* getString(char* a)
{
char a1, a2, a3;
int x = 0;
x = atoi(a);
if(strcmp(a,"0")==0) return "zero";
else
if (strcmp(a,"1000")==0) return "tysiacha";
else
{
if ((x<=0) || (x>1000))
{
return "Error. Wrong number.";
}
else
{
if(x<10)
{
a1=0;
a2=0;
a3=a[0];
}
else
if(x>=10&&x<100)
{
a1=0;
a2=a[0];
a3=a[1];
}
else
{
a1=a[0];
a2=a[1];
a3=a[2];
}
}
}
char* sotni = getSotni(a1);
printf("%s",sotni);
char* dec = GetDeciatki(a2,a3);
printf("%s",dec);
/*if(a2!='1')
{
char* edin = getEdin(a3);
printf("%s",edin);
}*/
if(a2=='1')
return strcat(getSotni(a1),GetDeciatki(a2,a3));
else
return strcat(strcat(getSotni(a1),GetDeciatki(a2,a3)),getEdin(a3));
return a;
}
void main()
{
char a[5] = "\0";
puts("Enter number: ");
gets(a);
puts(getString(a));
//getString(a);
getchar();
}Решение задачи: «Преобразовать число из входной строки в словесную форму»
textual
Листинг программы
#include <iostream>
#include <string>
#include "conio.h"
using namespace std;
int main() {
string units[10] = {"zero","one","two","three","four","five","six","seven","eight","nine"};
string tens[8] = {"twenty","thirty","fourty","fifty","sixty","seventy","eighty","ninety"};
string hundreds[10] = {"one hundred","two hundreds","three hundreds","four hundreds","five hundreds","six hundreds","seven hundreds","eight hundreds","nine hundreds"};
string teun[9] = {"eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"};
int num=0;
cin>>num;
int hundred = num/100;
int ten = num/10%10;
int unit = num%10;
if(hundred)
cout<<hundreds[hundred-1]<<" ";
if(ten>1) {
cout<<tens[ten-2]<<" ";
}
else if(ten==1) cout<<teun[unit-1]<<endl;
if(ten>1 || ten==0)cout<<units[unit];
getch();
return 0;
}
Объяснение кода листинга программы
- В начале программы подключаются необходимые библиотеки для работы с потоками ввода-вывода и строками.
- Далее, объявляются массивы строк для хранения числовых обозначений от 0 до 999.
- Затем, в основной функции программы
main(), инициализируются переменныеnum,hundred,tenиunit, которые будут использоваться для хранения и обработки числового значения, введенного пользователем. - С помощью функции
cinвводится числовое значение. - Переменная
hundredсодержит целую часть числа, деленного на 100. - Переменная
tenсодержит целую часть числа, деленного на 10 (остаток от деления на 100), и затем деленную на 10. - Переменная
unitсодержит остаток от деления числа на 10 (после деления на 100 и 10). - В зависимости от значения переменной
hundred, выводится соответствующее числовое обозначение из массиваhundreds. - Если значение переменной
tenбольше 1, то выводится соответствующее числовое обозначение из массиваtens. - Если значение переменной
tenравно 1 и значение переменнойunitбольше 1, то выводится соответствующее числовое обозначение из массиваteun. - Если значение переменной
tenбольше 1 или равно 0, то выводится соответствующее числовое обозначение из массиваunits, равное значению переменнойunit. - В конце программы вызывается функция
getch(), которая ожидает нажатия клавиши, и функцияmain()возвращает 0, завершая программу.