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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2013, 21:31   #11
~Sл@\/яH~
Пользователь
 
Регистрация: 19.11.2011
Сообщений: 35
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Код:
function checkgray(i, BITS: integer): boolean;
begin
    checkgray := true;
    write(i:4);
    printbits(i, BITS);
    printbits(bin2gray(i, BITS), BITS);
    writeln;
    if ((i <> gray2bin1(bin2gray(i, BITS), BITS)) or
        (i <> gray2bin2(bin2gray(i, BITS), BITS)) or
        (i <> gray2bin3(bin2gray(i, BITS), BITS))) then
    begin
        writeln('ohibka perevoda iz koda grayя!');
        checkgray := false;
    end;
end;
В Си число тоже может считаться логическим выражением.
if (a) {} - ложь, если a = 0, истина, если a <> 0.
Даже если сделать преобразование числа в булево выражение, Ваша реализация содержит ошибку (всегда возвращает 1).
Если сделать как вы, то выводится, только 1 значение, а должно 8 значений. Но есть поменять true и false, то выводит как рас 8 значений, только после каждого еще ohibka perevoda iz koda grayя!
~Sл@\/яH~ вне форума Ответить с цитированием
Старый 10.11.2013, 21:37   #12
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Тогда ошибка закралась в какую-то еще функцию. Менять true и false местами не нужно. Кстати, Вы учитываете, что i должно быть беззнакового типа?
Код:
function checkgray(i: word; BITS: integer): boolean;
begin
    checkgray := true;
    write(i:4);
    printbits(i, BITS);
    printbits(bin2gray(i, BITS), BITS);
    writeln;
    if ((i <> gray2bin1(bin2gray(i, BITS), BITS)) or
        (i <> gray2bin2(bin2gray(i, BITS), BITS)) or
        (i <> gray2bin3(bin2gray(i, BITS), BITS))) then
    begin
        writeln('ohibka perevoda iz koda grayя!');
        checkgray := false;
    end;
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 10.11.2013, 21:45   #13
~Sл@\/яH~
Пользователь
 
Регистрация: 19.11.2011
Сообщений: 35
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Тогда ошибка закралась в какую-то еще функцию. Менять true и false местами не нужно. Кстати, Вы учитываете, что i должно быть беззнакового типа?
Код:
function checkgray(i: word; BITS: integer): boolean;
begin
    checkgray := true;
    write(i:4);
    printbits(i, BITS);
    printbits(bin2gray(i, BITS), BITS);
    writeln;
    if ((i <> gray2bin1(bin2gray(i, BITS), BITS)) or
        (i <> gray2bin2(bin2gray(i, BITS), BITS)) or
        (i <> gray2bin3(bin2gray(i, BITS), BITS))) then
    begin
        writeln('ohibka perevoda iz koda grayя!');
        checkgray := false;
    end;
end;
Да я знаю. Но когда я пытался сделать например судя по байтам в С++ и Pascal, то выдавал ошибки. Я брал LongWord т.к. в С++ используется unsigned
~Sл@\/яH~ вне форума Ответить с цитированием
Старый 10.11.2013, 21:57   #14
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Лучше выложите полный код на С++ и Паскале.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 10.11.2013, 21:59   #15
~Sл@\/яH~
Пользователь
 
Регистрация: 19.11.2011
Сообщений: 35
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Лучше выложите полный код на С++ и Паскале.
Код на С++
Код:
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <windows.h>

using namespace std;

//#define BITS		4

#define bin2gray(v)	(v^(v>>1))

unsigned gray2bin1(unsigned v, int BITS){
	unsigned sum = v, length = BITS;
	while(length > 0) v >>= 1, sum ^= v, length--;
	return sum;
}

unsigned gray2bin2(unsigned v,int BITS){
	unsigned i;
	for(i = 1; i < BITS; i <<= 1) v ^= (v >> i);
	return v;
}

unsigned gray2bin3(unsigned v,int BITS){
	v ^= v >> 1;	/* для 2-разрядных чисел */
	v ^= v >> 2;	/* для 4-разрядных чисел */
	v ^= v >> 4;	/* для 8-разрядных чисел */
	v ^= v >> 8;	/* для 16-разрядных чисел */
	v ^= v >> 16;	/* для 32-разрядных чисел */
    return v;
}

/*----------------------------------------------------------------------*/
void printbits(unsigned v, int BITS){
	unsigned i; printf(" - ");
	i = BITS; while(i > 0) 
		printf("%u", (v >> --i) & 1);
}

