Консультация № 180577
05.11.2010, 16:19
0.00 руб.
06.11.2010, 17:15
0 38 1
Добрый день уважаемые эксперты!
у меня есть код программы и сам исходник, мне надо дописать процедуру что бы полностью закончить программ, но что то я догнать не могу, прошу у вас помощи!
сама программа выполняет: Действиями формы являются операции ввода и вывода в заданный файл, каждое из которых представляет собой последовательность операций открытия, чтения-записи и закрытия дескриптора файла.
надо написать процедуру что бы: Требуется вывести в выходной файл квадраты чисел, содержащихся во входном файле.
исходник в приложении!
заранее благодарю за помощ!

исходник!

Обсуждение

Неизвестный
08.11.2010, 11:49
общий
если не менять то компилирует!

вот скрин ошибки
еррор
давно
Мастер-Эксперт
325460
1469
08.11.2010, 11:56
общий
нет под рукой компилятора :(
попробуйте так
a : array[0..100] of char;

e : string;


e объявить тоже как массив char
со строками действительно нельзя так писать.

e : array[0..100] of char;

должно заработать.
Об авторе:
to live is to die
Неизвестный
08.11.2010, 12:02
общий
объявил как массив...поЯвились новые ошибки(

еррор
давно
Мастер-Эксперт
325460
1469
08.11.2010, 12:15
общий
ну так объявление стринга нужно убрать.
e : string; - эта строчка не нужна.





если не заработает тогда
еще можно стринг преобразовать к другому типу.
альтернативный вариант
к примеру объявить
d:char

и там где меняем
d=e[j];
a[j]=d*d;
Об авторе:
to live is to die
Неизвестный
08.11.2010, 12:22
общий
если e : string; убираем, то в этой строчке ошибка e := Copy(txtOutput.Text, i, min(sizeof(a), Length(txtOutput.Text) - i));

с d=e[j];
a[j]=d*d;
тоже не работает
давно
Мастер-Эксперт
325460
1469
08.11.2010, 12:30
общий
с d=e[j];
a[j]=d*d;
тоже не работает а на что тут ругается?
Об авторе:
to live is to die
Неизвестный
08.11.2010, 12:32
общий
на тоже самое что и на первом скрине!
давно
Мастер-Эксперт
325460
1469
08.11.2010, 12:48
общий
хорошо все оставляем, а добавляем такую строчку

for j := 0 to Length(e) - 1 do

a[j] := e[j + 1];
далее

for j := 0 to Length(e) - 1 do

a[j] := a[j]*a[j];

ну это точно должно прокатить
Об авторе:
to live is to die
Неизвестный
08.11.2010, 12:49
общий
что именно оставить?)
а то я уже столько всего поменял)
давно
Мастер-Эксперт
325460
1469
08.11.2010, 12:55
общий
в первоначальный код добавляем две строчки

for j := 0 to Length(e) - 1 do

a[j] := a[j]*a[j];

