Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Программа в Pascal (http://forum.oszone.net/showthread.php?t=148481)

asus a9rp 20-08-2009 22:27 1198792

Программа в Pascal
 
Я создавал программу как опрос. Вот она:
Код:

Uses Crt;
Var x, y: Integer;
 begin
  ClrScr;
  y:=0;
  Write ('Какой у Вас Windows? [XP - 1, Vista - 2] -> '); Readln (x);
  If  x=1 Then
  begin
    inc(y)
  end
  Else  If x=2 Then
  begin
    inc(y)
  end
  Else  Writeln ('Значение не верно! Учитывается как 0!');
  Writeln('Код: ',y);
  Readln;
 end.

Ну так вот. Есть "inc(y)" и добавляет к результату (коду) 1. Мне нужно, чтобы в определённых местах добавлялось 3, 10, 20, 400, 1000 и т.д. Помогите. Заранее спасибо.
Опыт у меня примерно двухнедельный :)

Сейчас программа выглядет так (ориентируйтесь на эту версию):
читать дальше »
Код:

Uses Crt;
Var x, y: Integer;
  begin
  TextBackGround(1); ClrScr;
  y:=0;
  Writeln ('Какой у Вас Windows?');
  Writeln ('');
  Writeln ('XP    -  1');
  Writeln ('Vista -  2');
  Writeln ('2000  -  3');
  Writeln ('Seven -  4');
  Writeln (''); Readln (x);
  case x of
  1:inc(y, 10);
  2:inc(y, 20);
  3:inc(y, 30);
  4:inc(y, 40);
  Else
      Writeln ('Значение не верно! Учитывается как 0!'); Readln;
  End;
  ClrScr;
  Writeln ('Какой у Вас Office?');
  Writeln ('');
  Writeln ('2003 -  1');
  Writeln ('2007 -  2');
  Writeln ('2010 -  3');
  Writeln (''); Readln (x);
  case x of
  1:inc(y);
  2:inc(y, 2);
  3:inc(y, 3);
  Else
      Writeln ('Значение не верно! Учитывается как 0!'); Readln;
  End;
  ClrScr;
  Writeln('');
  Writeln('Код: ',y);
  Readln;
 end.


BlackEric 20-08-2009 22:46 1198804

Используйте inc(y, 4);
Для уменьшения можно использовать dec();
Код:

If  x=1 Then
  begin
    inc(y)
  end
  Else  If x=2 Then
  begin
    inc(y)
  end

Эта конструкция по нормальному должна выглядеть так:
Код:

  case x of
  1:inc(y);
  2:inc(y);
  Else 
    Writeln ('Значение не верно! Учитывается как 0!');
  End;


asus a9rp 20-08-2009 22:54 1198815

BlackEric, Всё работает!!! Огромное спасибо!

asus a9rp 21-08-2009 00:43 1198917

У меня ещё вопрос. Если вот тут
Код:

Write ('Какой у Вас Windows? [XP - 1, Vista - 2] -> '); Readln (x);
ввести 1 или 2 - всё нормально, если другую цифру - код = 0, а если букву или символ - программа отключается. Как это изменить (тоже сделать нулевой код)?

И ещё один вопрос. Тоже тут. у меня операционки написаны в скобках, а я хочу в столбик. Я пробовал так:
Код:

Write ('Какой у Вас Windows?')
Write ('XP - 1')
Write ('Vista - 2')
Write ('-> '); Readln (x);

но не помогло. Было всё равно в строчку.

DillerInc 21-08-2009 00:51 1198925

Цитата:

Цитата asus a9rp
а я хочу в столбик »

...байты 0Dh и 0Ah в конец строки.
http://delphi.about.com/od/adptips2005/qt/crlf.htm

DedAlex 21-08-2009 01:53 1198995

Цитата:

Цитата asus a9rp
а я хочу в столбик »

Writeln вместо Write.

asus a9rp 21-08-2009 02:23 1199007

DedAlex, ой. Очепятка... :) Спасибо!

asus a9rp 21-08-2009 17:56 1199557

Ах да. Вот.
Цитата:

Цитата asus a9rp
У меня ещё вопрос. Если вот тут
Код:

