IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Задача по файлам, Помогите исправить
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


Знач так, дан файл f компонентами которого являеются целые числа. Файл создается с такими компонентами y = -5 + random (10). Сформировать новый файл g следующим образом: переписать содержимое файла f так, что бы сначала шли положительные числа, потом нули, а потом отрицательные числа, сохраняя порядок следования чисел.
Криво, косо, но вот что получилось:

Program Raz3_3;
uses crt;
var
 f1,f2,f3,f4:text;
 x1,t,l,y,k,i,s,n:integer;
Begin
 clrscr;
 assign (f1,'file.txt');
 rewrite (f1);
 for k:=1 to n do
  begin
  y:=-5+random(10);
  write(f1,y,' ');
  end;
 s:=0;
 l:=0;
 t:=0;
 reset (f1);
 assign (f2,'posit.txt');
 assign (f3,'zero.txt');
 assign (f4,'negat.txt');
 reset (f1);
 rewrite (f2);
 rewrite (f3);
 rewrite (f4);
 for i:=1 to n do
  begin
  read (f1, x1);
  if x1>0 then
   begin
   write (f2,x1,' ');
   t:=t+1;
   end
  else
   begin
   if x1=0 then
    begin
    write (f3,x1,' ');
    s:=s+1
    end
   else
    begin
    write (f4,x1,' ');
    l:=l+1;
    end;
   end;
  end;
  reset (f3);
  append (f2);
  for i:=1 to s do
   begin
   read (f3, x1);
   write (f2,x1,' ');
   end;
  close(f1);
  close(f2);
  close(f3);
  close(f4);
 end.


Пли-и-из, оч прошу помочь тугодуму заставить это сырое нечто работать :molitva:

ЗЫ Эх, мне бы еще научиться, как сделать так, что бы найти в текстовом файле строкус максимальным количеством слов и вывести ее на экран, но я понимаю, что за бесплатно таки вещи не делаются... Но если вдруг очень добрая и бескорыстная душа найдется... -___-


--------------------
Ceterum censeo Cartaginem esse delendam О_о
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Ну, вот что я нашаманил :D
Program Raz3_3;
uses crt;

const
  n = 20;

var
  f_in, f_out: text;
  i, y, zeroes: integer;

begin
  clrscr;
  assign(f_in,'file_001.txt');
  rewrite(f_in);
  for i := 1 to n do begin
    y := -5 + random(10);
    write(f_in, y, ' ')
  end;
  assign(f_out,'file_002.txt');
  rewrite(f_out);

  { первый проход по файлу - переносим положительные числа }
  { и считаем количество нулей }
  reset(f_in); zeroes := 0;
  while not seekeof(f_in) do begin
    read(f_in, y);
    if y > 0 then write(f_out, y, ' ')
    else if y = 0 then inc(zeroes);
  end;

  { пишем столько нулей в выходной файл, сколько насчитали }
  y := 0;
  for i := 1 to zeroes do
    write(f_out, y, ' ');

  { переходим на начало исходного файла и пишем все отрицательные числа }
  reset(f_in);
  while not seekeof(f_in) do begin
    read(f_in, y);
    if y < 0 then write(f_out, y, ' ')
  end;
  close(f_out);
  close(f_in);
end.

как видишь, 4 файла использовать совершенно не обязательно... Да и переменных у тебя много лишних было.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


Домо АРИГАТО :D :p9:

Do itashi mashite :yes:

Сообщение отредактировано: volvo -


--------------------
Ceterum censeo Cartaginem esse delendam О_о
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


Эм.. А вот еще маленький вопросик.. unsure.gif
Вы уж извиняйте за невменяемость, просто я в паскале совсем того... Вот, короче, если у меня из файла берутся компоненты, удовлетворяющие определенным условиям (ну, <1 или >8 в данном случае), то как записать операцию нахождения их среднего арифметического? Ну, я ж не знаю, сколько их там всего... Ну, вот такое вот я глупое. sad.gif


--------------------
Ceterum censeo Cartaginem esse delendam О_о
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






s := 0; count := 0;
while not eof(f) do begin
  read(f, x);
  if { нужное условие } then begin
    s := s + x; inc(count);
  end;
end;

if count <> 0 then
  {среднее арифметическое} := s / count;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 46
Пол: Мужской

Репутация: -  0  +


а подскажи те мне плиз. если взять тот же исходник Roise и те же начальные условия, но чтобы формировался файл g следующим образом: в файле g перед каждым положительным числом ставился ноль
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Тогда меняй соответствующий фрагмент на:
var z: integer;
...
  { первый проход по файлу - переносим положительные числа }
  { и считаем количество нулей }
  reset(f_in); z := 0;
  while not seekeof(f_in) do begin
    read(f_in, y);
    if y > 0 then write(f_out, z, ' ', y, ' ')
    else if y = 0 then inc(zeroes); { если не нужно - это можно убрать }
  end;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 46
Пол: Мужской

Репутация: -  0  +


огромное спасибо!!!!!
а вот еще прогу мона сделать?

дан текстовый файл, содержащий строки. удалить из строк знаки такие как @ # $ %

исходник буквы удаляет

Код

program P3_4;
uses crt;
var
a,b,p:char;
f,f1: text;
begin
clrscr;
p:=' ';
assign (f,'proekt.txt');
rewrite (f);
for a:='A' to 'z' do
write (f,a);
assign (f1,'chistka.txt');
reset (f);
rewrite (f1);
while not eof (f) do
     begin
     read (f,b);
     case b of
     'A','B','C','D','E','X','Y':write (f1,p)
     else
     write (f1,b);
     end;
     end;