над чарами то это по-любому можно делать. (по идее и стринг можно в квадрат, но не помню функций работы со стрингом)
да еще там строчка a[j] := e[j + 1]; тут тоже надо наверное поставить e[j ] - по условию задачи не нужно брать следующий символ.
Об авторе:
to live is to die
Неизвестный
08.11.2010, 12:58
общий
неа...не работает!
может я не правильно что то длеаю...но ошибка всегда одна и таже(
давно
Мастер-Эксперт
325460
1469
08.11.2010, 13:01
общий
не дает умножить чар на чар, быть не может, сейчас поищу компилятор, так быстрее будет.
Об авторе:
to live is to die
Неизвестный
08.11.2010, 13:02
общий
окей...буду ждать!
давно
Мастер-Эксперт
325460
1469
08.11.2010, 13:20
общий
конечно вариант не то что бы супер, но рабочий

все работаем с тем же местом
меняем
for j := 0 to Length(e) - 1 do

a[j] := e[j + 1];


на
for j := 0 to Length(e) - 1 do

a[j] := Char(Byte(e[j ])*Byte(e[j ]));
Об авторе:
to live is to die
Неизвестный
08.11.2010, 13:23
общий
аха...работает!
а вот в читаемом файле должны быть цифры в квадрате, что бы он вывел их?
давно
Мастер-Эксперт
325460
1469
08.11.2010, 13:32
общий
дело в том что приложение работает непосредственно с файлами. берет число в файле и возводит его в квадрат.
чтобы было корректность с цифрами, нужно парсить строчку, находить в ней цифру перегнать ее из ascii в числовое представление возвести в квадрат и перегнать обратно в текст
Об авторе:
to live is to die
Неизвестный
08.11.2010, 13:34
общий
а если числа нет в файле?
давно
Мастер-Эксперт
325460
1469
08.11.2010, 13:47
общий
файл - это набор чисел.
наша программа берет каждый байт файла и возводит его в квадрат.
для Вашей задачи наверное нужно сделать следующее:
получить символ, проанализировать число ли это, если число то возвести в квадрат и записать?
Об авторе:
to live is to die
Неизвестный
08.11.2010, 13:49
общий
нам же нужно вывести квадраты чисел слдержащиеся в файле и толь...
давно
Мастер-Эксперт
325460
1469
08.11.2010, 13:56
общий
еще раз с заданием.
у Вас текстовый фал?
в каком формате записаны числа в файле (они как текст или как цифра)?

если просто вывести цифры из файла тогда надо на кнопку чтения повесить доп действия.
Об авторе:
to live is to die
Неизвестный
08.11.2010, 14:03
общий
вот само задание на чтение и запись файла, которое я предоставил в исходнике:

В данной работе требуется создать приложение в среде C++/Delphi, осуществляющего асинхронное чтение и запись заданного файла.
Постановка задачи: определить процедуры чтения записи для файловых типов.
оно выполненно!

я думаю что надо просто вывести числа(в данном случае квадраты чисел)
давно
Мастер-Эксперт
325460
1469
08.11.2010, 14:56
общий
a[j] := Char(((Byte(a[j ])-48)*(Byte(a[j])-48))+48); - такую строчку добавить, но это не для двухзначного квадрата.
эта строчка берет значение текстовой цифры -48 это чтобы преобразовать к обычной цифре, но там когда двухзначное число надо его разбить на одну и вторую часть. и добавить как два, позже можно будет подумать как это сделать.

Об авторе:
to live is to die
Неизвестный
08.11.2010, 14:59
общий
двухзначные квадраты это все выше 9 ?

ну а числа в файле я так думаю в виде цофр записаны.
давно
Мастер-Эксперт
325460
1469
09.11.2010, 13:34
общий
ок, как делаем?
впринципе можно добавить в тело код, который
1 преобразовать из ASCII в обычное чило
2 проверить число меньше трех трех
3 если больше то возвести в квадрат
4 записать старшую часть(десятки) отдельно от младшей(единицы)
5 преобразовать десятки в ASCII, единицы в ASCII
6 Вывести в поле отображения два числа
7 Если число меньше трех
8 возвести в квадрат
9 преобразовать в ASCII вывести число в поле вывода.
Об авторе:
to live is to die
Неизвестный
09.11.2010, 15:30
общий
вот так во входном файле у нас находятся числа "1 2 3 4 5 ....", в выходной выводим их квадраты т.е. "1 4 9 16 25 ...."
думаб тут банальная процедурка, ток какая))
давно
Мастер-Эксперт
325460
1469
09.11.2010, 16:14
общий
Можно вот так вот описать обработку чтения файла


procedure TForm1.btnReadClick(Sender: TObject);

var hFile : THandle;

a : array[0..1024] of char;
aa : array[0..1024] of char;

i, n : Cardinal;
l, j, m : integer;

begin



hFile := CreateFile(PChar(txtInf.Text),

GENERIC_READ,

FILE_SHARE_READ or FILE_SHARE_WRITE,

nil,

OPEN_EXISTING,

0,

0);



if hFile = INVALID_HANDLE_VALUE then

begin

Status.SimpleText :='Error during opening file: ' + inttostr(GetLastError());

exit;

end;



txtInput.Text := '';



n := 0;
m:=0;

while ReadFile(hFile, a, sizeof(a), i, nil) do

begin

if i > 0 then
begin
for j := 0 to i - 2 do
begin
l:= Byte(a[j ])-48;
if l>0 then
begin
if l<4 then
begin
aa[m] := Char(((Byte(a[j ])-48)*(Byte(a[j])-48))+48);
m:=m+1;
end
else
begin
l:=l*l;
aa[m] := Char((l div 10)+48);
m:=m+1;
aa[m] := Char((l mod 10)+48);
m:=m+1;
i:=i+1;
end
end ;
end ;
txtInput.Text := txtInput.Text + Copy(aa, 0, i-2)
end

else

break;

n := n + i;

end;


// txtInput.Text := txtInput.Text + Copy(a, 0, l) ;

CloseHandle(hFile);

Status.SimpleText := Format('ReadFile: %d byte(s)', [n]);