Write ('Какой у Вас Windows? [XP - 1, Vista - 2] -> '); Readln (x);
ввести 1 или 2 - всё нормально, если другую цифру - код = 0, а если букву или символ - программа отключается. Как это изменить (тоже сделать нулевой код)? »

DillerInc, у меня Pascal а не Delphi. :)
DedAlex, да, всё работает. Ещё раз спасибо.

DillerInc 21-08-2009 19:21 1199625

Цитата:

Цитата asus a9rp
у меня Pascal а не Delphi »

...нет разницы в данном случае.
0Dh (hex) == 13 (dec) == CR == carriage return == возврат каретки
0Ah (hex) == 10 (dec) == LF == line feed == перенос строки
Функция WriteLn добавляет эти два байта в конец строки.Только в Дельфе это вроде как именуется признаком конца строки - EOLN - но суть та же.
Учите матчасть.

asus a9rp 21-08-2009 22:18 1199783

DillerInc, спасибо за разъяснение, но всёже вернёмся к моему вопросу. :)

BlackEric 22-08-2009 18:02 1200395

Цитата:

Цитата asus a9rp
У меня ещё вопрос. Если вот тут
Код:
Write ('Какой у Вас Windows? [XP - 1, Vista - 2] -> '); Readln (x);
ввести 1 или 2 - всё нормально, если другую цифру - код = 0, а если букву или символ - программа отключается. Как это изменить (тоже сделать нулевой код)? »

Переменную x описываем как char. Тогда она корректно прочитает любой символ, но проверку на то что ввели не число вы должны делать сами.

Я бы сделал как-то так:

Код:

readln(x);
case ord(x) of
ord(1): inc(y);
ord(2): inc(y);
else
writeln('Неверный ввод!');
end;

Этот алгоритм не идеален, но общая идея примерно такова.
Пробуйте.

asus a9rp 22-08-2009 18:52 1200466

Спасибо, ппробую.
Как char я её писал, но только на месте Integer, а дальше ничего не менял.

asus a9rp 22-08-2009 22:54 1200700

Ну и покачто последний вопрос. Можно ли моей программе поменять иконку (ну к примеру как папке)?

asus a9rp 23-08-2009 02:03 1200831

BlackEric, вылезла одна ошибка - нестыковка тута:
Код:

Uses Crt;
Var x, y: Char;
 begin
  TextBackGround(1); ClrScr;
  y:=0;
  Writeln ('Какой у Вас Windows?');

И пишет:
Цитата:

Цитата Pascal
Programm.pas(5,6) Error: Incompatible types: got "ShortInt" expected "Char"
Programm.pas(40) Fatal: There were 1 errors compiling module, stopping
Programm.pas(0) Fatal: Compilation aborted


BlackEric 23-08-2009 18:50 1201301

Цитата:

Цитата asus a9rp
y:=0; »

Вы же переменной символьного типа присваиваете число. Так нельзя.

asus a9rp 23-08-2009 21:00 1201408

А как иначе?

BlackEric 23-08-2009 21:14 1201419

asus a9rp, а что вы хотите сделать?
Где работаем числами, там integer, real, где строки там Char или string.

asus a9rp 23-08-2009 22:55 1201450

BlackEric, ладно, пусть будет как было. Я просто хотел испрасить отключение программы после ввода буквы, а не цифры.

BlackEric 24-08-2009 00:35 1201506

asus a9rp,
1. Вам ничего не мешает описать несколько переменных
var
x: char;
y: integer;
.....и т.д.
2. Почитайте по приведение типов.
Char ковертируется в Byte одной функцией chr.

asus a9rp 24-08-2009 12:28 1201795

Я прописал, читал про приведение типов, но всё равно не получилось. Ладно, оставим как есть.
Но я просто объясню свою идею:
В программе требуется ввести число, если я ввожу правильное, то всё нормально. Если введено другое число, то выводится соответствующая надпись. Если введена буква, то программа отключается. Мне нужно было, чтобы если введена буква была выведеня такая же надпись, как и при неправильном числе. Но вводить нужно не буквы, а цифры. Вот и всё. Но с этим закончим. У меня только вопрос:
Цитата:

