#pascal
#паскаль
Вопрос:
Я новичок, и на данный момент мне нравится соревновательное программирование как способ обучения. У меня была задача ввести список слов и вывести его зашифрованным. Мой алгоритм прошел нормально, но моя проблема заключалась в том, как я ввел список имен. Я не знаю, смогу ли я указать ссылку на проблему, но я должен ввести это один раз :
4
word
localization
internationalization
pneumonoultramicroscopicsilicovolcanoconiosis
и получаем этот результат
word
l10n
i18n
p43s
Но единственное, что мне удалось, это указать имена одно за другим, есть ли способ ввести все один раз, не рассматривая это как одну сплошную строку?
вот мой сценарий :
program A71;
uses wincrt;
var
word: String;
function correctname(word : String): Boolean;
var
i : Integer;
begin
correctname:= true;
for i:=1 to length(word) do
if not (upcase(word[i]) in ['A'..'Z']) then
correctname:= false;
end;
function Cryptname(var word : String): String;
var
wordcrypt: String;
begin
wordcrypt:= '';
str(length(word) - 2, wordcrypt);
Cryptname:= word[1] wordcrypt word[length(word)];
end;
begin
repeat
repeat
readln(word);
until correctname(word);
if correctname(word) and (length(word) > 10) then
writeln(Cryptname(word))
//writeln(word);
else
writeln(word);
//readkey();
until false;
end.
** Обновить : **
program A71;
uses wincrt;
type
tab = array[1..100] of String;
var
word: tab;
correctwords,n, i : Integer;
function correctname(word : tab; correctwords : Integer): Boolean;
var
i : Integer;
begin
correctname:= true;
i:= 0;
//for i:=1 to length(word[correctwords]) do
repeat
i:=i 1;
if not (upcase(word[correctwords][i]) in ['A'..'Z']) then
correctname:= false;
until not correctname or (i = length(word[correctwords]));
end;
procedure Cryptname(var word : tab; correctwords : Integer);
var
wordcrypt: String;
begin
//wordcrypt:= '';
str(length(word[correctwords]) - 2, wordcrypt);
word[correctwords]:= word[correctwords][1] wordcrypt word[correctwords][length(word)];
end;
begin
correctwords:=0;
readln(n);
repeat
readln(word[correctwords]);
if correctname(word, correctwords) then
correctwords:= correctwords 1;
until correctwords = n;
for i:= 1 to correctwords do
begin
if correctname(word, correctwords) and (length(word[correctwords]) > 10) then
begin
Cryptname(word, correctwords);
writeln(word[correctwords]);
end
else
writeln(word[correctwords]);
end;
readkey();
end.
Теперь мой код выходит из строя непосредственно при втором вводе.
Обновление, я решил это таким образом :
program A71;
uses wincrt;
type
tab = array[1..100] of String;
var
word: tab;
correctwords,n, i : Integer;
tester : String;
function correctname(tester : String): Boolean;
var
i : Integer;
begin
correctname:= true;
i:= 0;
//for i:=1 to length(word[correctwords]) do
repeat
i:=i 1;
if not (upcase(tester[i]) in ['A'..'Z']) then
correctname:= false;
until not correctname or (i = length(tester));
end;
procedure Cryptname(var wordcrypt : String);
var
wordcryptaux: String;
begin
wordcryptaux:= wordcrypt;
str(length(wordcrypt) - 2, wordcrypt);
wordcrypt:= wordcryptaux[1] wordcrypt wordcryptaux[length(wordcryptaux)];
end;
begin
correctwords:=0;
readln(n);
repeat
readln(tester);
if correctname(tester) then
correctwords:= correctwords 1;
word[correctwords]:= tester;
until correctwords = n;
for i:= 1 to correctwords do
begin
if correctname(word[i]) and (length(word[i]) > 10) then
begin
Cryptname(word[i]);
writeln(word[i]);
end
else
writeln(word[i]);
end;
readkey();
end.
Большое вам спасибо!
Комментарии:
1. Я не уверен, о чем вы спрашиваете. Вы хотите, чтобы вы могли нажимать
<Enter>
несколько раз (4), пока не «закончите»? Как программа узнает, что вы закончили? Всегда 4 строки? Может быть, пустая строка в конце?2. Кстати,
correctname
проверяет слово всегда до конца без необходимости. Вы должны прервать цикл, как только он примет значение false.wordcrypt:= '';
Необходимо ли?3. Первый ввод — это количество строк. Так что это зависит от ввода, я постараюсь заставить инструкцию работать в массиве и придумать обновление. да, wordcrypt должен быть инициализирован, так как я получаю предупреждение, если я этого не сделаю.
4. Узнайте, как включить проверку диапазона для вашего компилятора. Выведите переменные в строке сбоя непосредственно перед ней и запустите ее снова
5. @MarcovandeVoort Я решил это с помощью простого цикла for и массива (вы можете видеть это выше), но можете ли вы объяснить проверки диапазона? Я использую компилятор sublime и простой пакет FPC от Google. Спасибо за то, что вы отлично провели время, я не знаю, как начислить вам очки репутации, извините меня за это.
Ответ №1:
Я немного исправил и улучшил ваш код. Будьте осторожны, у вас if
в основной программе есть только одна строка, но отступ заставляет вас думать, что в ней две; Я также исправил это.
program A71;
uses wincrt;
type
tab = array[1..100] of String;
var
word: tab;
correctwords, n, i: Integer;
tester: String;
function correctname(inputword : String): Boolean;
var
i: Integer;
begin
for i:=1 to length(inputword[correctwords]) do
begin
if not (upcase(inputword[i]) in ['A'..'Z']) then
Exit(false);
end;
Exit(true);
end;
procedure Cryptname(var wordcrypt : String);
var
wordcryptaux: String;
begin
wordcryptaux:= wordcrypt;
str(length(wordcrypt) - 2, wordcrypt);
wordcrypt := wordcryptaux[1] wordcrypt wordcryptaux[length(wordcryptaux)];
end;
begin
correctwords:=0;
readln(n);
repeat
readln(tester);
if correctname(tester) then begin
Inc(correctwords);
word[correctwords]:= tester;
end;
until correctwords = n;
for i:=1 to correctwords do
begin
if correctname(word[i]) and (length(word[i]) > 10) then
Cryptname(word[i]);
writeln(word[i]);
end;
readkey();
end.