На этом форуме отвечают на конкретные вопросы. Фраза «я не понимаю, как решать» — это не вопрос. На вопрос «как решить задачу №X» вас отошлют к материалам сайта kpolyakov.spb.ru. За бессвязный поток слов и неспособность формулировать свои мысли — бан.

Если у вас не сходится ответ на какую-то задачу, пожалуйста сразу представляйте свое «правильное» решение.
Программы "заворачивайте" в тэг [pre2]...[/pre2], при этом сохраняются все отступы и применяется моноширинный шрифт. Если у вас используется сочетание "[i]" для обозначения элемента массива или строки, ставьте пробел после открывающей скобки. Иначе система выделит все дальнейшее курсивом.

Для регистрации на форуме щелкните по ссылке «Вход-регистрация» вверху страницы. В открывшееся окошко «ник» введите свою фамилию на русском языке (например, Иванов). В окошко «пароль» введите придуманный вами пароль, состоящий из латинских букв и цифр. Поставьте галочку в окошке «зарегистрироваться, я новый участник» и нажмите кнопку «ОК».

АвторСообщение
постоянный участник




Сообщение: 44
ссылка на сообщение  Отправлено: 05.05.12 13:25. Заголовок: C4 диагностическая работа



 цитата:
Вам необходимо написать программу распознавания чисел, записанных прописью. Сначала на вход программе подается обучающий блок, состоящий из 27 строк. Первые 9 строк содержат слова «один», «два», …, «девять», следующие 9 строк - слова «одиннадцать», «двенадцать», …, «девятнадцать», следующие 9 строк слова - слова «десять», «двадцать», …, «девяносто». Все слова записаны маленькими русскими буквами без лишних пробелов в начале и в конце строки.
Затем на вход программе подается число N – количество записей, которые необходимо обработать. Следующие N строк содержат записанные словами числа. Каждое число записано по-русски, маленькими буквами, без ошибок. Если число состоит из нескольких слов, между словами находится ровно один пробел, лишних пробелов в начале и конце строк нет.
Напишите эффективную программу, которая определяет сумму тех чисел, которые находятся в интервале от 1 до 99.
Размер памяти, которую использует Ваша программа, не должен зависеть от длины исходного списка.
Перед текстом программы кратко опишите используемый вами алгоритм решения задачи.
Пример входных данных (обучающий блок показан в примере с сокращениями):
один
два
……
девяносто
5
двадцать восемь
два миллиона
четырнадцать
сто двадцать три
тысяча девятьсот восемьдесят четыре
Пример выходных данных для приведенного выше примера входных данных:
42


решение
Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 12 [только новые]


Администратор