Цитата asus a9rp
Можно ли моей программе поменять иконку (ну к примеру как папке)? »


Alan85 24-08-2009 18:12 1202086

паскаль делает программы для DOS - а их там никогда не было. В винде эта проблема решается созданием ярлыка (pif файл)где и задается иконка , при этом и сам exe видится с иконокой пока не удалишь pif файл. вроде так.
а вот пример который тебе может помочь в решении твоей задачи. Обрати внимание что char тоже можно сравнивать при помощи case...
Код:

program pnum;
var
num:char;
begin
writeln("Enter number 1 or 2");
readln(x);
case x of
 '1': writeln('1');
 '2':writeln('2');
 else writeln('error');
end;
end.


asus a9rp 24-08-2009 22:29 1202254

Не получилось. За информацию про иконки - спасибо, а с этим - провал.
Хорошо. Раз все так хотят мне помочь, то (что бы всё получилось, а то у меня всё никак не выходит) переделайте пожалуйста мою программу так, она не отключалась.
Программа содержится в первом сообщении ниже.

asus a9rp 03-09-2009 20:02 1210725

Вот ещё вопрос. Как сделать так, что-бы введённое человеком число добавлялось в код? Т.е. Задаётся вопрос с ответом-числом, человек вводит своё число и оно добавляктся к сумме-коду. И вопрос к этому же. Как сделать, что-бы это число могло быть увеличено в 10, 100, 1000 раз. К примеру. Введено число 55, а мне надо 5500.

BlackEric 04-09-2009 12:35 1211318

asus a9rp, сложить или умножить обычно помогает

asus a9rp 05-09-2009 00:02 1211875

BlackEric, ну, вообще логично, но как это прописать?
(1:??? (y, 10))

lxa85 05-09-2009 11:51 1212008

asus a9rp,
Код:

var
  summator: integer; // Переменная накопления суммы
  A:integer;  // Число
  k:integer; // Коэфициент умножения 10, 100, 1000 ...
begin
  summator:=0;
  readln(A);
  A:=k*A;
  while A<>0 do
    begin
    summator:=summator+A;
    readln(A);
    A:=k*A;
    end;
  writeln(summator);
end.

Или я не правильно понял вопрос?

BlackEric 05-09-2009 12:42 1212026

asus a9rp, воьмите _любую_ книгу по паскалю и прочитайте первые 3-4 главы. Времени съэкономите уйму.

asus a9rp 05-09-2009 20:04 1212260

lxa85, не совсем то. Но я это решил:
Код:

Uses CRT;
Var x, y, z, k, a: Integer;
 BEGIN
  ClrScr;
  z:=10;
  k:=100;
  Write ('Number'); Readln (x);
  y:=x*z;
  Writeln (y);
  Readln;
  ClrScr;
  Write ('Number 2'); Readln (x);
  a:=x*k;
  Writeln (a);
  Readln;
 end.

BlackEric, я - сомоучка. Я занимаюсь программированием не профессионально, а для того, что бы написать одну программу. И такой литературы у меня нет. А покупать из-за одной программы, тем более в наше время - не охота. Чем тратить деньги, лучше спросить у знающих людей. Они и разъяснят если что. :) :oszone:

lxa85 05-09-2009 21:04 1212291

Цитата:

Цитата asus a9rp
Чем тратить деньги, лучше спросить у знающих людей. Они и разъяснят если что. »

Не вздумай повторять эту фразу где-либо еще, ибо твой авторитет упадет ниже некуда!
Купи(найди, скачай) книгу. Здесь не школа, и самостоятельное исследование задач приветствуется. Знающим только приятно будет. А рассказывать главы учебников тратя свое время ...
Надеюсь ты понял. :)

asus a9rp 08-09-2009 00:06 1213729

lxa85, понял. Я просто имел в виду, что если что-то будет не понятно, то здесь объяснят, что и как, а книга не сможет объяснить непонятное. Она ведь говорить не может.

asus a9rp 14-09-2009 20:56 1218987

У меня ещё один вопрос появился. Поидее последний. У моей программы теперь последующий вопрос должен зависить от предыдущего. Я пробовал так:
читать дальше »
Код:

