2017-06-04 5 views
0

(Traduit de l'allemand à Englisch) Je besoin d'aide dans cet exercice:type String avec Exercice Pascal

Sujet: traitement chaîne L'utilisateur peut apporter des modifications simples à une phrase d'entrée.

conditions

Le programme affiche un menu pour l'utilisateur de sélectionner l'action suivante. Ceci est également affiché à nouveau une fois l'action terminée jusqu'à ce que l'utilisateur termine le programme (une boucle est donc nécessaire).

Le menu contient les éléments suivants, qui doivent être exécutées lorsque la lettre spécifiée est entrée:

A. Entrez la phrase

B. Déterminer le nombre de mots

C. Déterminer la nombre de caractères qui sont inférieurs à leur caractère de séquence

D. Remplacer tous les mots de la phrase avec leurs initiales en majuscules

X. fin

Si l'utilisateur entre une lettre différente, rien ne se passe ou le menu est sorti à nouveau.

Si l'option de menu A est sélectionnée, une invite est émise pour entrer un jeu qui est lu dans une variable de chaîne. Cette variable ne peut pas être modifiée par les actions des éléments de menu B, C et D! Peut-être. Une copie de l'ensemble doit être préparée au préalable dans une autre variable de chaîne.

Dans le point de menu B, le nombre de tous les mots du bloc doit être compté. Pour simplifier, vous pouvez supposer qu'il y a toujours un espace entre deux mots. Au début et à la fin de la phrase, il n'y a pas d'espaces. Le nombre de mots est sorti après le calcul (par exemple, "L'ensemble est de 4 mots").

Si l'utilisateur exécute l'élément de menu C, l'ensemble est traversé caractère par caractère, et pour chaque caractère, il est vérifié s'il est plus petit que son caractère final. Voici une simple comparaison de caractères (vous pouvez également écrire directement quelque chose comme '1' < 'd'). Le nombre de caractères ainsi trouvés est ensuite sorti (par exemple, "13 caractères trouvés dans la phrase sont inférieurs au caractère final").

Dans l'élément de menu D, la phrase est traversée et chaque mot qu'elle contient est remplacé par son caractère initial en majuscule. La capitalisation n'est bien sûr faite que si le premier caractère est une lettre, sinon le caractère reste inchangé. Vous pouvez supposer que la phrase ne commence jamais ou se termine avec un espace. Entre deux mots, il y a toujours exactement un espace et il devrait donc être entre les lettres initiales. Par exemple, de "123 bonne humeur" devient "1 G L".

Il n'est pas permis ici de réaliser une chaîne complètement neuve pièce par pièce! Au lieu de cela, vous devriez travailler dans une boucle sur une copie de la phrase originale avec pos, copier, longueur, supprimer et insérer! Il est également interdit de "rassembler" les caractères initiaux tout au début ou à la fin de la chaîne; Ceux-ci doivent être insérés directement dans la chaîne à la position du mot correspondant!

En outre, une chaîne n'est pas accessible au point de menu D, car le travail avec les sous-chaînes doit être explicité ici. Les éléments de menu B, C et D ne peuvent être sélectionnés que si un enregistrement a déjà été entré.Dans le cas contraire, rien ne se passe ou un message d'erreur est entré en entrant B, C ou D dans le menu et le menu est sorti à nouveau.

Chaque appel aux éléments de menu B, C ou D fonctionnera toujours sur l'ensemble d'origine entré par l'utilisateur et non sur un ensemble qui a déjà été modifié par des éléments de menu précédemment exécutés!

En entrant de nouveau dans l'élément de menu A, le bloc entré peut être écrasé par un nouveau.

Avec un 'X', l'utilisateur peut terminer le programme.

Utilisez n'importe où les fonctions de chaîne prédéfinies et ne l'écrivez pas vous-même avec des boucles de difficulté, etc.! Cependant, l'utilisation des fonctions strreplace ou reverseString est interdite!


Voilà mon travail jusqu'à présent, je n'ai que des problèmes avec la partie D:

 program Project2; 
     {$APPTYPE CONSOLE} 
     {$R *.res} 

     uses 
     System.SysUtils; 

     const 
      lz = ' '; 

     var 
    Satz: string; 
    Buchstabe: char; 
    i, p, j, zaehler2, index, count: integer; 

writeln('A) Write Sentence'); 
readln(Satz); 

     'D': 
     begin 
      index := 2; 
     insert(lz, Satz, length(Satz)+1); 
      count := (pos(lz,Satz)); 
      repeat 
      delete(Satz, index,(count - index)); 
      index := index + 2; 
      count := pos(lz,copy(Satz,index,(length(Satz)-index)))+index-1; 
      until ; 
     writeln(uppercase(Satz)); 
     end 
+0

Ce q semble très similaire à votre https://stackoverflow.com/questions/44247115/exercise-with-type-string-in-pascal, mais avec du code ajouté, ce qui correspond mieux à SO. Qu'est-ce qui fait que le point D vous cause des difficultés? Habituellement, les élèves trouvent que diviser l'entrée en mots est la partie difficile. La plupart des implémentations pascal incluent des fonctions pour convertir une chaîne en majuscules ou minuscules, et leur utilisation est triviale. Quelle implémentation pascal utilisez-vous? – MartynA

+0

Depuis que c'était fermé je ne pouvais pas ajouter un commentaire. J'ai des problèmes pour supprimer des lettres de chaque mot sans supprimer la première lettre, et avec la fin de la fonction "repeat" –

+0

Je pense avoir trouvé comment effacer les lettres (du second au dernier) dans chaque mot, mais je continue je ne sais pas comment "terminer" la fonction de répétition –

Répondre

0

Je suis heureux que vous avez trouvé votre propre solution, bien fait!

Pendant que vous avez fait, j'ai écrit la réponse ci-dessous et, comme je l'ai fini , je pensais que je posterai ici pour vous montrer une autre façon d'aller sur le problème de l'extraction mots d'une chaîne. Il ya des dizaines de façons de faire cette tâche, mais j'espère que celui que j'ai utilisé est assez facile à suivre. La raison pour laquelle vous avez eu un problème avec ceci est peut-être que vos expressions d'indexation de chaînes sont un peu trop compliquées. Je parie que si vous revenez à votre code dans 6 mois il vous faudra un certain temps pour comprendre ce qu'il est censé faire et plus longtemps pour dire si elle le fait réellement. La clé pour éviter des problèmes tels que est de casser votre code en mandrins qui sont plus faciles à suivre et plus faciles à tester. Donc, au lieu de simplement vous dire quelle devrait être votre condition repeat, je vais vous montrer un moyen qui est plus facile à suivre.

La première chose à faire est d'extraire un mot singulier de l'entrée. Donc, la première chose J'ai écrit est une fonction, ExtractFirstWord qui renvoie le premier mot dans la chaîne d'entrée, si l'entrée comprend des espaces ou non, et renvoie également une chaîne Remainder qui est ce qui reste ou la chaîne d'entrée après le premier mot (et tous les espaces immédiatement après ont été supprimés). Ceci est fait en utilisant quelques simples boucles while qui sont codées pour sauter les espaces principaux puis créer une chaîne à partir des caractères non-espace qui suivent.

code

const 
    lz = ' '; 

    var 
    Satz: string; 
    FirstWord : String; 
    Remainder : String; 

function ExtractFirstWord(const InputStr : String; var Remainder : String) : String; 
var 
    P : Integer; 
    WordStart : Integer; 
begin 
    Result := ''; 
    P := 1; 
    // The following skips over any spaces at the start of InputStr 
    while (P <= Length(InputStr)) and (InputStr[P] = lz) do 
    Inc(P); 

    // Now we know where the first word starts 
    WordStart := P; 

    // Now we can get the first word, if there is one 
    while (P <= Length(InputStr)) and (InputStr[P] <> lz) do 
    Inc(P); 
    Result := Copy(InputStr, WordStart, P - WordStart); 

    Remainder := Copy(InputStr, P, Length(InputStr)); 
    // the following is one way to remove spaces at the start of Remainder 
    while (Length(Remainder) > 0) and (Remainder[1] = lz) do 
    Delete(Remainder, 1, Length(lz)); 
    // instead you could do something simlar to the first `while` loop above 
end; 

begin 
    Satz := ' cat dog '; 
    repeat 
    FirstWord := ExtractFirstWord(Satz, Remainder); 
    FirstWord := UpperCase(FirstWord); 
    Satz := Remainder; 
    writeln('First word: ', FirstWord, ' remainder: ', Remainder); 
    until Remainder = ''; 
    readln; 
end. 

De cette façon particulière de le faire est pas un ajustement idéal avec les autres exigences spécifiées dans votre tâche, mais devrait être facilement adaptable à eux. Par exemple, la majuscule des mots pourrait être faite "en place" sur la chaîne d'entrée en mettant en majuscule le caractère courant de celle-ci dans la deuxième boucle While. Btw, si vous utilisez Delphi ou Free Pascal/Lazarus, il existe une manière beaucoup plus simple d'extraire les mots à partir d'une chaîne de caractères . Il utilise une TStringList.Essayez à la recherche dans l'aide en ligne et avoir une idée de comment vous pouvez l'utiliser pour faire le travail.

+0

En fait, nous ne pouvions utiliser que l'insertion, la copie, la suppression, la pos, la longueur. L'utilisation d'autres procédures, l'accès par chaîne (tel que Satz [i]) et la déclaration d'une nouvelle variable de type chaîne étaient interdites, et nous n'avons toujours pas appris à utiliser le genre de fonctions comme "ExtractFirstWord". –