close (f);
close(f1);
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Ну так сделай наоборот...
case b of
  '@','#','$','%' : write( f1, p )
  else write ( f1, B );
end;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 46
Пол: Мужской

Репутация: -  0  +


А это нормально, что прога текст файлов qwe i nda переделывает в ангийский алфавит? или я неправильно что-то делаю?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Какие символы задаешь, такие и получишь в результате. Программа-то тут при чем? Она просто отсекает НЕ буквы...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


Ой, последний вопрос, ПЛИИИИЗ >___<
И я отвяжусь, честно. Но просто ОЧеНЬ надо (хех, знаю, как и всем остальным)

Но прошу только одну строчку: как определить количество слов (отделяются пробелами) в строке? Я FAQ смотрел, но че-то не врубаюсь все равно

Сообщение отредактировано: Roise -


--------------------
Ceterum censeo Cartaginem esse delendam О_о
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Цитата(Roise @ 26.05.05 22:00)
как определить количество слов (отделяются пробелами) в строке? Я FAQ смотрел, но че-то не врубаюсь все равно

Лучше чем там я все равно сделать не смогу... Тот алгоритм уже отлажен, зачем же нужно переписывать его еще раз?

Что именно не ясно в алгоритме из FAQ-а ?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


Ну, если у меня кроме пробелов других разделителей не учитывается, то здесь
Function GetWords(s: String; Var mas: TWords;

  delimiters: TDelimiter): Byte;
вместо TDelimeter надо просто ' ' написать? И вот этого куска
 { Заменяем все разделители пробелами }

    For i := 1 to Length(s) Do

      If s[i] In delimiters Then s[i] := #32;
не надо тогда писать?
Да, и еще, фунция просто определяет число слов и все, да? Т.е. что бы потом узнать, в какой из строк у меня слов больше всего, мне нужно просто присвоить этому значению какую-нить переменную MAX , а потом проверить, если GetWords другой строки >MAX, то присвоить МАХ уже этой строке.. Так?


--------------------
Ceterum censeo Cartaginem esse delendam О_о
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гость






Цитата(Roise @ 26.05.05 22:54)
вместо TDelimeter надо просто ' ' написать?

:no: Смотри внимательнее пример использования... Там написано:
Цитата
Count := GetWords(s, words, []);
А внутри функции ничего менять не надо...

Цитата
что бы потом узнать, в какой из строк у меня слов больше всего, мне нужно просто присвоить этому значению какую-нить переменную MAX , а потом проверить, если GetWords другой строки >MAX, то присвоить МАХ уже этой строке.. Так?

Именно так !!!
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


{ Заменяем все разделители пробелами }
For i := 1 to Length(s) Do
  If s[i] In delimiters Then s[i] := #32;

- я просто не понимаю тогда, зачем заменять все разделители пробелами О_о И что значит #32?


--------------------
Ceterum censeo Cartaginem esse delendam О_о
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






Да что ты привязался к этим разделителям???
Это что, для красоты сделано?
 If s[i] In delimiters then ...

Если множество разделителей пустое (а [] это именно пустое множество) - то In будет возвращать False и никаких замен произведено не будет !!! Ты что же думаешь, в FAQ что попало заносится? Все функции протестированы, причем не на одном десятке примеров...

А #32 - это код пробела...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


Да не в коей мере не сомневаюсь в работоспособности этих функций, спрашиваю просто потому, что мне ведь потом объяснять придется, как прога работает smile.gif СПАСИБО


--------------------
Ceterum censeo Cartaginem esse delendam О_о
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Новичок
*

Группа: Пользователи
Сообщений: 46
Пол: Мужской

Репутация: -  0  +


А помогите переделать. есть созданный текстовый файл, где слова разделяются пробелами. Надо найти строки в которых 5 слов и удалить из этих строчек 2 последних слова.
исходник на удаления строчек длиной 10 символов
Program P1_5;

Uses CRT;
Var
f1,f2:text;
s:string;
Begin
CLRSCR;
Assign (f1,'z5.txt');
reset(f1);
Assign(f2,'chistka.txt');
Rewrite(f2);
While not eof(f1) do
      begin
      Readln (f1,s);
      if length(s)=10 then s:='';
      Writeln(f2,s);
      end;
Writeln;
Close(f1);
Close(f2);
Readln;
End.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


что-то я не очень понял что ты сделал в своей проге ... вот удаление из строки 4-го и 5-го слова, состоящих из 5-ти букв :

uses crt;
var
   s:string;
   i,bword,count,count1:integer;

Begin
   clrscr;
   readln(s);
   i:=1;
   count:=0;
   while i<=length(s) do
    begin
       while(i<=length(s))and(s[i]=#32) do
        inc(i);
       if i<=length(s) then
        begin
           inc(count);
           bword:=i;
           count1:=0;
           while(i<=length(s))and(not(s[i]=#32)) do
            begin
               inc(i);
               inc(count1);
            end;
           if ((count=4)or(count=5))and(count1=5) then
            begin
               delete(s,bword,i-bword);
               i:=bword;
            end
        end;
    end;

    writeln(s);
    readln;
end.






Добавлено : Это не совсем верно, перед этим надо проверить сколько слов в строке и если в ней пять слов, то можно просто пойти с конца и удалить первые два.

Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 15.04.2025 12:11
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name