Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2013, 02:42   #1
Мизантроп_ЛоЛ
 
Регистрация: 15.05.2013
Сообщений: 7
Печаль Кракозябры вместо строк

Модуль:
Код:
unit lab3unit;
interface
 type TKomp_chis=object
       z:string[10];
       procedure vvod(var Zdeis, Zmnim: integer);
       function slojenie(a1, b1, a2, b2:integer):string;
       function vichitanie(a1, b1, a2, b2:integer):string;
       function umnojenie(a1, b1, a2, b2:integer):string;
       function delenie(a1, b1, a2, b2:integer):string;
      end;
var deis, mnim: string[3];
    code: integer;
implementation
 procedure Tkomp_chis.vvod(var Zdeis, Zmnim: integer);
 var i, j: byte;
     a, b: string[3];
     znak: char;
 begin
  write ('Vvedite kompleksnoe chislo: ');
  readln (z);
  i:=0;
  j:=0;
  while i<length(z) do
   begin
   i:=i+1;
    if ((ord(z[i])>=48) and (ord(z[i])<=57)) then
     a[i]:=z[i]
    else
     if ((z[i]='+') or (z[i]='-')) then
      znak:=z[i]
     else
      if z[i]='i' then
       while i<length(z) do
        begin
         i:=i+1;
         j:=j+1;
         b[j]:=z[i];
        end;
   end;
  val(a,Zdeis,code);
  if znak='+' then
   val(b,Zmnim,code)
  else
   begin
    val(b,Zmnim,code);
    Zmnim:=-Zmnim;
   end;
 end;


 function Tkomp_chis.slojenie(a1, b1, a2, b2:integer):string;
 var a, b: string[3];
     c:string[10];
 begin
  str(a1+a2,a);
  str(b1+b2,b);
  if b1+b2<>0 then
   begin
    if b1+b2>0 then
     insert('+',b,1);
     insert('i',b,2);
   end;
  slojenie:=concat(a,b);
 end;


 function Tkomp_chis.vichitanie(a1, b1, a2, b2:integer):string;
 var a, b: string[3];
     c:string[10];
 begin
  str(a1-a2,a);
  str(b1-b2,b);
  if b1-b2<>0 then
   begin
    if b1-b2>0 then
    insert('+',b,1);
    insert('i',b,2);
   end;
  vichitanie:=concat(a,b);
 end;


 function Tkomp_chis.umnojenie(a1, b1, a2, b2:integer):string;
 var a, b: string[3];
     c:string[10];
 begin
  str((a1*a2)-(b1*b2),a);
  str((a1*b2)+(b1*a2),b);
  if (b1*a2)+(b2*a1)<>0 then
   begin
    if (a1*b2)+(b1*a2)>0 then
    insert('+',b,1);
    insert('i',b,2);
   end;
  umnojenie:=concat(a,b);
 end;


 function Tkomp_chis.delenie (a1, b1, a2, b2:integer):string;
 var chisA, chisB, znam: integer;
     a, b: string[3];
     c:string[10];
 begin
  if ((a2<>0) and (b2<>0)) then
   begin
    chisA:=(a1*a2)-(b1*(-b2));
    chisB:=(a1*(-b2))+(b1*a2);
    znam:=sqr(a1)+sqr(b1);
     if chisA mod znam=0 then
      str(chisA/znam,a)
     else
      begin
       str(chisA,a);
       insert('/',a,length(a));
       str(znam,c);
       insert(c,a,length(a));
      end;
     if chisB mod znam=0 then
      str(chisB/znam,b)
     else
      begin
       str(chisB,b);
       insert('/',b,length(b));
       str(znam,c);
       insert(c,b,length(b));
      end;
     if (chisB)<>0 then
      begin
       if (chisB/znam)>0 then
       insert('+',b,1);
       insert('i',b,2);
      end;
    delenie:=concat(a,b);
   end;
  else
   write('Delit na 0 nelzya!');
 end;


 begin
 end.
Программа:
Код:
program lab3;
uses crt, lab3unit;
var zdeis1, zmnim1, zdeis2, zmnim2: integer;
    znak: string[5];
    otvet: string[10];
    Komp_chis: TKomp_chis;
begin
 clrscr;
 write ('Vvedite deistvie v vide "z1?z2": ');
  readln (znak);
 with Komp_chis do
  begin
   vvod(zdeis1,zmnim1);
   vvod(zdeis2,zmnim2);
   case znak[3] of
    '+': otvet:=slojenie(zdeis1, zmnim1, zdeis2, zmnim2);
    '-': otvet:=vichitanie(zdeis1, zmnim1, zdeis2, zmnim2);
    '*': otvet:=umnojenie(zdeis1, zmnim1, zdeis2, zmnim2);
    '/': otvet:=delenie(zdeis1, zmnim1, zdeis2, zmnim2);
   end;
  end;
 write ('Otvet - ',otvet);
 readln;
end.
Проблема в следующем. Вместо строк a и b появляются какие-то кракозябры и программа не корректно работает. Компилятор TP7.
Пы.Сы. А почему в PascalABC не распознаёт объектный тип?
Спасибо за потраченное время

Вот скрин:
Прога.jpg

Последний раз редактировалось Мизантроп_ЛоЛ; 15.05.2013 в 19:23. Причина: Добавление материалов
Мизантроп_ЛоЛ вне форума Ответить с цитированием
Старый 15.05.2013, 13:21   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Кракозябры из-за различия в кодировках. В Windows обычно 1251, а в DOS (TP для доса) 866. Запускать лучше из под DOSBox'a с руссификатором.
В чём эта некорректность заключается? На корректность работы этой программы кодировка не должна влиять.
По поводу PascalABC, так в топку его, ставь FreePascal или Lazarus
eoln вне форума Ответить с цитированием
Старый 15.05.2013, 13:39   #3
Мизантроп_ЛоЛ
 
