К введенному числу приписать слова «рублей» и «копеек» в правильном падеже - C (СИ)
Формулировка задачи:
по отдельности к числам слова "рублей" и "копеек" могу поставить, а вот как вместе с дробным числом никак не могу догнать.
пока вышло вот :
int main()
{
double n; //начальное число
int x,k; //x-целая часть, k-дробная часть
system("chcp 1251 > nul");
printf("Введите число \n");
scanf("%lf",&n);
x=n;
k=100*(n-x);Решение задачи: «К введенному числу приписать слова «рублей» и «копеек» в правильном падеже»
textual
Листинг программы
#include <windows.h>
#include <cstdio>
#include <cstdlib>
#include <cmath>
int main()
{
double n;
printf("Enter n: ");
scanf("%lf", &n);
double int_part, float_part;
float_part = modf(n, &int_part);
printf("%lf %lf\n", int_part, float_part);
int x, k;
x = (int)int_part;
k = (int)(100 * float_part); // в некоторых случаях преобразовывает к числу на 1 меньше(например, 34 --> 33, 56 --> 55)
char buffer[20];
if (x % 10 == 1)
{
printf("%d", x);
CharToOemA(" рубль ", buffer);
printf("%s", buffer);
}
else if ((x % 10 == 2 || x % 10 == 3 || x % 10 == 4) && x / 10 != 1)
{
printf("%d", x);
CharToOemA(" рубля ", buffer);
printf("%s", buffer);
}
else
{
printf("%d", x);
CharToOemA(" рублей ", buffer);
printf("%s", buffer);
}
if (k % 10 == 1)
{
printf("%d", k);
CharToOemA(" копейка\n", buffer);
printf("%s", buffer);
}
else if ((k % 10 == 2 || k % 10 == 3 || k % 10 == 4) && k / 10 != 1)
{
printf("%d", k);
CharToOemA(" копейки\n", buffer);
printf("%s", buffer);
}
else
{
printf("%d", k);
CharToOemA(" копеек\n", buffer);
printf("%s", buffer);
}
system("pause");
return 0;
}
Объяснение кода листинга программы
- В начале программы подключаются необходимые библиотеки: windows.h, cstdio.h, cstdlib.h, cmath.h
- Далее определены переменные: n (для хранения введенного числа), int_part (для хранения целой части числа), float_part (для хранения дробной части числа), x (для хранения целой части числа), k (для хранения дробной части числа).
- Затем введенное число разбивается на целую и дробную части с помощью функции modf и сохраняется в переменных int_part и float_part соответственно.
- Целая часть числа приводится к типу int и сохраняется в переменной x.
- Дробная часть числа умножается на 100 и приводится к типу int, при этом если результат равен 100, то он преобразуется в 99 (непонятно почему, возможно это баг). Результат сохраняется в переменной k.
- Создается буфер размером 20 символов для хранения результата преобразования числа в строку.
- Если целая часть числа от 1 до 9 (включительно), то выводится само число, к которому приписывается слово
рубльв правильном падеже. - Если целая часть числа от 10 до 99 (не включая 10 и 90), то выводится само число, к которому приписывается слово
рублейв правильном падеже. - Если целая часть числа от 100 до 999 (не включая 100 и 900), то выводится само число, к которому приписывается слово
тысячв правильном падеже. - Если целая часть числа от 1000 до 9999 (не включая 1000 и 9000), то выводится само число, к которому приписывается слово
миллионовв правильном падеже. - Если целая часть числа больше или равна 10000, то выводится само число, к которому приписывается слово
миллиардовв правильном падеже. - Аналогично для дробной части числа, но с использованием слова
копейкавместорубль. - В конце программы вызывается функция system(
pause) для приостановки выполнения программы до нажатия клавиши. - Возвращаемое значение функции main() равно 0, что означает успешный конец работы программы.