Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ стороны света

Автор: Kristina20 26.05.2006 19:25

написать функцию с масивом, который содержит название сторон света:nord,east,south,west. Функция, полученное обозначение(1 или 2 буквы) переделывает в название направление стороны света.

Автор: pascal65536 27.05.2006 2:22

Какая-то лёгкая задачка.
В массив, сначала вводишь названия сторон света.
Пользователь вводит одну или две первые буквы.
Функция перебирает весь :-) массив и сравнивает с введёным пользователем словом.
Результатом работы функции будет название стороны света или сообщение о том, что такой стороны света не бывает.
Для сравнения можно использовать pos, как использовать, можно прочитать в help`e

Автор: RaV 27.05.2006 10:26

Можешь взять здесьПрикрепленный файл  SS.txt ( 350 байт ) Кол-во скачиваний: 476

Автор: Bokul 27.05.2006 10:58

function func (var ch : char): string;
const
ss : array [1..4] of string=('nord','west','east','south');
var k,i : integer;
begin
for i:=1 to 4 do
if pos(ch,ss[i])<>0 then
k:=i;
if k<>0 then
write(ss[k])
else write('Не существует такой стороны света');
end;

var
ch : char;

begin
read(ch);
func(ch);
end.


Читай внимательно
Цитата
полученное обозначение(1 или 2 буквы)

У тебе работает только с одной smile.gif

Автор: RaV 27.05.2006 11:27

Цитата(Bokul @ 27.05.2006 11:58) *

Не долго исправить! good.gif
function func (var ch : string{<---изменение}): string;
const
ss : array [1..4] of string=('nord','west','east','south');
var k,i : integer;
begin
k:=0;{<---изменение}
for i:=1 to 4 do
if pos(ch,ss[i])<>0 then
k:=i;
if k<>0 then
write(ss[k])
else write('Не существует такой стороны света');
end;

var
ch : string;{<---изменение}

begin
read(ch);
func(ch);
end.


k нужно обнулить, иначе там может быть не ноль

Автор: Bokul 27.05.2006 11:32

Вот функция, но она не правильно работает - возвращает название сторони только последней буквы str.

function world(str:string):string;
const mas:array[1..4] of string[5]=('nord',
'east',
'south',
'west');
var i,j:byte; buf:string;
begin
buf:='';
for i:=1 to length(str) do;
for j:=1 to 4 do
if str[i]=mas[j][1] then
buf:=buf+' '+mas[j];
world:=buf;
end;



А когда делаю такую проверку

const mas:array[1..4] of string[5]=('nord',
'east',
'south',
'west');
var i,j:byte; buf:string;
begin
buf:='';
for i:=1 to length(str) do;
begin
writeln('i = ',i);
readln;
for j:=1 to 4 do
if str[i]=mas[j][1] then
buf:=buf+' '+mas[j];
end;
world:=buf;
end;

то і выводиться только один раз и равняется length(str), даже когда длинна str больше 1.
Где ошибка?

Автор: Bokul 27.05.2006 11:53

RaV твоя прога имеет один недостаток - при вводе, например rd , она пичатает
nord, хотя такой сторонны не существует.

А теперь вопрос к автору: для чего вводить 2 буквы?
Я понял для того чтобы можна было выводить "промежуточные" стороны.
Например, если ты ввел "ne", то результат должен быть nord east.
Правильно?

Автор: RaV 27.05.2006 12:25

Вот они ошибки! smile.gif

function world(str:string):string;
const mas:array[1..4] of string[5]=('nord',
'east',
'south',
'west');
var i,j:byte; buf:string;
begin
buf:='';
for i:=1 to length(str) do{<----удалить эту строку }
for j:=1 to 4 do
if (str[1]=mas[j][1]) and (str[2]=mas[j][2]) then{<--Здесь изменено}
buf:=mas[j];
world:=buf;
end;


И все нормально будет.
Только если вводить 1 или 2 буквы!!!Иначе по первым двум будет выводить сторону света.

Автор: RaV 27.05.2006 12:36

Не долго исправить!

function func (var ch : string): string;
const
ss : array [1..4] of string=('nord','west','east','south');
var k,i : integer;
begin
k:=0;
for i:=1 to 4 do
if pos(ch,ss[i])=1{<-- изменение} then
k:=i;
if k<>0 then
write(ss[k])
else write('Не существует такой стороны света');
end;

var
ch : string;

begin
read(ch);
func(ch);
end.


Скорее всего 2 буквы предназначены именно для "промежуточной" стороны
текст программы с "промежуточной" стороной Прикрепленный файл  SS_new.txt ( 725 байт ) Кол-во скачиваний: 472

Автор: volvo 27.05.2006 14:05

RaV, вместо того, чтобы повторять все время:

Цитата(RaV @ 27.05.2006 8:36)
Не долго исправить!

возьми и исправь! У тебя программа (та, что в аттаче) по-прежнему содержит МИНИМУМ одну ошибку!!!

Не веришь? Введи 'nn' на запрос... Что получишь? 'nord nord'? Очень остроумно...

Вот вариант, который лишен этого недостатка:
Прикрепленный файл  north.pas ( 773 байт ) Кол-во скачиваний: 499


(хотя и здесь еще не все предусмотрено) no1.gif

Автор: Гость 27.05.2006 20:33

Bokul,ti vse praveljno ponjal,4to esli vvoditj 'ne',to na ekrane dolzno vivoditsa 'nord east'!!!!!!
Sapsibo vam vsem ogromnoe!!!!!!!!!vi mne namnogo obleg4ili ziznj!!!!!!!!!teperj,blagodorja va,ja uze pol ekzamena sdala!!!!!!!!СПАСИБО!!!!
PS:VOLVO ОТДЕЛЬНОЕ СПАСИБО,за все проги!!!!!!! wub.gif wub.gif wub.gif wub.gif

Автор: Bokul 27.05.2006 22:33

Я так понял что RaV исправил мою прогу по подобию своей, хотя
она должна искать

Цитата
"промежуточные" стороны.

Вопрос остается: где моя ошибка?

Автор: volvo 28.05.2006 3:02

Цитата(Bokul @ 27.05.2006 7:32)
Где ошибка?

blink.gif blink.gif
Цитата(Bokul @ 27.05.2006 7:32)

for i:=1 to length(str) do; { <--- Как ты думаешь, что ЗДЕСЬ делает точка с запятой ??? }
begin
...
end;

Автор: Bokul 28.05.2006 3:08

Цитата
for i:=1 to length(str) do; { <--- Как ты думаешь, что ЗДЕСЬ делает точка с запятой ??? }

Почему компилятор не ругается? blink.gif

Автор: volvo 28.05.2006 3:49

А с чего ругаться? Согласно синтаксису - все правильно... Мало ли, что ты делаешь? Может, тебе понадобился "пустой" цикл... Компилятор пропустил... Дальше - Begin ... End : везде, где допускается один оператор, допускается и блок операторов, взятый в операторные скобки... Тоже все по правилам...

Это такие ошибки - где компилятор - не помощник... smile.gif