2016-07-28 3 views
0

У меня проблема с моим кодом. Он начинается нормально, но при запросе ввода ввода от пользователя в начале он не будет перемещаться по инструкции if. Как я могу это исправить. Я пробовал кучи, чтобы обойти это и, в конце концов, получить его для чтения данных, но постоянно говорю, что он недействителен.Код не перемещается Прочитано

PROGRAM AT3 (input, output); 
uses crt, math; 
CONST 
    band6 = 90; 
    band5 = 80; 
    band4 = 70; 
    band3 = 60; 
    band2 = 50; 
VAR 
    Studname : array of string; 
    studmark : array of integer; 
    flag : boolean; 
    studinfo : text; 
    input : string; 
    count : integer; 
    num : integer; 
     input2: integer; 
    highmark, lowmark : integer; 
    median, average : integer; 

BEGIN 
    lowmark := 100; 
    highmark := 0; 
    median := 0; 
    ASSIGN (Studinfo, 'ExamResults.txt'); 
    flag := false; 
    WRITELN('welcome to the Band generator.'); 
     WRITELN('To enter student results, please enter the number of students. To see class statistics, please type zzz. To clear the screen type clear screen. And to exit the program, type exit'); 
    While flag = false DO 
     ReadLN (input); 
     IF input = 'zzz' THEN 
      WHILE not EOF(Studinfo) DO 
      BEGIN 
       WRITELN(studinfo); 
      END; 
     IF input = 'exit' THEN 
      Flag := true; 
       IF input = 'clear screen' THEN 
         CLRSCR 
       ELSE 
        if input2 <> 0 THEN 
         num := input2 
       ELSE 
       WRITELN('Please enter a valid number.'); 
     FOR count := 0 to num-1 DO 
      BEGIN 
      WRITELN('Please enter name of student', count); 
      read(studname[count]); 
      WRITE(studinfo, studname[count]); 
      WRITELN('Please enter mark of student', count, 'out of 100 (nearest whole number)'); 
      read(studmark[count]);    write(studinfo, studmark[count]); 
      IF studmark[count] >=band6 THEN 
       WRITELN(studinfo, 'band6'); 
      IF studmark[count] >=band5 THEN 
       WRITELN(studinfo, 'band5'); 
      IF studmark[count] >=band4 THEN 
       WRITELN(studinfo, 'band4'); 
      IF studmark[count] >=band3 THEN 
       WRITELN(studinfo, 'band3'); 
      IF studmark[count] >=band2 THEN 
       WRITELN(studinfo, 'band2'); 
      IF studmark[count] <band2 THEN 
       WRITELN(studinfo, 'band1'); 
      IF studmark[count] >= highmark THEN 
       highmark := studmark[count]; 
      IF studmark[count] <= lowmark THEN 
       lowmark := studmark[count]; 
      END; 
     median := highmark MOD 2; 

    CLOSE(studinfo); 
END. 
+0

«он не будет двигаться на, если заявление» Какой 'if' заявление вы имеете в виду именно? Кстати, есть еще несколько проблем с вашим кодом, например. ваш «Assign (Studinfo,« ExamResults.txt »)» должен немедленно следовать «Rewrite (Studinfo)». Кроме того, какую версию Pascal вы используете? – MartynA

+0

Хммм ... этот код выглядит странно похожим на код, написанный пользователем ** LeCarloVC ** (а затем удаленный снова), вчера. У него также были те же проблемы и эта вещь 'if mark/band'. Также используются ключевые слова в верхнем регистре (большую часть времени) и даже этот '' zzz'' = конец идеи программы. –

+0

Только отступы не определяют блоки в Паскале. Вам нужны 'begin' и' end' для блоков с несколькими операторами. – lurker

ответ

2

Вопросы, подобные этому, часто привлекают такой комментарий, как «SO не является домашним заданием ». Этот q немного исключителен, потому что нет вежливого способа, я могу представить , чтобы описать его. У него есть все признаки того, что он был написан кем-то, кто действительно не знает, что они делают, но не отчаивайтесь, мы все были новичками!

Я не собираюсь переписывать весь ваш код для вас - потому что вы ничего не узнаете от этого, но следующее должно по крайней мере дать вам функциональный основной цикл, который вы затем можете заполнить самостоятельно и при необходимости приукрасить ,

Главное, что я исправил, это последовательность действий в цикле - оригинал был, как говорится, мягкой путаницей. Я добавил различные комментарии, заключенные в фигурные скобки {}. Существует более свежий стиль комментариев, который использует //, но я не знаю, какой вкус из Pascal вы используете.

Код:

const 
    band6 = 90; 
    band5 = 80; 
    band4 = 70; 
    band3 = 60; 
    band2 = 50; 
    ArraySize = 20; { to set explicit array sizes } 
var 
    studname : array[1..ArraySize] of string; 
    studmark : array[1..ArraySize] of integer; 
    flag : boolean; 
    studinfo : text; 
    kbdinput : string; { to avoid name clash with program Input param} 
    count : integer; 
    num : integer; 
    {input2: integer; not used} 
    highmark, 
    lowmark : integer; 
    median, average : integer; 

begin 
    lowmark := 100; 
    highmark := 0; 
    median := 0; 
    assign (studinfo, 'c:\temp\examresults.txt'); { always use full path for file name } 
    Rewrite(studinfo); { set studinfo in the state to allow writing to the file} 

    flag := false; 
    writeln('welcome to the band generator.'); 
     writeln('to enter student results, please enter the number of students when prompted.'); 
    while flag = false do 
    begin 
     write('please enter a valid number of students. '); 
     readln(num); 
     for count := 1 to num do { not change of start and stop values} 
     begin 
      write('please enter name of student #', count, ' followed by [Enter] '); 
      readln(studname[count]); 
      write(studinfo, studname[count]); 

      write('please enter mark of student #', count, ' out of 100 (nearest whole number) followed by [Enter] '); 
      readln(studmark[count]); 
      write(studinfo, studmark[count]); 
     end; 
{ 
      if studmark[count] >=band6 then 
       writeln(studinfo, 'band6'); 
      if studmark[count] >=band5 then 
       writeln(studinfo, 'band5'); 
      if studmark[count] >=band4 then 
       writeln(studinfo, 'band4'); 
      if studmark[count] >=band3 then 
       writeln(studinfo, 'band3'); 
      if studmark[count] >=band2 then 
       writeln(studinfo, 'band2'); 
      if studmark[count] <band2 then 
       writeln(studinfo, 'band1'); 
      if studmark[count] >= highmark then 
       highmark := studmark[count]; 
      if studmark[count] <= lowmark then 
       lowmark := studmark[count]; 
      end; 
     median := highmark mod 2; 
} 

     writeln('to see class statistics, please type zzz. to clear the screen type zzz and to exit the program, type exit'); 
     readln (kbdinput); 
     if kbdinput = 'zzz' then 
     { The following does nothing useful 
      while not eof(studinfo) do 
      begin 
       writeln(studinfo); 
      end; 
     } 
     ; 
     if kbdinput = 'exit' then 
      flag := true 
     else 
     if kbdinput = 'clear screen' then 
      {clrscr;'} 

     close(studinfo); 
    end; 
end. 
1

Посмотрите на вашей линии:

While flag = false DO 
     ReadLN (input); 

Флаг никогда не ложь, так что читает навсегда. У вас проблемы с начальными/конечными блоками.

+0

'Flag' всегда« ложь », вы имеете в виду. Но 'if input = 'exit'' имеет значение true. Это должно остановить цикл. –

+0

@RudyVelthuis В опубликованном коде OP 'if input = 'exit'' не входит в область' while'. В элементе 'while' отсутствует' begin'/'end'. – lurker

+1

@lurker: Ах да, еще одна ошибка в коде. Слишком много для кода, чтобы иметь смысл вообще. –