int checkgray(unsigned i,int BITS){
	printf("%4u", i); printbits(i,BITS); printbits(bin2gray(i,BITS),BITS); printf("\n");
	if(i != gray2bin1(bin2gray(i,BITS),BITS) ||
	  i != gray2bin2(bin2gray(i,BITS),BITS) ||
	   i != gray2bin3(bin2gray(i,BITS),BITS)){
	printf("%u: ошибка перевода из кода Грея!\n", i);
		return 0;
	}
	return 1;
}

#define mostSignBit(bits)	(1 << (bits - 1))
#define maxUnsigned(bits)	(mostSignBit(bits) | (mostSignBit(bits) - 1))

int main(){
	SetConsoleCP (1251);
	SetConsoleOutputCP (1251);
	unsigned i;
	unsigned BITS;
	printf("Введите биты:");
    scanf("%u", &BITS);
	for(i = 0; checkgray(i,BITS) && i < (unsigned)maxUnsigned(BITS); i++);
	
	getch();
	return 0;
}
На Pascal
Код:
program aaa;
uses crt;

function bin2gray(v,BITS:integer):integer;
begin
bin2gray:=v xor (v shr 1)
end;


function gray2bin1(v,BITS:integer):integer;
var sum,length:integer;
begin
length:=BITS;
 while length > 0 do begin
       v:= v Shr 1;
sum:=sum Xor v;
length:=length-1;
    end;
gray2bin1:=sum;
end;


function gray2bin2(v,BITS:integer):integer;
var i:integer;
begin
for i:=1 to BITS do
v:=v Xor (v Shr i);
i:=i Shl 1;
gray2bin2:=v;
end;

function gray2bin3(v,BITS:integer):integer;
begin

v:=v Xor (v Shr 1);
v:=v Xor (v Shr 2);
v:=v Xor (v Shr 4);
v:=v Xor (v Shr 8);
v:=v Xor (v Shr 16);
gray2bin3:=v;
end;

function printbits(v,BITS:integer):integer;
var i,c:integer;
begin
write (' - ');
i:=BITS;
while i > 0 do begin
i:=i-1;
c:=((v Shr i) and 1);
write (c);
    end;
end;

function checkgray(i, BITS: integer): boolean;
begin
    checkgray := true;
    write(i:4);
    printbits(i, BITS);
    printbits(bin2gray(i, BITS), BITS);
    writeln;
    if ((i <> gray2bin1(bin2gray(i, BITS), BITS)) or
        (i <> gray2bin2(bin2gray(i, BITS), BITS)) or
        (i <> gray2bin3(bin2gray(i, BITS), BITS))) then
    begin
        writeln('ohibka perevoda iz koda grayя!');
        checkgray := false;
    end;
end;

function mostSignBit(bits:integer):integer;
begin
mostSignBit:=(1 Shl (bits - 1));
end;

function maxUnsigned(bits:integer):integer;
begin
maxUnsigned:=(mostSignBit(bits) Or (mostSignBit(bits) - 1));
end;



var i,BITS:integer;
begin
writeln('Vvedite bits: ');
readln(BITS);
i:=0;
while (checkgray(i,BITS) and i < maxUnsigned(BITS)) do begin
           i:=i+1;
end;
readln;
readln;
end.
~Sл@\/яH~ вне форума Ответить с цитированием
Старый 10.11.2013, 22:16   #16
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Попробуйте:
Код:
program aaa;
uses crt;

function bin2gray(v, BITS: longword): longword;
begin
  bin2gray := v xor (v shr 1);
end;

function gray2bin1(v, BITS: longword): longword;
var
  sum, len: longword;
begin
  len := BITS;
  sum := v;
  while len > 0 do
  begin
    v := v shr 1;
    sum := sum xor v;
    dec(len);
  end;
  gray2bin1 := sum;
end;

function gray2bin2(v, BITS: longword): longword;
var
  i: longword;
begin
  i := 1;
  while i < BITS do
  begin
    v := v xor (v shr i);
    i := i shl 1;
  end;
  gray2bin2 := v;
end;

function gray2bin3(v, BITS: longword): longword;
begin
  v := v xor (v shr 1);
  v := v xor (v shr 2);
  v := v xor (v shr 4);
  v := v xor (v shr 8);
  v := v xor (v shr 16);
  gray2bin3 := v;
end;

procedure printbits(v, BITS: longword);
var
  i: longword;
begin
  write(' - ');
  i := BITS;
  while i > 0 do
  begin
    dec(i);
    write((v shr i) and 1);
  end;
end;

function checkgray(i, BITS: longword): boolean;
begin
    checkgray := true;
    write(i:4);
    printbits(i, BITS);
    printbits(bin2gray(i, BITS), BITS);
    writeln;
    if ((i <> gray2bin1(bin2gray(i, BITS), BITS)) or
        (i <> gray2bin2(bin2gray(i, BITS), BITS)) or
        (i <> gray2bin3(bin2gray(i, BITS), BITS))) then
    begin
        writeln('ohibka perevoda iz koda grayя!');
        checkgray := false;
    end;
end;

function mostSignBit(bits: longword): longword;
begin
  mostSignBit := (1 shl (bits - 1));
end;

function maxUnsigned(bits: longword): longword;
begin
  maxUnsigned := (mostSignBit(bits) Or (mostSignBit(bits) - 1));
end;

var
  i, BITS: longword;
begin
  writeln('Vvedite bits:');
  readln(BITS);
  i := 0;
  while checkgray(i, BITS) and (i < maxUnsigned(BITS)) do inc(i);
  readln;
end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 10.11.2013, 22:21   #17
~Sл@\/яH~
Пользователь
 
Регистрация: 19.11.2011
Сообщений: 35
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Попробуйте:
Код:
function bin2gray(v, BITS: longword): longword;
Пишет Uknown identifier
~Sл@\/яH~ вне форума Ответить с цитированием
Старый 10.11.2013, 22:28   #18
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Тогда придется вернуться к word. А лучше перейдите на Free Pascal компилятор.
Код:
program aaa;
uses crt;

function bin2gray(v, BITS: word): word;
begin
  bin2gray := v xor (v shr 1);
end;

function gray2bin1(v, BITS: word): word;
var
  sum, len: word;
begin
  len := BITS;
  sum := v;
  while len > 0 do
  begin
    v := v shr 1;
    sum := sum xor v;
    dec(len);
  end;
  gray2bin1 := sum;
end;

function gray2bin2(v, BITS: word): word;
var
  i: word;
begin
  i := 1;
  while i < BITS do
  begin
    v := v xor (v shr i);
    i := i shl 1;
  end;
  gray2bin2 := v;
end;

function gray2bin3(v, BITS: word): word;
begin
  v := v xor (v shr 1);
  v := v xor (v shr 2);
  v := v xor (v shr 4);
  v := v xor (v shr 8);
  //v := v xor (v shr 16);
  gray2bin3 := v;
end;

procedure printbits(v, BITS: word);
var
  i: word;
begin
  write(' - ');
  i := BITS;
  while i > 0 do
  begin
    dec(i);
    write((v shr i) and 1);
  end;
end;

function checkgray(i, BITS: word): boolean;
begin
    checkgray := true;
    write(i:4);
    printbits(i, BITS);
    printbits(bin2gray(i, BITS), BITS);
    writeln;
    if ((i <> gray2bin1(bin2gray(i, BITS), BITS)) or
        (i <> gray2bin2(bin2gray(i, BITS), BITS)) or
        (i <> gray2bin3(bin2gray(i, BITS), BITS))) then
    begin
        writeln('ohibka perevoda iz koda grayя!');
        checkgray := false;
    end;
end;

function mostSignBit(bits: word): word;
begin
  mostSignBit := (1 shl (bits - 1));
end;

function maxUnsigned(bits: word): word;
begin
  maxUnsigned := (mostSignBit(bits) Or (mostSignBit(bits) - 1));
end;

var
  i, BITS: word;
begin
  writeln('Vvedite bits:');
  readln(BITS);
  i := 0;
  while checkgray(i, BITS) and (i < maxUnsigned(BITS)) do inc(i);
  readln;
end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 10.11.2013, 22:34   #19
~Sл@\/яH~
Пользователь
 
Регистрация: 19.11.2011
Сообщений: 35
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Тогда придется вернуться к word. А лучше перейдите на Free Pascal компилятор.
Спасибо, с word работает все.
~Sл@\/яH~ вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
динамическое приведение типа the_deer_one C# (си шарп) 9 25.08.2012 20:59
не могу понять несколько строчек в pascal в простом исходнике zhenka619 Помощь студентам 7 30.12.2011 14:06
Сумма ряда (Pascal). Не могу понять смысл задачи :( DsDevis Помощь студентам 9 26.03.2009 01:16
Нужна библиотека для turbo pascal не могу нигде найти Dimanw92 Паскаль, Turbo Pascal, PascalABC.NET 1 01.10.2008 21:18
Не могу решить программу в Turbo Pascal помогите пожалуйста! Заранее благодарен... dolbi Помощь студентам 5 01.04.2008 08:26