Сообщение: 296
ссылка на сообщение  Отправлено: 05.05.12 14:04. Заголовок: oval пишет: while (s..


oval пишет:
 цитата:
while (s1<> word[j]) and (j<=27) do j:=j+1;

Здесь нужно поменять местами условия, иначе получим выход за границы массива.

Самое главное: на тестовом примере программа выдает 149 вместо 42.

___________________________________________________
Имей мужество пользоваться собственным умом. (И. Кант)
Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Сообщение: 45
ссылка на сообщение  Отправлено: 05.05.12 14:35. Заголовок: Поляков пишет: oval..


Поляков пишет:

 цитата:
oval пишет:
цитата:
while (s1<> word[j]) and (j<=27) do j:=j+1;

Здесь нужно поменять местами условия, иначе получим выход за границы массива.


это да, не последнюю версию выложила :(
Поляков пишет:

 цитата:
Самое главное: на тестовом примере программа выдает 149 вместо 42.


42, еще раз проверила, ABCPascal чтение из файла.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Сообщение: 297
ссылка на сообщение  Отправлено: 05.05.12 17:59. Заголовок: oval пишет: 42, еще ..


oval пишет:
 цитата:
42, еще раз проверила, ABCPascal чтение из файла.

Да, приношу извинения. Ошибся при переводе на АЛГО (у него нет case).

Мне кажется, что понятнее вариант с функциями:
  for t:=1 to n do begin  
readln(s);
number := 0;
m := 1;
while m > 0 do begin
m := Pos(' ',s);
if m = 0 then s1 := s
else begin
s1 := Copy(s, 1, m-1);
Delete(s, 1, m);
end;
i := 1;
while (i <= 27) and (s1 <> word[ i]) do i:=i+1;
if i > 27 then begin m := 0; number := 0; end
else
if i < 19 then
number:=number + i + (i div 10)
else number:=number + (i-18)*10;
end;
sum:=sum+number;
end;
writeln(sum);


___________________________________________________
Имей мужество пользоваться собственным умом. (И. Кант)
Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Сообщение: 46
ссылка на сообщение  Отправлено: 05.05.12 19:28. Заголовок: Поляков пишет: Мне ..


Поляков пишет:

 цитата:
Мне кажется, что понятнее вариант с функциями:


возможно
а еще можно было бы добавить 28 буферный элемент, тогда условие цикл while (i <= 27) and (s1 <> word[ i]) do i:=i+1; работал бы при любом порядке условий

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Сообщение: 47
ссылка на сообщение  Отправлено: 05.05.12 19:53. Заголовок: этот вариант написал..


этот вариант написал мой ученик

 цитата:
var a: array [1..99] OF STRING; 
s:string;
sum,i,j,n:integer;
begin
{обнуляем}
for i:=1 to 9 do
readln(a[ i]);
for i:=11 to 19 do
readln(a[ i]);
i:=10;
while i<=90 do begin
readln (a[ i]);
i:=i+10;end;
for i:=2 to 9 do
for j:=1 to 9 do
a[10*i+j]:=a[10*i]+' '+a[j];
{построили полный алфавит}
readln (n); {читаем количество строк, которые надо обработать}
for i:=1 to n do begin
readln (s);
for j:=1 to 99 do
if s=a[j] then sum:=sum+j;
end;
writeln(sum);
end.



Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Сообщение: 298
ссылка на сообщение  Отправлено: 05.05.12 20:10. Заголовок: oval пишет: этот вар..


oval пишет:
 цитата:
этот вариант написал мой ученик

Нечто похожее рекомендуют и авторы. Но мне не нравится это решение, большой расход памяти на лишние элементы массива. Хотя по критериям - это 4 балла.

___________________________________________________
Имей мужество пользоваться собственным умом. (И. Кант)
Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Сообщение: 60
ссылка на сообщение  Отправлено: 06.05.12 21:05. Заголовок: Прошу прощения, но н..


Прошу прощения, но не пойму, почему в ответах ДР№2 на задание С4 используется оператор
j:=pos(line,' '); , а не оператор j:=pos(' ',line); ? Подскажите...

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Сообщение: 300
ссылка на сообщение  Отправлено: 09.05.12 11:26. Заголовок: tavabar пишет: почем..


tavabar пишет:
 цитата:
почему в ответах ДР№2 на задание С4 используется оператор
j:=pos(line,' '); , а не оператор j:=pos(' ',line); ?

Опечатка. В Си-подобных языках сначала указываем где ищем, а потом - то, что ищем.

___________________________________________________
Имей мужество пользоваться собственным умом. (И. Кант)
Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 1
ссылка на сообщение  Отправлено: 08.05.12 16:33. Заголовок: Здравствуйте. Оценит..


Здравствуйте. Оцените, пожалуйста, мое решение, которое кардинально отличается от того, что предлагается в КИМах:


 цитата:
program Bibba;
const u=90;
var k,i,N,z,p,sum,total:integer;
s,c:string;
A:array[1..u] of string;
begin
total:=0;
for i:=1 to u do A:='';
for i:=1 to 9 do readln(A);
for i:=11 to 19 do readln(A);
for i:=1 to 9 do readln(A[10*i]);
readln(n);
for i:=1 to n do begin;
readln(s);
sum:=0;
z:=0;
p:=pos(' ',s);
if p>0 then begin
c:=copy(s,1,p-1);
delete(s,1,p);
p:=pos(' ',s);
if p=0 then begin
for k:=1 to u do
if A[k]=c then begin
sum:=sum+k;
z:=z+1;
end;
for k:=1 to u do
if A[k]=s then begin
sum:=sum+k;
z:=z+1;
end;
if z=2 then total:=total+sum;
end;
end
else
for k:=1 to u do
if A[k]=s then total:=total+k;
end;
writeln(total);
end.



Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 2
ссылка на сообщение  Отправлено: 08.05.12 16:38. Заголовок: Суть решение такова:..


Суть решение такова:

Введенный в начале учебный блок не подвергается изменениям. Затем в каждой нововведенной n-ой строке выполняется следующий алгоритм:

1)Ищется пробел
2)Если в слове только ОДИН пробел, то строка делится на два слова, каждое из которых сравнивается с массивом А. Только если оба слова принадлежат массиву они прибавляются к сумме
3)Если в слове больше одного пробела - ничего не выполняется
4)Если в слове один пробел - проверяется принадлежность всей строки к массиву А.
5)В итоге выводится общая сумма

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Сообщение: 301
ссылка на сообщение  Отправлено: 09.05.12 11:29. Заголовок: Бибиков пишет: Оцени..


Бибиков пишет:
 цитата:
Оцените, пожалуйста, мое решение, которое кардинально отличается от того, что предлагается в КИМах:

Согласно критериям для этой задачи, это 4 балла.
Но решение какое-то половинчатое, недоделанное. Если выделять массив, то эффективнее строить полный словарь. Если разбирать строку по пробелам, то достаточно 27 элементов массива.


___________________________________________________
Имей мужество пользоваться собственным умом. (И. Кант)
Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 1
ссылка на сообщение  Отправлено: 26.05.12 15:35. Заголовок: Добрый вечер. Оценит..


Добрый вечер. Оцените, пожалуйста, мое решение (язык C++, компилятор MinGW)
Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 320
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет