Консультация № 185176
14.01.2012, 14:34
51.74 руб.
0 26 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
Дан массив, который содержит целые числа. Найти числа, делящиеся на 3 и не делящиеся на 7 и записать их в файл. Решить задачу, используя потоки (TFileStream)
Проект без потоков p2-4.zip (4.0 кб)
Спасибо

Обсуждение

давно
Академик
20764
1861
14.01.2012, 16:37
общий
Интересно, куда в этом задании предполагается пристроить потоки.
давно
Академик
320937
2216
14.01.2012, 16:54
общий
Адресаты:
Цитата: Хватов Сергей
Интересно, куда в этом задании предполагается пристроить потоки.
Не знаю.
давно
Профессор
230118
3054
14.01.2012, 16:56
общий
Адресаты:
Потоки заменяют обычные операции с файлами. Просьба никому не делать, я уже заканчиваю.
давно
Академик
20764
1861
14.01.2012, 17:18
общий
Цитата: Асмик Гаряка
Потоки заменяют обычные операции с файлами. Просьба никому не делать, я уже заканчиваю.
Да ради бога!
Только они не заменяют вывод, а становятся лишним и совершенно не нужным дополнением. Если бы надо было выводить в окно графической программы, я бы ещё понял (и то с оговоркой), а тут они - как седло на корове. От таких заданий только отвращение к технологии может возникнуть.
давно
Академик
320937
2216
14.01.2012, 17:20
общий
Адресаты:
Цитата: Асмик Гаряка
Просьба никому не делать
По правилам можно хоть 100 ответов давать, тем более, что на Delphi вряд ли будут два одинаковых.
давно
Профессор
230118
3054
14.01.2012, 17:22
общий
это ответ

Проект с потоками скачать файл p2-4.rar [168.6 кб]
давно
Академик
320937
2216
14.01.2012, 17:40
общий
14.01.2012, 17:43
Адресаты:
Асмик Александровна! А без переменной j никак нельзя? Переменной i присваиваете 1 и тут же цикл for i:= 1 to..j
давно
Профессор
230118
3054
14.01.2012, 17:45
общий
Адресаты:
Напишем цикл while (filestream.Position = filestream.Size) и обойдемся
давно
Академик
320937
2216
14.01.2012, 17:48
общий
Адресаты:
Цитата: Асмик Гаряка
Напишем цикл while (filestream.Position = filestream.Size) и обойдемся
Вы напишете?
давно
Профессор
230118
3054
14.01.2012, 17:50
общий
Адресаты:
Ну это от старого кода осталось.
давно
Академик
320937
2216
14.01.2012, 21:46
общий
Адресаты:
В строке 87 пропущен апостроф, ошибка при компиляции.
s:= s + результат'+#13#10;
давно
Академик
320937
2216
14.01.2012, 21:50
общий
Адресаты:
Код:

Build
[Warning] u2_4.pas(56): Variable 'filestream' might not have been initialized
[Hint] u2_4.pas(34): Variable 'f' is declared but never used in 'TForm1.Button1Click'

давно
Академик
320937
2216
15.01.2012, 10:13
общий
15.01.2012, 10:14
Доброе утро, уважаемые коллеги. Вот код из ответа на 15.01.2012 10:11
Ошибка при компиляции в строке 87 (обнаружена 14.01.2012 в 21.46, см. посты выше)
Код:
unit u2_4;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
MaxN=100;
var
n: integer;
f: file of integer;
y: integer;
fname: string;
v: array[1..MaxN] of integer;
i: integer;
s: string;
filestream: TFileStream;
begin
// ???????? ???????
randomize;
n:= 20;
s:='';
for i:= 1 to n do
v[i] := random(101);

// ?????? ? ????
fname := 'f.dat';

//AssignFile(f,fname);
try
filestream := TFileStream.Create(fname,fmCreate);

//rewrite(f);
for i:= 1 to n do
if (v[i] mod 3=0) and (v[i] mod 7<>0) then
// write(f, v[i]);
begin
filestream.Write(v[i], SizeOf(integer));
end;


finally
//closeFile(f);
filestream.Free;
end;

// ?????? ???????
s:= 'Массив'+ #13#10;
Memo1.Clear;
for i:= 1 to n do
begin
s:= s + IntToStr(v[i])+#9;
if i mod 10 = 0 then
s:=s+#13#10;
end; { for }
s:= s+#13#10;

s:= s+'файл '+ fname+#13#10;
// reset(f);
try
filestream := TFileStream.Create(fname,fmOpenRead);
i:= 1;

s:= s + результат'+#13#10;
while (filestream.Position <> filestream.Size) do
begin
// read(f,y);
filestream.Read(y,SizeOf(integer));
s:= s + IntToStr(y)+#9;
if i mod 10 = 0 then
s:=s+#13#10;
inc(i);
end; { for }
finally
// closeFile(f);
filestream.Free;
end;

Memo1.Lines.Add(s);
end;

end.
К тому же нет комментариев на ту часть, ради которой вопрос задавался, т. е. на потоки.
давно
Академик
320937
2216
15.01.2012, 10:57
общий
Прочитал методичку, исправил код. Всем спасибо.
Код:
unit u2_4;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
MaxN=100;
var
n: integer;
y: integer;
fname: string;
v: array[1..MaxN] of integer;
i: integer;
s: string;
filestream: TFileStream;
begin
// Создание массива
randomize;
n:= random(100)+1;
for i:= 1 to n do
v[i] := random(101)-50;