end;
Об авторе:
to live is to die
Неизвестный
09.11.2010, 17:26
общий
работает!
правда я ввел "1 2 3 4 5" но он возвел только первые 4 цифры, а 5 не возвел...
и вывод можно через пробел сделать?
давно
Мастер-Эксперт
325460
1469
09.11.2010, 17:33
общий
да, счсетчик плохова-то работает, только цифры выбираю.
чтобы добавить пробел в массив aa после ввода цифры надо aa:=' ' ;

procedure TForm1.btnReadClick(Sender: TObject);

var hFile : THandle;

a : array[0..1024] of char;
aa : array[0..1024] of char;

i, n : Cardinal;
l, j, m : integer;

begin



hFile := CreateFile(PChar(txtInf.Text),

GENERIC_READ,

FILE_SHARE_READ or FILE_SHARE_WRITE,

nil,

OPEN_EXISTING,

0,

0);



if hFile = INVALID_HANDLE_VALUE then

begin

Status.SimpleText :='Error during opening file: ' + inttostr(GetLastError());

exit;

end;



txtInput.Text := '';



n := 0;
m:=0;

while ReadFile(hFile, a, sizeof(a), i, nil) do

begin

if i > 0 then
begin
for j := 0 to i - 2 do
begin
l:= Byte(a[j ])-48;
if l>0 then
begin
if l<4 then
begin
aa[m] := Char(((Byte(a[j ])-48)*(Byte(a[j])-48))+48);
m:=m+1;
aa[m]:=' ' ;
m:=m+1;
i:=i+1;
end
else
begin
l:=l*l;
aa[m] := Char((l div 10)+48);
m:=m+1;
aa[m] := Char((l mod 10)+48);
m:=m+1;
i:=i+1;
aa[m]:=' ' ;
m:=m+1;
i:=i+1;
end
end ;
end ;
txtInput.Text := txtInput.Text + Copy(aa, 0, i-2)
end

else

break;

n := n + i;

end;


// txtInput.Text := txtInput.Text + Copy(a, 0, l) ;

CloseHandle(hFile);

Status.SimpleText := Format('ReadFile: %d byte(s)', [n]);


end;



если все работает оформляю ответ.
Об авторе:
to live is to die
Неизвестный
09.11.2010, 17:39
общий
да всё работает!
и последня просьба можно небольшик коментария написать к операторам
давно
Мастер-Эксперт
325460
1469
09.11.2010, 17:50
общий
это ответ
Здравствуйте, Андреев Дмитрий Фёдорович!

изменяем обработчик нажатия на клавишу Read

procedure TForm1.btnReadClick(Sender: TObject);

var hFile : THandle;

a : array[0..1024] of char;
aa : array[0..1024] of char;

i, n : Cardinal;
l, j, m : integer;

begin


// открывае поток на чтение файла
hFile := CreateFile(PChar(txtInf.Text),

GENERIC_READ,

FILE_SHARE_READ or FILE_SHARE_WRITE,

nil,

OPEN_EXISTING,

0,

0);



if hFile = INVALID_HANDLE_VALUE then

begin
// реакция на ошибку открытия файла
Status.SimpleText :='Error during opening file: ' + inttostr(GetLastError());

exit;

end;



txtInput.Text := '';



n := 0;
m:=0;
// читаем файл (не совсем хорошо реализовано, но работает)
while ReadFile(hFile, a, sizeof(a), i, nil) do

begin

if i > 0 then // если вычитали не нулевую длину файла
begin
for j := 0 to i - 2 do // заполняем выходной массив
begin
l:= Byte(a[j ])-48;// получаем числовое значение текстовой переменной
if l>0 then
begin
if l<4 then
begin// если квадрат числа однозначное число
aa[m] := Char(l*l+48);// возводим в квадрат число и преобразовываем к тексту в ASCII
m:=m+1;
aa[m]:=' ' ;// добавляем пробел после числа
m:=m+1;
i:=i+1;
end
else
begin
l:=l*l;// ЕСЛИ ДВУЗНАЧНОЕ
aa[m] := Char((l div 10)+48);// получаем старшую часть числа и преобразовываем в текст
m:=m+1;
aa[m] := Char((l mod 10)+48);// получаем младшую часть числа и преобразовываем в текст
m:=m+1;
i:=i+1;
aa[m]:=' ' ;// добовляем пробел после числа
m:=m+1;
i:=i+1;
end
end ;
end ;
txtInput.Text := txtInput.Text + Copy(aa, 0, i-2) // выводим текст в нужную область
end

else

break;

n := n + i;

end;


CloseHandle(hFile);// закрываем поток работы с файлом

Status.SimpleText := Format('ReadFile: %d byte(s)', [n]);


end;
5
Огромное Спасибо За Помощь!!!!
Об авторе:
to live is to die
Форма ответа