Регистрация: 15.05.2013
Сообщений: 7
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
Кракозябры из-за различия в кодировках. В Windows обычно 1251, а в DOS (TP для доса) 866. Запускать лучше из под DOSBox'a с руссификатором.
Как это сделать?)

Цитата:
В чём эта некорректность заключается? На корректность работы этой программы кодировка не должна влиять.
В том что переменным Zdeis и Zmnim не передаётся никакого значения из за такой хрени. Попробуй запустить и пошагово выполнить отслеживая a, b, Zdeist и Zmnim (вроде этих достаточно) и увидишь.

Цитата:
По поводу PascalABC, так в топку его, ставь FreePascal или Lazarus
Он мне больше нравится. Интерфейс попроще и красивее. Но видимо менее функциональный =\
Мизантроп_ЛоЛ вне форума Ответить с цитированием
Старый 15.05.2013, 14:28   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Как это сделать?)
Установить DosBOX и почитать к нему инструкцию. Там написано как запускать старые программы. Плюс возможно понадобится настроить Досбокс на кириллицу (тоже там же читать)
Цитата:
почему в PascalABC не распознаёт объектный тип?
Там вместо object нужно писать class если не ошибаюсь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.05.2013, 15:44   #5
Мизантроп_ЛоЛ
 
Регистрация: 15.05.2013
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Установить DosBOX и почитать к нему инструкцию. Там написано как запускать старые программы. Плюс возможно понадобится настроить Досбокс на кириллицу (тоже там же читать)
А это только для русских букв? А то мне там надо только цифры.
Мизантроп_ЛоЛ вне форума Ответить с цитированием
Старый 15.05.2013, 16:01   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Это касается всех, что не попадают под кодировку Latin-1. Русских, украинских букв. Цифры пройдут конечно же.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.05.2013, 16:06   #7
Мизантроп_ЛоЛ
 
Регистрация: 15.05.2013
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Это касается всех, что не попадают под кодировку Latin-1. Русских, украинских букв. Цифры пройдут конечно же.
Кстати, я только подумал. У меня же сразу после объявления переменных появляются кракозябры, а не после того как я дал им значения.
Мизантроп_ЛоЛ вне форума Ответить с цитированием
Старый 15.05.2013, 16:43   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Мизантроп_ЛоЛ,
по-первых, выложенный вами исходник имеет опечатку, из-за которой вообще не компилируется:
Цитата:
Код:
function Tkomp_chis.delenie (a1, b1, a2, b2:integer):string;
 var chisA, chisB, znam: integer;
     a, b: string[3];
     c:string[10];
 begin
  if ((a2<>0) and (b2<>0)) then
   begin
    chisA:=(a1*a2)-(b1*(-b2));
    chisB:=(a1*(-b2))+(b1*a2);
    znam:=sqr(a1)+sqr(b1);
     if chisA mod znam=0 then
      str(chisA/znam,a)
     else
      begin
       str(chisA,a);
       insert('/',a,length(a));
       str(znam,c);
       insert(c,a,length(a));
      end;
     if chisB mod znam=0 then
      str(chisB/znam,b)
     else
      begin
       str(chisB,b);
       insert('/',b,length(b));
       str(znam,c);
       insert(c,b,length(b));
      end;
     if (chisB)<>0 then
      begin
       if (chisB/znam)>0 then
       insert('+',b,1);
       insert('i',b,2);
      end;
    delenie:=concat(a,b);
   end;
  else
   write('Delit na 0 nelzya!');


потом, что проверить наличие таких глюков, как Вы описали,
Вы бы начали с того, что описали, что Вы в вашу программу вводите!

Вот, например,
сначала ваша программа спрашивает:
Vvedite deistvie v vide "z1?z2":
что Вы вводите?

потом дважды
'Vvedite kompleksnoe chislo: '
что Вы вводите?

в отладчике проходили, смотрели, чему равны Ваши
zdeis1,zmnim1 zdeis2,zmnim2 ?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.05.2013, 16:55   #9
Мизантроп_ЛоЛ
 
Регистрация: 15.05.2013
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Мизантроп_ЛоЛ,
по-первых, выложенный вами исходник имеет опечатку, из-за которой вообще не компилируется
Я извиняюсь, а где там конкретно ошибка? А то у меня модуль скомпилировался без проблем.
Цитата:
Вот, например,
сначала ваша программа спрашивает:
Vvedite deistvie v vide "z1?z2":
что Вы вводите?
Опять таки прошу прощения, тут вместо знака вопроса поставить знак "+", "-", "/", или "*", т.е. знак действия которое необходимо произвести.
Цитата:
потом дважды
'Vvedite kompleksnoe chislo: '
что Вы вводите?
Комплексное число в виде a+ib.
Цитата:
в отладчике проходили, смотрели, чему равны Ваши
zdeis1,zmnim1 zdeis2,zmnim2 ?
Это должны быть действительные и мнимые части соответствующих комплексных чисел, но из-за того что переменные a и b изначально получают какие-то непонятные значения (сразу же после объявления), им не передаётся никакое значение.
Мизантроп_ЛоЛ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кракозябры вместо Русского текста Pearl777 Работа с сетью в Delphi 3 19.05.2013 20:06
Запись в текстовый файл адресов вместо строк Стремящийся Общие вопросы C/C++ 16 10.08.2012 11:02
СКРЫТИЕ СТРОК ВМЕСТО КОЛОНОК Cone Microsoft Office Excel 16 07.09.2010 13:24
Кракозябры Web-Gangsta Свободное общение 5 03.04.2010 15:44
почему кракозябры? Bezdar Microsoft Office Excel 12 06.03.2009 10:06