// Запись в файл
fname := 'f.dat';
try
filestream := TFileStream.Create(fname,fmCreate);
for i:= 1 to n do
if (v[i] mod 3=0) and (v[i] mod 7<>0) then
filestream.Write(v[i], SizeOf(integer));
finally
filestream.Free;
end;

// Печать массива
s:= 'Массив'+ #13#10;
Memo1.Clear;
for i:= 1 to n do
begin
s:= s + IntToStr(v[i])+#9;
if i mod 6 = 0 then
s:=s+#13#10;
end; { for }
s:= s+#13#10;
s:= s+'Файл '+ fname+#13#10;

try
filestream := TFileStream.Create(fname,fmOpenRead);
i:= 1;
s:= s + 'результат'+#13#10;
while (filestream.Position <> filestream.Size) do
begin
filestream.Read(y,SizeOf(integer));
s:= s + IntToStr(y)+#9;
if i mod 10 = 0 then
s:=s+#13#10;
inc(i);
end; { while }
finally
filestream.Free;
end;
Memo1.Lines.Add(s);
end;

end.

давно
Профессор
230118
3054
15.01.2012, 15:54
общий
15.01.2012, 15:55
Адресаты:
Русские буквы не копируются, пришлось исправлять вручную, нечаянно стерлась кавычка. Вы могли бы мне сразу сказать, а не обращаться к другим.
давно
Мастер-Эксперт
680
2811
15.01.2012, 16:20
общий
Адресаты:
Русские не копируются - ничего страшного, исправьте ответ, написав комментарии транслитом, чтоб в рассылку ушло все в нормальном виде, без вопросиков.
давно
Профессионал
153662
1070
15.01.2012, 16:21
общий
15.01.2012, 16:22
Цитата: Асмик Гаряка
Русские буквы не копируются,
Я в таком случаи сначало вставляю код из делфи в блокнот и всё, из блокнота на портал, а потом просто сменил шрифт в редакторе кода делфи и проблем с копированием нет теперь.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Профессор
230118
3054
15.01.2012, 16:32
общий
Адресаты:
Где менять шрифт?
давно
Академик
320937
2216
15.01.2012, 16:36
общий
15.01.2012, 16:38
Уважаемые коллеги! Как я уже писал ранее, проект я исправил, для чего пришлось использовать методичку.
Код:
unit u2_4;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
MaxN=100;
var
n: integer;
y: integer;
fname: string;
v: array[1..MaxN] of integer;
i: integer;
s: string;
filestream: TFileStream;
begin
// Создание массива
randomize;
n:= random(100)+1;
for i:= 1 to n do
v[i] := random(101)-50;

// Запись в файл
fname := 'f.dat';
try
filestream := TFileStream.Create(fname,fmCreate);
for i:= 1 to n do
if (v[i] mod 3=0) and (v[i] mod 7<>0) then
filestream.Write(v[i], SizeOf(integer));
finally
filestream.Free;
end;

// Печать массива
s:= 'Массив'+ #13#10;
Memo1.Clear;
for i:= 1 to n do
begin
s:= s + IntToStr(v[i])+#9;
if i mod 6 = 0 then
s:=s+#13#10;
end; { for }
s:= s+#13#10;
s:= s+'Файл '+ fname+#13#10;

try
filestream := TFileStream.Create(fname,fmOpenRead);
i:= 1;
s:= s + 'результат'+#13#10;
while (filestream.Position <> filestream.Size) do
begin
filestream.Read(y,SizeOf(integer));
s:= s + IntToStr(y)+#9;
if i mod 10 = 0 then
s:=s+#13#10;
inc(i);
end; { while }
finally
filestream.Free;
end;
Memo1.Lines.Add(s);
end;

end.

Для того, чтобы буквы были в нормальной кодировке, я открываю pas-файл PascalABC.Net
давно
Профессор
230118
3054
15.01.2012, 16:41
общий
Адресаты:
Исправление в 1 символе. Зачем методичка?
давно
Профессионал
153662
1070
15.01.2012, 16:55
общий
Адресаты:
Цитата: Асмик Гаряка
Где менять шрифт?
Для делфи 7: tools - editor options - display - editor font. Для других версий что то подобное: turbo delphi: tools - options - editor options - display - editor font.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Профессор
230118
3054
15.01.2012, 16:59
общий
Адресаты:
Спасибо. Там все равно только типа курьер, а нужен юникод.
давно
Профессионал
153662
1070
15.01.2012, 17:08
общий
15.01.2012, 17:09
Адресаты:
Надо либо курьер кур, либо курьер нью кур, у меня сейчас стоит другая кодовая страница в системе (пришлосб мсенить из-за одной программы) и оба этих шрифтов отображаются правильно, а раньше какой-то из этих двух русский отображал не правильно, пробуйте менять и тестить на портале.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Профессор
230118
3054
15.01.2012, 17:23
общий
15.01.2012, 17:24
Вот так отображается courier new cyr, в notepad копируется все равно неправильно. По-русски, но какой-то рукописный.
Прикрепленные файлы:
166d644dba50b6a5fa30207fde8ef93d.png
давно
Профессор
230118
3054
15.01.2012, 17:24
общий
// Ïå÷àòü ìàññèâà
давно
Профессионал
153662
1070
15.01.2012, 18:21
общий
16.01.2012, 17:43
Адресаты:
courier new cyr:
// проба строки шрифт courier new cur
Код:
implementation

{$R *.dfm}
// проба строки шрифт courier new cyr
end.



courier new:
// проба строки шрифт courier new
Код:
implementation

{$R *.dfm}
// проба строки шрифт courier new
end.


Шрифт в блокноте Lucida Console
А раньше только один из них правильно отображался на портале.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Форма ответа