Способ ввода на Паскале

#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.