Uses Crt;
Var a, b, y, z: Integer;
  begin
  TextBackGround(1); ClrScr;
  a:=0; b:=0; y:=0; z:=0;
  ClrScr;
  Writeln ('?');
  Writeln ('');
  Writeln ('1');
  Writeln ('2');
  Writeln (''); Readln (y);
  case y of
  1:inc(a, 10);
  2:inc(a, 20);
  If a=10 Then
    begin
    ClrScr;
    Writeln ('?');
    Writeln ('');
    Writeln ('1');
    Writeln ('2');
    Writeln (''); Readln (y);
    end;
  case y of
    1:inc(b, 1);
    2:inc(b, 2);
  If a=20 Then
  begin
  ClrScr;
  Writeln ('?');
  Writeln ('');
  Writeln ('1');
  Writeln ('2');
  Writeln (''); Readln (y);
  case y of
  1:inc(b, 1);
  2:inc(b, 2);
  z:=a+b;
  ClrScr;
  Writeln('= ',z);
  Readln;
 end.


Он жалуется на "If a=10 Then". Как это прописать иначе, что-бы всё было нормально?

lxa85 14-09-2009 22:01 1219048

asus a9rp, на память не помню, но проверь конструкцию
case <переменная> of
Операторные скобки какие? end case; помоему нужен. Help тебя спасет.
Код:

var Item:Integer;
begin
readln(Item);
case Item of
    1: Writeln('1');
    2: Writeln('2');
    else: witeln('not 1 or 2');
end case;
end.

Т.е. ты должен четко отделить оператор множественного выбора case от оператора условия if
Цитата:

Цитата asus a9rp
Он жалуется на "If a=10 Then" »

Как именно жалуется?

По алгоритму, ИМХО сложновато для анализа "на вскидку", одно-буквенные переменные мешают анализу. Отсутствие комментариев тоже не способствует.

Alan85 14-09-2009 22:02 1219051

http://www.pascaler.ru/pascal/constructions/uslovie/4/
Блок case должен заканчиваться end;
Код:

case y of
  1:inc(a, 10);
  2:inc(a, 20); end;
  If a=10 Then
    begin
    ClrScr;
    Writeln ('?');
    Writeln ('');
    Writeln ('1');
    Writeln ('2');
    Writeln (''); Readln (y);
    end;


asus a9rp 14-09-2009 22:52 1219097

Вложений: 65535
Alan85, Получилось, но теперь ещё одно.

Alan85 15-09-2009 06:58 1219249

Цитата:

Цитата asus a9rp
If a=20 Then
begin
ClrScr;
Writeln ('?');
Writeln ('');
Writeln ('1');
Writeln ('2');
Writeln ('');
Readln (y); »

тут end; в конце забыл

asus a9rp 15-09-2009 09:36 1219307

Спасибо, тепреть всё в порядке.... за исключением одного. В первом вопросе ответ 1, во втором - 1, но в конце (где должно быль 10+1=11) выводится 12. А если ответы 2 и 2, то в конце - 24, а не 22.

П.С. Программа теперь выдлядет так:
читать дальше »
Код:

Uses Crt;
Var a, b, y, z: Integer;
  begin
  TextBackGround(1); ClrScr;
  a:=0; b:=0; y:=0; z:=0;
  ClrScr;
  Writeln ('?');
  Writeln ('');
  Writeln ('10');
  Writeln ('20');
  Writeln ('');
  Readln (y);
  case y of
  1:inc(a, 10);
  2:inc(a, 20);
  end;
  If a=10 Then
    begin
    ClrScr;
    Writeln ('?');
    Writeln ('');
    Writeln ('1');
    Writeln ('2');
    Writeln (''); Readln (y);
    end;
  case y of
    1:inc(b, 1);
    2:inc(b, 2);
    end;
  If a=20 Then
  begin
  ClrScr;
  Writeln ('?');
  Writeln ('');
  Writeln ('1');
  Writeln ('2');
  Writeln ('');
  Readln (y);
  end;
  case y of
  1:inc(b, 1);
  2:inc(b, 2);
  end;
  z:=a+b;
  ClrScr;
  Writeln('= ',z);
  Readln;
 end.


lxa85 15-09-2009 15:00 1219506

asus a9rp, расписываю твой код по структурам, убирая лишнее. У тебя просто идет нарушение операторных скобок
Код:

Uses Crt;
Var a, b, y, z: Integer;
  begin
//инициализация переменных
  a:=0; b:=0; y:=0; z:=0;
  ClrScr;
//ввод  Y
  Readln (y);
  case y of --------начало case
  1:inc(a, 10);
  2:inc(a, 20);
  end; ------------- конец case
------------------------------------------------------------------------------------------------------- 
 If a=10 Then
    begin -------------------------------------------------
    Writeln (''); Readln (y);
    end; --------------------------------------------------
---------if Кончился здесь! --------
------------не зависимый от if a=10 блок, т.е. тело программы --------------
  case y of
    1:inc(b, 1);
    2:inc(b, 2);
    end;

----------------------------------
-----второй if
  If a=20 Then    begin
  ClrScr;
  Readln (y);
  end;
-------------------------------
----y от второго if тут не учитывается ---------------
  case y of
  1:inc(b, 1);
  2:inc(b, 2);         
  end;

---------------------------
-------дальше прочие действия---------
  z:=a+b;
  ClrScr;
  Writeln('= ',z);
  Readln;
 end.

выделенные куски повторяются. С тем же успехом их можно было написать вместе. if a = ___ на них не влияет.

p.s. потом добавлю наглядную схему

asus a9rp 16-09-2009 00:36 1219893

Всё равно получилоссь то же. А Вы не могли бы просто взять мою программу и отредактировать без коментариев (что-бы скопировав и вставив он запустилась). И если есть возможность, то проверьте её, поделуйса, что-бы съэкономить время. Буду очень признателен.

lxa85 16-09-2009 01:04 1219904

Cтуденчество, совсем думать обленилось! :(
Исправленная версия

Код:

Uses Crt;
Var a, b, y, z: Integer;
  begin
// инициализация переменных
    TextBackGround(1);
    a:=0; b:=0; y:=0; z:=0;
    ClrScr;
//запрашиваем первый ввод
    Writeln ('?'); Writeln (''); Writeln ('10'); Writeln ('20'); Writeln ('');
    Readln (y);
//смотрим что с ним делать
    case y of 
          1:inc(a, 10);
          2:inc(a, 20);
    end; //case

  If a=10 Then //зачем нужен был впереди case не ясно, но пусть будет
          begin
              ClrScr;
              Writeln ('?');      Writeln ('');    Writeln ('1');    Writeln ('2');    Writeln ('');
              Readln (y);
              case y of // --------
                    1:inc(b, 1);//  |
                    2:inc(b, 2);//  |
              end; // case --------
          end; // if . Таким образом "case y of" выполняется внутри блока условия "if"

  If a=20 Then
          begin
                ClrScr;
                Writeln ('?');    Writeln ('');  Writeln ('1');  Writeln ('2');  Writeln ('');
                Readln (y);
                case y of // --------
                    1:inc(b, 1);//  |
                    2:inc(b, 2);//  |
                end; // case --------
          end; // тоже самое

// завершающие действия
  z:=a+b;
  ClrScr;
  Writeln(a,' + ',b,' = ',z);
  Readln;
 end.


asus a9rp 17-09-2009 20:44 1221320

lxa85, Огромнейшее спасибо! Всё работает.
Цитата:

Цитата lxa85
Cтуденчество, совсем думать обленилось! »

Извините, но Вы меня просто не правильно поняли. У меня просто ничего не получалось как-бы я не пробовал и не понимал, в чём проблема. Вот и пришлось попросить у Вас. То, что было написано перед Вами давало тот же результат. Оказалось, что у меня было промерно так:
Код:

If a=10 Then
 begin
 end;
Case y of
end;

А надо было так:
Код:

If a=10 Then
 begin
Case y of
end;
end;

Теперь я всё понял.
Последний вопрос, но уже не по программе, а по самому Паскалю.
При копитовании из Паскаля в ОСь или наоборот, русские буквы заменяются вопросиками. Возможно ли это изправить?

П.С. Я не студент, а шольник (8-й класс). :)

