0 / 0 / 0
Регистрация: 27.09.2008
Сообщений: 9
|
|
1 | |
Записать количественное числительное, обозначающее n, в соответствующем падеже26.09.2008, 10:12. Показов 7563. Ответов 10
Метки нет Все метки)
(
Получил вот такую вот задачку, а как решить что то и ума не приложу, только мысли, ито не на компьютерном сленге ))) Вот текст задачи:
"Даны натуральное число n, символ s (n ≤1000, s – одна из букв и, р, д, в, т, п , указывающая падеж – именительный, родительный, дательный, винительный, творительный, предложный). Записать количественное числительное, обозначающее n, в соответствующем падеже". То есть получается, мы с клавы должны ввести число до 1000, потом ввсети букву, соответствующую падежу, и комп нам должен вывести это число в нужнм падеже ПИСЬМЕННО, то есть прописью... Помогите написать, спасибо.
0
|
26.09.2008, 10:12 | |
26.09.2008, 10:12 | |
Ответы с готовыми решениями:
10
Написать функцию, которая на вход принимает число, а на выходе выдает слово в падеже, соответствующем указанному числу Когда в англ. языке перед существительным ставится существительное в притяжательном падеже, а когда в общем падеже |
![]() 1513 / 780 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
|
|
26.09.2008, 11:00 | 2 |
Для решения этой задачи нужно просто прописать строки обозначающее цифры
например "один", "два","двадцать" и т.д. потом в операторе case выбираем нужное
0
|
Почетный модератор
![]() 64305 / 47602 / 32742
Регистрация: 18.05.2008
Сообщений: 115,181
|
|
26.09.2008, 13:01 | 3 |
Просто прописать все чере case будет наверное слишком трудоемко, ибо нужно будет прописать 162 варианта.
Всю программу сразу в голове не уложить, но думаю начать на так: 1. Изучить правило склонения количественных числительных. 2.Поскольку у Вас скорее всего с некоторыми, особенно в творительном падеже, возникнут затруднения, найти типа справочника и списать правильные склонения. 3. Занести их в текстовый файл по одному в строке, сначала все склонения слова один, потом два и так до девяти, это будет 54 строки. Затем тоже для слов от десять до девяносто(еще 54 строки) и для 100 - 900. 4. В программе создать три массива Ed, Des, Sot:array[1..9,1..6]of string[10] (может чуть больше, надо посмотреть самое длинное слово). Длину строки обязательно ограничить, а то может не хватить памяти. 5. Заполнить массивы, считывая данные построчно из файла for i:=1 to 9 do for j:=1 to 6 do readln(f,Ed[i,j]); Также Des, Sot 6. Число превратить в массив ch:array[1..4]of byte; или в строку, надо посмотреть, что удобней. 7. Символы падежей превратить в цифры 1..6 через case. 8. Дальше надо подумать, у нас есть названия массивов (разряд цифры, или индекс в массиве цифр), номер строки (цифра) и номер столбца (падеж), т. е мы можем вывести все число прописью в нужном падеже. Сначала проверяем цифру в тысячах (1 или ноль) и выводим if c1=0 then write('') else case падеж of 1: write('Одна тысяча'); 2: write('Одной тысячи'); и т. д. Затем остальные цифры if c2=0 ... else write Sot[цифра,падеж] и т.д. Это просто наброски, может что и не так. Начнете делать, по ходу разберетесь. p.S. Уже нашел ошибку. Число десять не надо, потому что если цифра во втором разряде 1, то числа читаются одиннадцать, двенадцать и т. д. Тут надо предусмотреть этот вариант if ch2=1 then ... else . Видимо первый массив нужно увеличить на 9 строк, а второй уменьшить на одну строку.
0
|
0 / 0 / 0
Регистрация: 27.09.2008
Сообщений: 9
|
|
26.09.2008, 16:20 [ТС] | 4 |
Эм, я по систаксису сейчас не помню, что мы там писали на лекции, в понедельник возьму тетрадь и выскажу предположения свои...Там вроде бы не так всё сложно, в понедельник примерно что к чему накину.
0
|
Почетный модератор
![]() 64305 / 47602 / 32742
Регистрация: 18.05.2008
Сообщений: 115,181
|
|
26.09.2008, 16:32 | 5 |
Ну вот мой вариант. В файле правда всего три падежа, сделал просто для тестирования, проверял на именительном и родительном, работает.
0
|
0 / 0 / 0
Регистрация: 27.09.2008
Сообщений: 9
|
|
27.09.2008, 11:32 [ТС] | 6 |
Что то не могу скачать, мой DM качает .php файл страницы....
0
|
Почетный модератор
![]() 64305 / 47602 / 32742
Регистрация: 18.05.2008
Сообщений: 115,181
|
|
27.09.2008, 11:35 | 7 |
Да не качайте вы этой дрянью, сохраните обычным порядком, архив то 1,22 кб.
0
|
0 / 0 / 0
Регистрация: 27.09.2008
Сообщений: 9
|
|
27.09.2008, 11:37 [ТС] | 8 |
Для этого надо умудриться убить DM ) Он перехватывает...
Убил, скачал. Пока нету времени друзья, в понедельник отпишусь, как гляну. Я просто только начинающий программист, учусь в ВУЗе, кто знает, может составлю вам тут в последствии компанию продвинутых)))
0
|
0 / 0 / 0
Регистрация: 27.09.2008
Сообщений: 9
|
|
29.09.2008, 07:26 [ТС] | 9 |
Просмотрел ход, прочитал мысль, план... Учитывая мои "новичевские" навыки, не совсем ясно, что вы делали до строки "Введите число меньше либо равное 1000".
Что обозначали такие переменные какTmas Cif, IndPad, i, j ? Вот что после CifRazn тоже мне не ясно. (вплоть до ввода числа N, и что такое CifRaz собственно тоже). Потом интересный момент, в IndPad, где расписаны все падежи 1000. Но что после - не ясно. Возник вопрос, по какому принципу мы выбираем нужное из блокнота (учитывая что там единицы сначала, потом десятки и сотни в конце - так?)...И в какой форме это выводится... Вот при выборе i (что такое?) - для десятков от 1 до 3, j от 1 до 8, а в сотнях от 1 до 3 и j от 1 до 9...Что это мы выбираем?? И совсем глупый вопрос, но какая строчка выводит ответ )) В моем понятии дожно быть что то типа "writeln ('OTBET: ', sot, des, edn)"....Вот это ключевые вопросы по данному проекту. И заметил фишку, что я не могу печатать по русски, слдоваетльно не могу ввести падеж ))) Как исправить не приложу и ума ) Извиняюсь за неграмотность, ибо я только учусь...
0
|
Почетный модератор
![]() 64305 / 47602 / 32742
Регистрация: 18.05.2008
Сообщений: 115,181
|
|
29.09.2008, 10:44 | 10 |
Честно говоря по заданию думал что Вы уже нормально владеете Паскалем и Вам нужна только наводка, однако случай почти клинический, поэтому объясняю все подробно, насколько умею.
Код
uses crt; type Tmas=array[1..4] of byte;{объявляем свой тип для записи числа по цифрам} var f:text; {он нужен для передачи параметра из процедуры } Edn:array[1..19,1..6] of string[15];{матрица склонений чисел от 1 до 19, 6-количество падежей} Des:array[1..8,1..6] of string[10]; {матрица склонений десятков от 20 до 90} Sot:array[1..9,1..6] of string[10];{матрица склонений сотен от 100 до 900} Chis:word; {число, которое вводим от 1 до 1000} Pad:char; {падеж, который вводим} Cif:Tmas; {фактически получаемый массив цифр после разложения числа} IndPad:byte; {индекс падежа, имен.-1, род-2, и т.д.} i,j:integer; {счетчики для циклов} procedure CifRaz(z:word;var x:Tmas); {процедура разложения числа на цифры} var k,c:byte; {z,x-формальные парметры, в программе } Код
[FONT='Courier New'][SIZE=2] {они меняются на Chis,Cif} q:Tmas; begin k:=0; while z>0 do begin c:=z mod 10;{отделяем последнюю цифру} inc(k); {считаем} q[k]:=c; {заносим в массив [4,3,2,1]} z:=z div 10; {берем число без последней цифры и все снова повторяем, пока число не кончится} end; for i:=1 to 4 do x[i]:=q[5-i]; {переворачиваем массив [1,2,3,4]} end; begin clrscr; repeat write('Введите натуральное число <=1000: '); readln(Chis); {вводим с клавиатуры число, проверяем подходит или нет, присваиваем его значение [/SIZE][/FONT] [FONT='Courier New'][SIZE=2]переменной Chis} until (Chis>0)and(Chis<=1000); CifRaz(Chis,Cif);{вызываем процедуру преобразования числа в массив цифр} repeat {также как и с числом, вводим первую букву падежа, если ввели не то, повторяем, введенный [/SIZE][/FONT] [FONT='Courier New'][SIZE=2]символ присваиваем переменной Pad} write('Введите падеж (и, р, д, в, т, п): '); readln(Pad); until (Pad='и')or(Pad='р')or(Pad='д')or(Pad='в')or(Pad='т')or(Pad='п'); case Pad of 'и':IndPad:=1; {присваиваем падежу символ, чтобы работать с матрицами} 'р':IndPad:=2; 'д':IndPad:=3; 'в':IndPad:=4; 'т':IndPad:=5; 'п':IndPad:=6; end; assign(f,'padez.txt'); {связываем наш файл со склонениями с переменной f} reset(f); {открываем его для чтения} for i:=1 to 19 do {записываем в матрицу "единиц" (хотя там еще 10-19)} for j:=1 to 6 do {нужно от 1 до 6, это я просто тренировался на трех падежах} readln(f,Edn[i,j]); {считаем первые 114 строк(если j=6)}[/SIZE][/FONT] [FONT='Courier New'][SIZE=2]for i:=1 to 8 do {далее записываем матрицу десятков, следующие 48 строк} for j:=1 to 6 do readln(f,Des[i,j]);[/SIZE][/FONT] [FONT='Courier New'][SIZE=2]for i:=1 to 9 do {далее записываем матрицу сотен, последние 54 строки} for j:=1 to 6 do readln(f,Sot[i,j]);[/SIZE][/FONT] [FONT='Courier New'][SIZE=2]writeln ('OTBET:'); {по просьбе зрителей}[/SIZE][/FONT] [FONT='Courier New'][SIZE=2]if Cif[1]=0 then write(''){смотрим первую цифру, если ноль – пустая строка} else case IndPad of {если единица, то в зависимости от падежа выводим соответствующее сообщение} 1:write('Одна тысяча '); 2:write('Одной тысячи '); 3:write('Одной тысяче '); 4:write('Одна тысяча '); 5:write('Одной тысяче '); 6:write('Одной тысяче '); end; {смотрим вторую цифру} if Cif[2]=0 then write(''){если ноль – пустая строка} else write(Sot[Cif[2],IndPad],' '); {если нет, берем из матрицы сотен значение из строки с номером=цифре, из [/SIZE][/FONT] [FONT='Courier New'][SIZE=2]столбца с индексом падежа}[/SIZE][/FONT] [FONT='Courier New'][SIZE=2]{смотрим третью цифру} if Cif[3]=0 then write('') {если ноль – пустая строка} else if (Cif[3]=1)and(Cif[4]<>0)then write(Edn[Cif[4]+10,IndPad]) {если=1, а четвертая цифра не 0 (11-19), берем из матрицы единиц значение из строки = четвертой [/SIZE][/FONT] [FONT='Courier New'][SIZE=2]цифре+10, из столбца с индексом падежа} else if (Cif[3]=1)and(Cif[4]=0)then write(Edn[10,IndPad]) {если четвертая ноль (10), то из строки 10} else write(Des[Cif[3]-1,IndPad],' ');{если не один, то в матрице десятков берем значение в строке на 1 [/SIZE][/FONT] [FONT='Courier New'][SIZE=2]меньше цифры №3} if (Cif[4]<>0)and(Cif[3]<>1) then write(Edn[Cif[4],IndPad]); {если ц4 не 0 и ц3 не 1, то в матрице единиц берем строку = цифре} close(f); {закрываем файл} readln {смотрим,жмем Enter, выходим из программы} end.[/SIZE][/FONT] Насчет writeln ('OTBET: ', sot, des, edn). Нам это не надо, так как мы выводим тысячи, сотни, десятки, единицы последовательно оператором write. Он выводит в строку, чтобы слова не слипались, пишем write(Des[Cif[3]-1,IndPad],' ');, т.е после тысяч, сотен и десятков добавляем пробел. Можно сделать и так, как вы пишете, но для этого нужно будет 4 лишних переменных строкового типа: var tys,sot,des,edn:string; а в тексте программы тогда везде вместо write(Des[Cif[3]-1,IndPad],' '); писать,например в этом случае, des:= Des[Cif[3]-1,IndPad] в других случаях соответственно, если хотите переделайте сами, это несложно. Тогдаконецбудет: writeln ('OTBET: ',tys, sot, des, edn); readln end. Слово ответ можно вставить в мой код, я вставил. Главое нормально создайте файл. Можно делать тремя способами: 1.Заполнить текстовый файл по русски один одного одному и т.д. Затем перекодировать его в каком нибудь редакторе, типа TextEncoder, и сохранить под именем padez в одной папке с программой. Это самый легкий путь. 2.Создать его в Паскале, тогда он сразу будет в DOS формате. 3.Самый долгий путь, написать как в п.1, ничего не делать, а в программе написать процедуру или функцию перекодировки, меняя коды символов в кодировке ANSI на кодировку ASCII по таблицам, в принципе три строчки кода. Добавлено через 5 минут 36 секунд P.S. Извините за бардак в сообщении, текст длинный, предварительный просмотр не включился, правка тоже не включается, попробую исправить через некоторое вркмя, если получится.
0
|
0 / 0 / 0
Регистрация: 27.09.2008
Сообщений: 9
|
|
29.09.2008, 15:14 [ТС] | 11 |
Спасибо за подробное изъяснение, по крайней мере Вы старались, а насколько это мне будет понятно, второй вопрос. Я завтра, а может послезавтра просмотрю ваш пост внимательно и попытаюсь разобраться (такое время из-за отдаленности, я с Владивостока, сегодня уже поздно, а завтра у меня день рождения, много хлопот, ну сами понимаете).
А мой уровень и уровень задания... Понимаете, я студент 1ого курса ВУЗа, учусь на программиста, было всего 2 лекции БЕЗ практических занятий, только теория и задачи. Это моя третья задача, признаться сам не ожидал столь сложную для новичка. Две предыдущие я с боем преодолел, а с этой...Ну вы понимаете, что при моем уровене без "толчка" это нереально. Еще раз спасибо, я отпишусь позже.
0
|
29.09.2008, 15:14 | |
29.09.2008, 15:14 | |
Помогаю со студенческими работами здесь
11
Запрос-количественное распределение
Определить процентное и количественное содержание заглавных букв в строке файла
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
![]() |
Опции темы | |
|
Новые блоги и статьи
![]() |
||||
Отключение отслеживания файла, занесенного в .gitignore в Git
hw_wired 10.02.2025
Git помогает следить за изменениями в проекте, но иногда требуется исключить определенные файлы из системы контроля версий. Это могут быть конфигурационные файлы с локальными настройками, временные. . .
|
Что такое use strict в JavaScript
hw_wired 10.02.2025
Директива use strict - способ перевода JavaScript-кода в строгий режим работы, который делает язык более безопасным и предсказуемым. Она появилась в ECMAScript 5 как ответ на многочисленные проблемы,. . .
|
Как в jQuery проверить, что элемент скрыт
hw_wired 10.02.2025
jQuery предоставляет несколько эффективных способов определить, скрыт элемент или отображается на странице. Самый простой метод использует специальные селекторы :hidden и :visible. Селектор :hidden. . .
|
Как проверить (check out) ветку Git в удаленном репозитории
hw_wired 10.02.2025
Проверка удаленной ветки в Git требует понимания нескольких базовых концепций и точного выполнения определенной последовательности действий. Для начала необходимо получить актуальную информацию о. . .
|
chucknorris в HTML и другие обозначения цветов
hw_wired 10.02.2025
HTML, как основной язык разметки веб-страниц, прошел длинный путь развития в плане работы с цветами. На заре развития веб-технологий разработчики могли использовать только базовый набор из 16. . .
|
Стек и куча: отличия и назначение
hw_wired 10.02.2025
Управление памятью - ключевой элемент работы любой программы. В современных языках программирования память делится на две основные области: стек и кучу. Каждая из них обладает уникальными. . .
|
Комментарии в JSON
hw_wired 10.02.2025
JSON - текстовый формат обмена данными, построенный на основе синтаксиса JavaScript. Этот формат отличается простотой, читаемостью и широкой поддержкой во всех современных языках программирования. . . .
|
Перезаписываем локальные файлы с помощью git pull
hw_wired 10.02.2025
Git pull - незаменимая команда для синхронизации локального репозитория с удаленным. При работе над проектом в команде разработчиков часто возникает необходимость получить актуальные изменения,. . .
|
Оператор --> в C++
hw_wired 10.02.2025
Оператор --> (называемый "spaceship operator" или оператор космического корабля) - важное нововведение в стандарте C++20, упрощающее реализацию операций сравнения в пользовательских типах данных. . . .
|
Отмена git add до коммита
hw_wired 10.02.2025
Git предлагает несколько методов для отмены индексации файлов перед созданием коммита. Разработчики часто сталкиваются с ситуацией, когда нужно убрать файлы из индекса, не теряя внесенные изменения в. . .
|