Вернуться   Компьютерный форум > Компьютеры > Программы > Программирование
 
 
Опции темы
Старый 16.05.2013, 09:49   #1 (ссылка)
Новичок
 
Регистрация: 16.05.2013
Сообщений: 9
Репутация: 0
По умолчанию Кракозябры вместо строк в ТП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.

Вот скрин:
Mizantrop вне форума  
Старый 16.05.2013, 20:35   #2 (ссылка)
Стажёр
 
Регистрация: 04.01.2013
Сообщений: 490
Репутация: 57
По умолчанию

вставил код в TP7 выдает ошибку - в конце модуля точка с запятой перед Else:
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;
Serega_490101 вне форума  
Старый 17.05.2013, 12:21   #3 (ссылка)
Новичок
 
Регистрация: 16.05.2013
Сообщений: 9
Репутация: 0
По умолчанию

Цитата:
Сообщение от Serega_490101 Посмотреть сообщение
вставил код в TP7 выдает ошибку - в конце модуля точка с запятой перед Else:
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;
Ага, спасибо, пропустил по-ходу, но всё же, думаю что причина того что на скрине не в этом.
Mizantrop вне форума  
Старый 17.05.2013, 19:37   #4 (ссылка)
Стажёр
 
Регистрация: 04.01.2013
Сообщений: 490
Репутация: 57
По умолчанию

Согласен причина не в этом - при попытке проверить правильность работы программы не выводится ответ.
Выводится:
Otvet -
Попробую завести код в delphi

---------- Добавлено в 19:37 ---------- Предыдущее сообщение было написано в 19:18 ----------

В delphi оказалось что в процедуре procedure Tkomp_chis.vvod(var Zdeis, Zmnim: integer); в цикле
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;

переменная a не получает никаких данных от переменной z
те же проблемы с переменной b
посмотрю что можно сделать
Serega_490101 вне форума  
Старый 17.05.2013, 20:00   #5 (ссылка)
Новичок
 
Регистрация: 16.05.2013
Сообщений: 9
Репутация: 0
По умолчанию

Цитата:
Сообщение от Serega_490101 Посмотреть сообщение
переменная a не получает никаких данных от переменной z
те же проблемы с переменной b
Блин, я же именно это и хочу сказать! Такое ощущение будто ошибка в компиляторе, но коль у тебя так же, то я не знаю почему так. Эти переменные получают значения, но они как-то идут вместе со всеми теми символами которые там изначально и неизвестно откуда взялись. И когда я пытаюсь передать значения с a и b в Zdeis и Zmnim (переведя их в тип integer), то ничего не происходит (они не переводятся из за тех непонятных символов).
Пы.Сы. Удивлён что кто-то ещё заходит в эту тему)) Благодарю за попытки помочь)
Mizantrop вне форума  
Старый 17.05.2013, 20:07   #6 (ссылка)
Стажёр
 
Регистрация: 04.01.2013
Сообщений: 490
Репутация: 57
По умолчанию

Попробовал переделать программу. Вариант рабочий, не знаю подойдет или нет

Код:
unit lab3unit;
interface
 type TKomp_chis=object
       procedure vvod(var Zdeis, Zmnim: real);
       function slojenie(a1, b1, a2, b2:real):string;
       function vichitanie(a1, b1, a2, b2:real):string;
       function umnojenie(a1, b1, a2, b2:real):string;
       function delenie(a1, b1, a2, b2:real):string;
      end;
var deis, mnim: real;
    code: integer;
implementation
 procedure Tkomp_chis.vvod(var Zdeis, Zmnim: real);
 begin
writeln('Vvedite dejstvitelnuju i mnimuju chasti kompleksnogo chisla (cherez probel)');
readln(Zdeis, Zmnim);
 end;


 function Tkomp_chis.slojenie(a1, b1, a2, b2:real):string;
 var c1,c2:string;
 begin
a1:=a1+a2;
b1:=b1+b2;
if (a1=0) and (b1=0) then slojenie:='0';
if (a1<>0) and (b1=0) then begin
str(a1:5:3, c1);
slojenie:=c1;
end;
if (a1=0) and (b1<>0) then begin
str(b1:5:3, c1);
slojenie:=c1+'i';
end;
if (a1<>0) and (b1<>0) then begin
str(a1:5:3, c1);
str(b1:5:3, c2);
slojenie:=c1+' '+c2+'i';
end;
end;


 function Tkomp_chis.vichitanie(a1, b1, a2, b2:real):string;
 var c1,c2:string;
 begin
a1:=a1-a2;
b1:=b1-b2;
if (a1=0) and (b1=0) then vichitanie:='0';
if (a1<>0) and (b1=0) then begin
str(a1:5:3, c1);
vichitanie:=c1;
end;
if (a1=0) and (b1<>0) then begin
str(b1:5:3, c1);
vichitanie:=c1+'i';
end;
if (a1<>0) and (b1<>0) then begin
str(a1:5:3, c1);
str(b1:5:3, c2);
vichitanie:=c1+' '+c2+'i';
end;
end;


 function Tkomp_chis.umnojenie(a1, b1, a2, b2:real):string;
 var c1,c2:string;
 begin
