Уважаемые посетители! Форум CQHAM.RU существует исключительно за счет показа рекламы. Мы будем благодарны, если Вы не будете блокировать рекламу на нашем Форуме. Просим внести cqham.ru в список исключений для Вашего блокировщика рекламы.
Страница 1 из 7 1234 ... ПоследняяПоследняя
Показано с 1 по 10 из 70

Тема: Программа, которая считает ворон :)

  1. #1
    Аватар для vadim_d
    Регистрация
    29.10.2006
    Адрес
    Санкт-Петербург
    Сообщений
    14,741

    Программа, которая считает ворон :)

    Время от времени при поиске работы приходилось выполнять разные тестовые задания, но пожалуй только это как-то выделилось на общем фоне. Просили подготовить комп с сишным компилятором, вроде именно линукс хотели, тогда имелась уже поставленная виртуалка, сказали что подойдет, требование было уложиться в три часа, а прислали задание в заранее согласованное время. Вот собственно задание и было некоторым сюрпризом:
    /*
    Написать код на С/С++, который из целого числа от 0 до 4294967295, выдаёт
    на русском языке сумму прописью добавляя в нужном падеже слово «ворона».

    Например: ввели число 11, выдали «одиннадцать ворон», ввели - 101,
    выдали «сто одна ворона» и т.д.
    */
    При всей кажущейся простоте задача не очень тривиальная, но вроде часа за два с половиной получил какой-то результат и отправил его. Периодически этот код попадался на глаза, но вот сейчас решил его пересобрать и проверить. Тут и увидел, что одно предупреждение при компиляции GCC под MinGW выскакивает, и что случай нуля не учтен, и что при нулевых сотнях полная лажа выдается. Подправил, подумал, что может при задании входного диапазона от 0 до 4294967295 хотели, чтобы я оформил это функцией, принимающей аргумент в виде беззнакового целого числа, но переделывать не стал. Если кто изучает программирование, то может использовать код в учебных целях, как пример табличной оптимизации.
    Показан скриншот при компиляции и запуске под MinGW на Win7, требуется включение нужной кодировки командой "cp 1251". Бесплатный Аваст дико ругается на собранный екзешник и блокирует его, пришлось отключать. У исходника crow.c.txt перед компиляцией убрать расширение .txt
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	row_cnt_01.png 
Просмотров:	195 
Размер:	17.6 Кб 
ID:	387545  
    Вложения Вложения
    Вадим

  2. Спасибо от Genadi Zawidowski


  3. #2

    Регистрация
    06.11.2009
    Адрес
    Энергодар УКРАИНА
    Сообщений
    947
    Позывной
    UR4QRC
    Нам бы не ворон, а попугаев !

  4. #3

    Регистрация
    26.02.2004
    Адрес
    Николаев
    Сообщений
    13,753
    Позывной
    UR5ZQV
    vadim_d,
    Время от времени при поиске работы приходилось выполнять разные тестовые задания,
    Соболезную, но теперь ничем помочь не могу. Но Вы ж вопроса не задали в теме.
    Наверное надо было начать, с лог. диамат. алгоритма, ситемы ценнстей (критериев). А уж потом всплывет нужный инструмент ( типа языки, системы, кодировка, ОС и т.п.).
    Правда при самообразе это заниимает немного больше времени, чем при системном "обрАзе" :(. Но не летально .
    ПС: Вадим, извините за лирический ОФФ, у меня несколько десятков вопросов, которые пришлось решать, помимо "официальной корки", профессионально, т.е. за зарплату, потом участвоватьв ее изготовлениии, физически, потом сдавать Заказчику, а иногда и лично участвовать в эксплуатации "своих задумок" .
    Александр. (Ex: RB5ZDR, UQ2GKQ)

  5. #4
    Аватар для vadim_d
    Регистрация
    29.10.2006
    Адрес
    Санкт-Петербург
    Сообщений
    14,741
    Цитата Сообщение от UR5ZQV Посмотреть сообщение
    А уж потом всплывет нужный инструмент
    Не, тут все проще, если в резюме назвался сивым программистом, то и захотят проверить умение пользоваться языком программирования Си

    Цитата Сообщение от ur4qrc Посмотреть сообщение
    не ворон, а попугаев
    Таки да, измерение в попугаях намного актуальнее, можно надеяться, что если кто-то решит прочесть этот код (вслух, с выражениями) и понять его, то следующим шагом может стать простое упражнение по замене ворон на попугаев
    Вадим

  6. #5

    Регистрация
    26.02.2004
    Адрес
    Николаев
    Сообщений
    13,753
    Позывной
    UR5ZQV
    vadim_d, Извините за философское отклонение.
    У меня еще проще, я занялся этим по своим задачам, самобразом, когда потребовался ЦОС для РЛ связи, правда пришлось затратить на это 3.5 года (правда без отрыва от производства), но не системно, а применительно к своим задачам. Поэтому пришлось вникнуть и в С, при основе Паскаль/Делфи, и понятиях о Асемблере, Бейсике и т.п., АПИ и различных ОС (надо ж было где то, как то, выковыривать алгоритмы из кодов).
    Про это прознали мои коллеги по работе, и начали втихаря подсылать меня на несвойственные работы (я по "штатному" образованию судовой механик), по электронике, автоматике, радиосвязи и т.п.
    Пытался отмахиваться своей темносиней коркой, мол не имею права, не та квалификация, но было уже поздно, пришлось идти и исполнять. К счастью, после этого никаких потерь, и тем более "жертв" не было (тьфу-тьфу).
    Так что с философской точки зрения, ничто не проходит даром, все ж осталось, даже если и были неудачи.
    Зато я и сейчас могу решать хоть свои задачи, если этот инструмент мне понадобится, для тиражирования прог у одиночки конечно кишка тонка, тут коллектив нужен, но под себя делать можно .
    Александр. (Ex: RB5ZDR, UQ2GKQ)

  7. #6
    Аватар для payalnik
    Регистрация
    27.09.2015
    Адрес
    Красноярский край
    Сообщений
    907
    Цитата Сообщение от vadim_d Посмотреть сообщение
    что если кто-то решит прочесть этот код (вслух, с выражениями) и понять его
    И даже протестировать! Если число от 10 до 19, то вылетает с ошибкой. В консоли пишет число, но без слова "ворон". PellesC, 32 бит, windows xp.

    Добавлено через 27 минут(ы):

    Так в Си нельзя делать:
    *chr_ptr = '0'; // And set it for correct ending selection
    Последний раз редактировалось payalnik; 09.04.2023 в 13:20.
    Всё будет хорошо

  8. #7
    Аватар для vadim_d
    Регистрация
    29.10.2006
    Адрес
    Санкт-Петербург
    Сообщений
    14,741
    Цитата Сообщение от payalnik Посмотреть сообщение
    PellesC
    Как-то довелось им пользоваться, но буквально один день, в деталях познать не успел

    Цитата Сообщение от payalnik Посмотреть сообщение
    Если число от 10 до 19, то вылетает с ошибкой
    Похоже это какая-то его рантаймовая ошибка, если число в консоли успевает написать, можете ее текст скопировать? В gcc под MinGW все прекрасно работает:
    Нажмите на изображение для увеличения. 

Название:	crow_cnt_02.png 
Просмотров:	69 
Размер:	16.1 Кб 
ID:	387627
    Цитата Сообщение от payalnik Посмотреть сообщение
    Так в Си нельзя делать:
    *chr_ptr = '0'; // And set it for correct ending selection
    Почему же? Массив и указатель на элемент массива - вещи в языке по сути одинаковые, поскольку элементы массива не объявлены константными (только для чтения), то есть полное право на их модификацию, что в коде и сделано. Да, надо быть достаточно осторожным, чтобы не напортачить (типа вылезти за пределы массива)
    Вадим

  9. #8
    Пожалуйста:

    Код:
    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
        unsigned long int num;
        printf("Введите число от 0 до 4294967295: ");
        scanf("%lu", &num);
        char *words[] = { "ноль", "одна", "две", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять", "десять", "одиннадцать", "двенадцать", "тринадцать", "четырнадцать", "пятнадцать", "шестнадцать", "семнадцать", "восемнадцать", "девятнадцать" };
        char *tens[] = { "ноль", "десять", "двадцать", "тридцать", "сорок", "пятьдесят", "шестьдесят", "семьдесят", "восемьдесят", "девяносто" };
        char *hundreds[] = { "ноль", "сто", "двести", "триста", "четыреста", "пятьсот", "шестьсот", "семьсот", "восемьсот", "девятьсот" };
        char *thousands[] = { "ноль", "одна тысяча", "две тысячи", "три тысячи", "четыре тысячи", "пять тысяч", "шесть тысяч", "семь тысяч", "восемь тысяч", "девять тысяч" };
        char *hundreds_thousands[] = { "ноль", "сто тысяч", "двести тысяч", "триста тысяч", "четыреста тысяч", "пятьсот тысяч", "шестьсот тысяч", "семьсот тысяч", "восемьсот тысяч", "девятьсот тысяч" };
        char *millions[] = { "ноль", "один миллион", "два миллиона", "три миллиона", "четыре миллиона", "пять миллионов", "шесть миллионов", "семь миллионов", "восемь миллионов", "девять миллионов" };
        char *hundreds_millions[] = { "ноль", "сто миллионов", "двести миллионов", "триста миллионов", "четыреста миллионов", "пятьсот миллионов", "шестьсот миллионов", "семьсот миллионов", "восемьсот миллионов", "девятьсот миллионов" };
        char *billions[] = { "ноль", "один миллиард", "два миллиарда", "три миллиарда", "четыре миллиарда", "пять миллиардов", "шесть миллиардов", "семь миллиардов", "восемь миллиардов", "девять миллиардов" };
        char *hundreds_billions[] = { "ноль", "сто миллиардов", "двести миллиардов", "триста миллиардов", "четыреста миллиардов", "пятьсот миллиардов", "шестьсот миллиардов", "семьсот миллиардов", "восемьсот миллиардов", "девятьсот миллиардов" };
        char result[100] = { 0 };
        char *crow = " ворон";
        int hundreds_billions_num, hundreds_millions_num, millions_num, hundreds_thousands_num, thousands_num, hundreds_num, tens_num, ones_num;
    
        hundreds_billions_num = num / 1000000000;
        hundreds_millions_num = (num - hundreds_billions_num * 1000000000) / 100000000;
        millions_num = (num - hundreds_billions_num * 1000000000 - hundreds_millions_num * 100000000) / 1000000;
        hundreds_thousands_num = (num - hundreds_billions_num * 1000000000 - hundreds_millions_num * 100000000 - millions_num * 1000000) / 100000;
        thousands_num = (num - hundreds_billions_num * 1000000000 - hundreds_millions_num * 100000000 - millions_num * 1000000 - hundreds_thousands_num * 100000) / 1000;
        hundreds_num = (num - hundreds_billions_num * 1000000000 - hundreds_millions_num * 100000000 - millions_num * 1000000 - hundreds_thousands_num * 100000 - thousands_num * 1000) / 100;
        tens_num = (num - hundreds_billions_num * 1000000000 - hundreds_millions_num * 100000000 - millions_num * 1000000 - hundreds_thousands_num * 100000 - thousands_num * 1000 - hundreds_num * 100) / 10;
        ones_num = num - hundreds_billions_num * 1000000000 - hundreds_millions_num * 100000000 - millions_num * 1000000 - hundreds_thousands_num * 100000 - thousands_num * 1000 - hundreds_num * 100 - tens_num * 10;
    
        if (num == 0)
        {
            printf("%s%s", words[0], crow);
            return 0;
        }
    
        if (hundreds_billions_num > 0)
        {
            strcat(result, hundreds_billions[hundreds_billions_num]);
            strcat(result, " ");
        }
    
        if (hundreds_millions_num > 0)
        {
            strcat(result, hundreds_millions[hundreds_millions_num]);
            strcat(result, " ");
        }
    
        if (millions_num > 0)
        {
            strcat(result, millions[millions_num]);
            strcat(result, " ");
        }
    
        if (hundreds_thousands_num > 0)
        {
            strcat(result, hundreds_thousands[hundreds_thousands_num]);
            strcat(result, " ");
        }
    
        if (thousands_num > 0)
        {
            strcat(result, thousands[thousands_num]);
            strcat(result, " ");
        }
    
        if (hundreds_num > 0)
        {
            strcat(result, hundreds[hundreds_num]);
            strcat(result, " ");
        }
    
        if (tens_num > 1)
        {
            strcat(result, tens[tens_num]);
            strcat(result, " ");
        }
    
        if (tens_num == 1)
        {
            strcat(result, words[10 + ones_num]);
            strcat(result, crow);
            printf("%s", result);
            return 0;
        }
    
        if (ones_num > 0)
        {
            strcat(result, words[ones_num]);
            strcat(result, crow);
        }
    
        printf("%s", result);
        return 0;
    }

  10. #9

    Регистрация
    01.07.2014
    Адрес
    Томск
    Сообщений
    439
    Позывной
    UA9HGC
    Вадим. Указатель только указывает на элемент в массиве, разрядность машины 16 бит тогда 2 байта. Если 32 4 байта. Смотрим в описании какой движок в среде программировании. У меня 10 винда а движок программирования 32. Так для примера. Жду вопросы.


  11. #10
    Аватар для vadim_d
    Регистрация
    29.10.2006
    Адрес
    Санкт-Петербург
    Сообщений
    14,741
    Цитата Сообщение от NikB Посмотреть сообщение
    Пожалуйста:
    Спасибо, было бы лучше файл приложить, при копировании текста все вставленные форумом пробелы

    if (hundreds_billions_n um > 0)

    пришлось вылавливать руками по ошибкам компиляции
    Программа, работает, но с некоторым акцентом
    c:\Archive\CQHAM>cro w_0.exe
    Введите число от 0 до 4294967295: 0
    ноль ворон
    c:\Archive\CQHAM>cro w_0.exe
    Введите число от 0 до 4294967295: 3
    три ворон

    Цитата Сообщение от SafSerg Посмотреть сообщение
    Указатель только указывает на элемент в массиве, разрядность машины 16 бит тогда 2 байта. Если 32 4 байта
    Это длина самого указателя, тут речь шла о модификации элемента, на который он указывает, размер там в один байт (char), слово const при нем отсутствует, то есть элемент по такому указателю никто не запрещает модифицировать
    Вадим

Страница 1 из 7 1234 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 8
    Последнее сообщение: 19.06.2010, 12:10
  2. Программа RCA
    от RK4FB в разделе Для любителей КВ
    Ответов: 5
    Последнее сообщение: 01.12.2009, 23:18
  3. Программа CS-F3G
    от pms12 в разделе Программное обеспечение
    Ответов: 1
    Последнее сообщение: 15.08.2007, 13:12
  4. Программа для HYT TC 500
    от Вадим Казах в разделе Софт для мобильных устройств
    Ответов: 4
    Последнее сообщение: 24.07.2007, 10:24
  5. Программа для st-852
    от Mun в разделе Программное обеспечение
    Ответов: 2
    Последнее сообщение: 24.03.2006, 09:36

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •