Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Кто-нибудь может помочь с решением? (http://www.tehnari.ru/f41/t82188/)

Student 14.12.2012 09:56

Кто-нибудь может помочь с решением?
 
На Паскале
1
Создать типизированный файл целых чисел. Записать в него с консоли последовательность целых чисел, конец последовательности (терминатор) – ноль, который не записывается в файл. Определить первое по порядку отрицательное и последнее положительное числа и их позиции в файле (нумерация данных в файле начинается с нуля). Предусмотреть случай, когда таких чисел в файле нет. Удалить из файла все числа, находящиеся между ними.
2
Создать текстовый файл, в который построчно записать прямоугольный массив massivnm, заполненный целыми случайными числами в диапазоне от v_min до v_max. Размеры массива n и m задать константами. Границы диапазона v_min и v_max задать с консоли. Определить второй максимальный и второй минимальный элементы в файле и поменять их местами. При чтении из файла считать размеры массива неизвестными. Определить их при чтении файла.

Размеры создаваемых файлов считать заранее неизвестными и определять их при чтении файлов. При чтении из файла массивы не использовать. Можно использовать рабочие файлы.

Léon 14.12.2012 10:11

Помочь можем. А что не получается? Где наработки?

Léon 15.12.2012 02:09

Цитата:

Сообщение от Student (Сообщение 833254)
1
Создать типизированный файл целых чисел. Записать в него с консоли последовательность целых чисел, конец последовательности (терминатор) – ноль, который не записывается в файл. Определить первое по порядку отрицательное и последнее положительное числа и их позиции в файле (нумерация данных в файле начинается с нуля). Предусмотреть случай, когда таких чисел в файле нет. Удалить из файла все числа, находящиеся между ними.

Код:

uses crt;
var f:file of integer;
    a,b,mx1,mx2,mn1,mn2,imx1,imx2,imn1,imn2,i,k1,k2,k:integer;
begin
//создание файла
assign(f,'file');
rewrite(f);
writeln('Введите в файл целые числа, окончание ввода 0:');
repeat
read(a);
if a<>0 then write(f,a);
until a=0;
clrscr;
//вывод на экран
writeln('Содержание исходного файла:');
reset(f);
//если нет 2 элементов
if filesize(f)<2 then
 begin
  writeln('Вы ввели менее двух чисел, поиск не возможен');
  close(f);
  exit;
 end;
 //если есть
while not eof(f) do
 begin
  read(f,a);
  write(a,' ');
 end;
writeln;
seek(f,0); //в начало файла
read(f,a);//первое число
seek(f,1);
read(f,b); //второе
if a>b then //выбираем первые мин и макс
 begin
  mx1:=a;
  imx1:=0;
  mx2:=b;
  imx2:=1;
  mn1:=b;
  imn1:=1;
  mn2:=a;
  imn2:=0;
 end
else
 begin
  mx1:=b;
  imx1:=1;
  mx2:=a;
  imx2:=0;
  mn1:=a;
  imn1:=0;
  mn2:=b;
  imn2:=1;
 end;
 //если только 2 элемента, удалять нечего
if filesize(f)=2 then
 begin
  writeln('Второе максимальное=',mx2,' его позиция=',imx2);
  writeln('Второе минимальное =',mn2,' его позиция=',imn2);
  writeln('Элементов для удаления нет');
  close(f);
  exit;
 end;
// если больше
for i:=2 to filesize(f)-1 do //от третьего до последнего
 begin
  seek(f,i);
  read(f,a);
  if a>mx1 then //первый макс
  begin
    imx2:=imx1;//старый первый удет вторым
    mx2:=mx1;
    imx1:=i;
    mx1:=a; //первй новый
  end
  else if a>mx2 then//если второй
  begin
    imx2:=i;
    mx2:=a;//он сменится, первый нет
  end;
  if a<mn1 then  //так же с минимальными
  begin
    imn2:=imn1;
    mn2:=mn1;
    imn1:=i;
    mn1:=a;
  end
  else if a<mn2 then
  begin
    imn2:=i;
    mn2:=a;
  end;
 end;
writeln('Первый максимальный=',mx1,' второй=',mx2,' его индекс=',imx2);
writeln('Первый минимальный =',mn1,' второй=',mn2,' его индекс=',imn2);
if imx2<imn2 then //если макс меньше, поменяем
 begin
  a:=imx2;
  imx2:=imn2;
  imn2:=a;
 end;
writeln('Удаляем элементы с номерами ',imn2+2,'...',imx2);//номер на 1 больше индекса
if imx2-imx1<=2 then //если они рядом
 begin
  write('Элементов для удаления нет');
  close(f);
  exit;
 end;
k:=0;
for i:=imx2 to filesize(f)-1 do//от 2 макс до конца
 begin
  seek(f,i);
  read(f,a);
  k:=k+1;
  seek(f,imn2+k);//все поднимем вверх за 2 мин
  write(f,a);
 end;
seek(f,filesize(f)-(imx2-imn2-1));//отступаем от конца на кол. удаляемых элементов
truncate(f);//обрезаем пустое
seek(f,0); //вывод результата
writeln('Удаление элементов между вторым минимальным и вторым максимальным:');
while not eof(f) do
 begin
  read(f,a);
  write(a,' ');
 end;
close(f);
end.


Léon 15.12.2012 02:30

Цитата:

Сообщение от Student (Сообщение 833254)
2
Создать текстовый файл, в который построчно записать прямоугольный массив massivnm, заполненный целыми случайными числами в диапазоне от v_min до v_max. Размеры массива n и m задать константами. Границы диапазона v_min и v_max задать с консоли. Определить второй максимальный и второй минимальный элементы в файле и поменять их местами. При чтении из файла считать размеры массива неизвестными. Определить их при чтении файла.

Код:

uses crt;
const n=5;
      m=7;
var a:array[1..n,1..m] of integer;
    vmin,vmax,i,j,x,y,mx,mn,imx,jmx,imn,jmn,z:integer;
    f:text;
begin
clrscr;
randomize;
assign(f,'123.txt');
rewrite(f);
repeat
writeln('Введите границы диапaзона чисел:');
readln(vmin,vmax);
until vmin<vmax;
{создаем файл}
for i:=1 to n*m do
 begin
  x:=vmin+random(vmax-vmin+1);
  write(f,' ',x);{пишем числа через пробел}
  if (i mod m=0)and(i<n*m) then writeln(f);{новая строка}
 end;
writeln('Исходный массив:');
reset(f);
y:=0;{определим кол. чисел в 1 строке}
while not eoln(f) do
 begin
  read(f,x);
  y:=y+1;
 end;
close(f);
reset(f);
{прочитаем всю матрицу}
x:=0;
while not eof(f) do
 begin
  x:=x+1;
  for j:=1 to y do
  begin
    read(f,a[x,j]);
    write(a[x,j]:5);
  end;
  writeln
end;
close(f);
writeln;
{найдем мин и макс с координатами}
mn:=a[1,1];imn:=1;jmn:=1;
mx:=a[1,1];imx:=1;jmx:=1;
for i:=1 to x do
for j:=1 to y do
 begin
  if a[i,j]<mn then
  begin
    mn:=a[i,j];
    imn:=i;
    jmn:=j;
  end;
  if a[i,j]>mx then
  begin
    mx:=a[i,j];
    imx:=i;
    jmx:=j;
  end;
 end;
writeln('Минимальный  элемент [',imn,',',jmn,']=',mn);
writeln('Максимальный элемент [',imx,',',jmx,']=',mx);
writeln;
{обменяем их и выведем новый массив}
z:=a[imn,jmn];a[imn,jmn]:=a[imx,jmx];a[imx,jmx]:=z;
writeln('Обмен минимального и максимального:');
for i:=1 to x do
 begin
  for j:=1 to y do
  write(a[i,j]:5);
  writeln;
 end;
readln
end.


Jogi 20.12.2012 09:49

Вот в первой программе, можете показать где именно идет удаление, и что то не очень понимаю как изменить чтобы удалялось не между мин2 и мах2 а наоборот за ними))

Student 24.12.2012 16:49

Angela, спасибо огромное за помощь))
Только в первом задании не нужно было искать второй макс. и второй мин. - это нужно было во 2ой задачи. Я вроде переделал, вторая работает отлично, а вот в первой у меня не удаляет между макс. и мин. все равно... Может подскажете? все-таки ваш код))


Часовой пояс GMT +4, время: 06:31.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.