a1:=a1*a2;
b1:=b1*b2;
if (a1=0) and (b1=0) then umnojenie:='0';
if (a1<>0) and (b1=0) then begin
str(a1:5:3, c1);
umnojenie:=c1;
end;
if (a1=0) and (b1<>0) then begin
str(b1:5:3, c1);
umnojenie:=c1+'i';
end;
if (a1<>0) and (b1<>0) then begin
str(a1:5:3, c1);
str(b1:5:3, c2);
umnojenie:=c1+' '+c2+'i';
end;
end;


 function Tkomp_chis.delenie (a1, b1, a2, b2:real):string;
var c1,c2:string;
begin
if (a2<>0) and (b2<>0) then begin
a1:=a1*a2;
b1:=b1*b2;
if (a1=0) and (b1=0) then delenie:='0';
if (a1<>0) and (b1=0) then begin
str(a1:5:3, c1);
delenie:=c1;
end;
if (a1=0) and (b1<>0) then begin
str(b1:5:3, c1);
delenie:=c1+'i';
end;
if (a1<>0) and (b1<>0) then begin
str(a1:5:3, c1);
str(b1:5:3, c2);
delenie:=c1+' '+c2+'i';
end;
end;
end;


 begin
 end.
Код:
program lab3;
uses crt, lab3unit;
var zdeis1, zmnim1, zdeis2, zmnim2: real;
    znak: string[5];
    otvet: string;
    Komp_chis: TKomp_chis;
begin
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;
  writeln('Otvet:');
 writeln(otvet);
 readln;
end.
Кстати в TP7 в конце программы для создания паузы можно использовать readkey вместо readln

Последний раз редактировалось Serega_490101; 17.05.2013 в 20:26.
Serega_490101 вне форума  
Старый 17.05.2013, 22:45   #7 (ссылка)
Новичок
 
Регистрация: 16.05.2013
Сообщений: 9
Репутация: 0
По умолчанию

Ну, что я могу сказать, спасибо за старания) Но всё же я пытаюсь всё делать сам, ибо это всё-таки мне надо) И всё же хочется разобраться от чего проблема. У тебя кстати есть пару изъянов в модуле:
1) Ввод чисел странный (но сравнительно приемлимый).
2) Все числа лучше делать целыми, ибо пока что не видел использования десятичных дробей среди комплексных чисел.
3) Ты не учёл, что если мнимая часть будет положительной, то при создании строки плюса не будет, а будут цифры подряд.
4) Деление в твоей программе почти идентично умножению)
Но всё же, спасибо за помощь, некоторые твои строчки возьму себе на заметку)
Mizantrop вне форума  
Старый 19.05.2013, 01:10   #8 (ссылка)
Стажёр
 
Аватар для Pavlucha
 
Регистрация: 26.01.2010
Сообщений: 1,454
Репутация: 101
Профиль ВКонтакте
По умолчанию

Mizantrop, немного переписал твой код,проверил только сложение и вычитание,дальше смотри сам если что не так.
Код:
program project0001;

uses
  crt,lab3unit;

var
  zdeis1, zmnim1, zdeis2, zmnim2: integer;
  znak: char;
  otvet: string[10];
  Komp_chis: TKomp_chis;

begin
  write ('Vvedite deistvie v vide "z1?z2": ');
  readln (znak);
  with Komp_chis do begin
    vvod(zdeis1,zmnim1);
    vvod(zdeis2,zmnim2);
    case znak 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.
Код:
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
  fl:boolean;
  i, j: byte;
  a, b: string[3];
  znak: char;
begin
  write ('Vvedite kompleksnoe chislo: ');
  readln (z);
  fl:=true;
  i:=0; j:=0;
  a:=''; b:='';
  while i<length(z) do begin
    inc(i);
    if fl and (z[i] in ['0'..'9']) then
      a:=a+z[i]
    else
    if ((z[i]='+') or (z[i]='-')) then begin
      znak:=z[i];
      fl:=false;
    end
    else
    if z[i] in ['0'..'9'] then
      b:=b+z[i];
  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;

end.
Pavlucha вне форума  
Ads
Старый 19.05.2013, 18:04   #9 (ссылка)
Новичок
 
Регистрация: 16.05.2013
Сообщений: 9
Репутация: 0
По умолчанию

Оппа, коль придать a и b начальные значения и использовать "+", то кракозябры исчезают) Благодарю за помощь)
Mizantrop вне форума  
Ads
 


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кракозябры вместо русских букв michal MacOS 2 10.04.2013 15:33
Кракозябры на флешке denismm-105 Периферия 3 16.03.2013 15:22
На LETITBIT отображаются кракозябры.. rkol Интернет и сети 1 24.03.2010 01:11
кракозябры в фотошопе. lego601 Графика 1 08.12.2009 21:04
photoshop 5 кракозябры lego601 Графика 3 28.10.2009 23:40


Текущее время: 16:26. Часовой пояс GMT +4. Powered by vBulletin® Version 5.8.9
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd.