2016-08-15 2 views
0

J'ai essayé mais il me donne une erreur d'exécution 106.Comment obtenir l'entrée de plusieurs char et longint séparés par un espace en lecture seule()?

var 
    a, c: char; 
    b, d: longint; 
begin 
    read(a, b, c, d); 
    write(a, ' ', b, ' ', c, ' ', d); 
end. 

L'entrée est

A 1 B 2 
+1

Lire la chaîne, et l'analyser –

+0

@DavidHeffernan, ok je vais l'essayer. – Yusufmm

+0

Vous avez besoin d'une fonction qui divise les chaînes sur les espaces. Un websearch révélera plusieurs de ces fonctions. –

Répondre

1

Comme @DavidHeffernan a commenté, et comme expliqué @lurker, votre code ne fonctionnera pas en l'état .

En supposant que vous avez une la version FreePascal qui connaît le type TStringList dans l'unité Classes (Je suppose que tous les récents ne), vous pouvez effectuer les opérations suivantes:

uses 
    Classes, SysUtils; 

procedure Test; 
var 
    a, c: Char; 
    b, d: Longint; 
    s: string; 
    sl: TStringList; 
begin 
    sl := TStringList.Create; 
    try 
    Writeln('Enter a char, a number, a char and a number again, separated by spaces:'); 
    // Read entire line 
    Readln(s); 

    // Split s into four entries in the string list 
    sl.Delimiter := ' '; 
    sl.DelimitedText := s; 
    if sl.Count >= 4 then 
    begin 
     a := sl[0][1];   // first string item, convert to char 
     b := StrToInt(sl[1]); // second string item, convert to integer 
     c := sl[2][1];   // third string item, convert to char 
     d := StrToInt(sl[3]); // fourth string item, convert to integer 
    end; 
    finally 
    sl.Free; 
    end; 
    Writeln(a, ' ', b, ' ', c, ' ', d); 
end; 

begin 
    Test; 
end. 

Vous devriez probablement ajouter le contrôle d'erreur pour la Si vous obtenez une mauvaise entrée, et peut-être utiliser TryStrToInt au lieu de StrToInt, mais je vais laisser cela comme un exercice. Comme @lurker l'a dit, dans votre question, vous essayez de lire les Chars, ce qui cause des problèmes, car par exemple un espace et une tabulation sont aussi des Chars, donc les délimiteurs d'espace ne fonctionnent pas comme prévu. Cela va gâcher toute la saisie. La seule façon d'obtenir ces éléments est de lire toute la chaîne puis de l'analyser (la diviser).

Si votre version de FreePascal a une unité StrUtils avec une fonction SplitString, vous pouvez l'utiliser à la place de TStringList. Il divise la chaîne en utilisant un délimiteur donné (ici ' ') dans un tableau dynamique. C'est peut-être un peu plus simple, mais pas beaucoup.

+0

J'utilise Free Pascal Compiler version 3.0.0, lorsque vous essayez d'exécuter votre code, il déclenche une erreur sur les lignes 'try' et' finally'. Parce que je commence juste à apprendre en utilisant pascal, je ne sais pas comment le réparer, donc j'ai supprimé ces lignes et cela a fonctionné. Merci. – Yusufmm

+0

Ajouter {$ mode delpihi} en haut pour mettre le compilateur en mode Delphi ou compiler avec -Sd –

+0

@Marco: n'est-ce pas que FreePascal a try-finally, ou fonctionne-t-il différemment? –

-1

Je l'ai essayé et j'ai travaillé mais il a besoin de plus de variables inutilisées.

var 
    a, c: char; 
    b, d: char; 
    e, f, g, h: char; // take care of space 
    p, q: char; 
    x, y: longint; 
begin 
    read(a, b, c, d, e, f, g, h); 
    p := a; 
    q := e; 
    x := ord(c) - 48; 
    y := ord(g) - 48; 
    write(p, ' ', x + 1, ' ', q, ' ', y + 1); 
end. 
+0

Vous pouvez essayer d'utiliser un grand nombre de variables, puis peut-être appuyer sur le bon numéro, alors certaines d'entre elles sont remplies de contenu significatif, mais ce n'est pas la programmation. Vous devriez savoir à quoi vous attendre. N'utilisez pas Char pour lire l'espace, car si quelqu'un entre 'A 107 B 2', éventuellement avec quelques espaces supplémentaires, alors vous n'avez pas de chance. Ne fais pas ça. "Cela fonctionne avec cette entrée" n'est jamais une bonne excuse pour faire les choses de la mauvaise façon. –

+1

Je me demande vraiment qui a upvoted cette réponse.Ajouter des variables jusqu'à ce qu'elles correspondent à une seule entrée n'est pas une bonne programmation. –

+0

Vous pouvez forcer ceci à travailler avec les variables supplémentaires, mais c'est une très mauvaise approche car cela rend le code assez fragile. Divers légers changements dans le format d'entrée peuvent entraîner l'échec du code. – lurker