lxa85 17-09-2009 21:53 1221382

Собственно что я и пытался сказать - нарушение логических скобок.
На будущее, чтобы не путаться, не стесняйся использовать табуляцию.
Программа сразу наглядней становится.
Цитата:

Цитата asus a9rp
При копитовании из Паскаля в ОСь или наоборот, русские буквы заменяются вопросиками. Возможно ли это исправить? »

Да. Это происходит из-за использования различных кодировок. Попробуй Notepad++ или другой более гибкий текстовый редактор. В них как правило устанавливают перекодировщики.
Если открывать стандартным блокнотом, то шрифт Terminal

Цитата:

Цитата asus a9rp
Я не студент, а школьник (8-й класс). »

Не принимай всерьез, я уставший был. :)

asus a9rp 18-09-2009 00:36 1221479

lxa85,
Цитата:

Цитата lxa85
Собственно что я и пытался сказать - нарушение логических скобок. »

Это я тогда понял, но не понял где.
Цитата:

Цитата lxa85
Попробуй Notepad++ »

Попробую, спасибо.
Цитата:

Цитата lxa85
Цитата asus a9rp:
Я не студент, а школьник (8-й класс). »
Не принимай всерьез, я уставший был. »

Ничего, бывает. :yes: А я в серьёз и не принял. Обижаться тут неначто, так что всё в порядке. :)

asus a9rp 18-09-2009 01:00 1221492

Вот, собственно, я и проверил Notepad++. Всё работает! Пока что вопросы все. Спасибище ограомное! :) :oszone:

asus a9rp 28-09-2009 22:28 1229782

А вот появился ещё один вопрос. Можно ли в Паскале написать программу с диалоговыми окнами, т.е. с кнопками, "галочками", "точечками", выпадающими списками и т.д. Мне кажется, что тут тоже самое, что и с иконтами, но это - ИМХО.

BlackEric 28-09-2009 23:53 1229878

asus a9rp,
была к TP7 такая библиотека - Turbo Vision. Насколько я понимаю интерфейс TP7 на ней и написан.
Но все это умерло уже лет 15 как. Не тратьте время. Возьмите хотя бы Delphi или C++ c Qt.

lxa85 29-09-2009 01:09 1229929

Цитата:

Цитата asus a9rp
Можно ли в Паскале написать программу с диалоговыми окнами »

Если брать чистый Паскаль, то нет. Диалоговые окна, кнопочки, списочки - это объекты.
Объекты - это Object Pascal. (Pascal + Объекты) Object Pascal - ведет нас к Delphi.
По моему так.

asus a9rp 29-09-2009 01:32 1229943

lxa85, ясно, спасибо. Я посмотрю.

asus a9rp 05-10-2009 01:15 1234646

А вот ещё проблемка. При копировании текста из Pascal в Notepad++ - русский в порядке, а если наоборот (что мне и нужно) - опять вопросики. Можно как-то исправить?
Я пользуюсь нотпадом, так как там можно копировать и вставлять текст используя Ctrl + C и Ctrl + V, а в паскале надо ПКМ - копировать, ПКМ - вставить. В нотпаде в несколько раз быстрее. Это проблема не смертельная - я могу написать транслитом, а потом в паскале переписать на русский. Но всёже хотелось бы сразу на человеческом языке.

Alan85 05-10-2009 06:50 1234725

shift+del - вырезать
shift+insert - вставить
ctrl+insert - копировать
Команды используются в TP и многих других редакторах... А в нотепаде ++ поищи опцию включающую кодировку cp866 или DOS.

asus a9rp 07-10-2009 00:24 1236363

Цитата:

Цитата Alan85
shift+del - вырезать
shift+insert - вставить
ctrl+insert - копировать »

Спасибо. Я к кнопкам ОСи првык.
Цитата:

Цитата Alan85
поищи опцию включающую кодировку cp866 или DOS. »

к сожалению не нашёл, но проблему пешил. Вы навели меня на мысль. Я покапался в настройках и с "Ситаксис"е нашёл паскаль, поставил, всё работает. Спасибо!


Время: 14:53.

Время: 14:53.
© OSzone.net 2001-