• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Застопорился в написании вектора

  • Автор темы Автор темы furt123
  • Дата начала Дата начала

furt123

Новые
Регистрация
6 Дек 2013
Сообщения
25
Реакции
0
Баллы
0
Застопорился в написании вектора

подскажите как сделать так чтобы выводило только 1й отрицательный эл-нт (k), а не всеtehno015


const
n1 = 20;

type
index1 = 1..n1;
index2 = 1..n1;
vectorA = array[index1] of Integer;
vectorB = array[index2] of Integer;

var
n, i: index1;
m, j: index2;
k: Integer;
A: vectorA;
B: vectorB;

begin
write('количество элементов n= ');
readln(n);
writeln('_____________________________________');
writeln('вектор (А):');
for i := 1 to n do
begin
A := random(41) - 20;
write(A:5);
end;
writeln;
writeln('_____________________________________');
for i := 1 to n do
if ((A) < 0) then
begin
k := (A);
writeln(k);
end;

end.
 
всё, уже не нужно. сделал с помощью break;
но если кто знает ещё способы - поделитесь пож-та.
 
всё, уже не нужно. сделал с помощью break;
но если кто знает ещё способы - поделитесь пож-та.
Пожалуйста. Но прежде позволю себе выразить поддержку Вашей неудовлетворенности найденным способом решения: все эти "break", равно как и переходы по меткам, следует применять только в каких-то экзотических случаях, а вообще стараться обходиться без них.
Код:
const
 n1 = 20;

type
 index1 = 1..n1;
 vectorA = array[index1] of Integer;
var
 n,i:byte;
 A: vectorA;

begin
 write('количество элементов n= ');
 readln(n);
 writeln('_____________________________________');
 writeln('вектор (А):');
 for i := 1 to n do
 begin
  A[i] := random(41) - 20;
  write(A[i]:5);
 end;
 writeln;
 writeln('_____________________________________');
 i:=0;
 Repeat
  Inc(i);
  if A[i]<0 then writeln(A[i]:5);
 Until (A[i]<0) or (i=n);
end.
 
благодарю)
да, я прочитал, что применение подобных способов выхода из цикла не приветствуют.
 
оу. прошу прощения. не правильно поставил задачу. здесь нужно не вывести (вывести я просил для наглядности), а именно присвоить значение первого отр эл-та вектора значению (k). поэтому вопрос актуален.
 
оу. прошу прощения. не правильно поставил задачу. здесь нужно не вывести (вывести я просил для наглядности), а именно присвоить значение первого отр эл-та вектора значению (k). поэтому вопрос актуален.
Да, это, конечно "радикально" меняет дело :D :
Код:
...
var
 n,i:byte;
 A: vectorA;
 k:integer;

begin
 ...
 i:=0;
 k:=0;
 Repeat
  Inc(i);
  if A[i]<0 then
   begin
    k:=A[i];
    writeln(k:5);
   end;
 Until (k<0) or (i=n);
end.
 
А вас не смущает тот факт что создается массив из 20 элементов а забивается произвольное количество n, заданное пользователем?

а что плохого в break? если конечно в цикле нет манипуляций с памятью
 
А вас не смущает тот факт что создается массив из 20 элементов а забивается произвольное количество n, заданное пользователем?
Нет. Если нужно больше, константу легко поменять. Хоть на 1000.
а что плохого в break? если конечно в цикле нет манипуляций с памятью
Да в принципе - ничего, можно и так. Просто я считаю, что новичку лучше не привыкать ко всяким там "break", "goto" и прочей лапше, а для начала освоить штатные завершения циклов (предусловие, постусловие), а уж потом, в порядке расширения познаний, разбираться с аварийными вариантами типа "break", а не сразу на них настраиваться.
 
Просто я считаю, что новичку лучше не привыкать
это верно.
константу поменять это конечно не сложно, но лучше приучаться новичкам делать проверки и защиту от дурака.
 
собственно вот для чего это нужно было:

const
n1 = 50;

type
index1 = 1..n1;
index2 = 1..n1;
vectorA = array[index1] of Integer;
vectorB = array[index2] of Integer;

var
n, i: index1;
m, j: index2;
k: Integer;
A: vectorA;
B: vectorB;

begin
write('количество элементов n= ');
readln(n);
writeln('_____________________________________');
writeln('вектор (А):');
for i := 1 to n do
begin
A := random(41) - 20;
write(A:5);
end;
writeln;
writeln('_____________________________________');
i := 0;
repeat
i := i + 1;
if A < 0 then
begin
k := A;
write('первый отрицательный элемент '); write(k);
end;
until (k < 0) or (i = n);
writeln;
writeln('Вектор (В):');
m := 0;
for i := 1 to n do
if ((A) < k) then
begin
m := m + 1;
B[m] := A;
end;
for j := 1 to m do write(B[j]:4);
writeln
end.


посмотрите пожалуйста - не ляпнул ли я чего лишнего?
защит пока не делал.
 
Не прежде, чем мы увидим формулировку задачи.
дан вектор А. сформировать из его элементов вектор В, элементы которого соответствуют условию aj<k, где k - первый отрицательный элемент А.
вот как-то так, хотя я точную формулировку не помню.
 
посмотрите пожалуйста - не ляпнул ли я чего лишнего? защит пока не делал.
Уф, ну заставили Вы меня поломать голову! Ну, прежде всего, и Вы, и я вслед за Вами, не поставили в начале программы оператор инициализации генератора случайных чисел (Randomize). В этом случае транслятор будет генерировать всегда один и тот же массив, что "не есть хорошо". Исправил. Но это не главное.
Видите ли, я ведь не случайно изменил формат переменных n, i, m, j с диапазонов на "byte". Это дало возможность присвоения этим переменным значений, выходящих за границы диапазонов, в частности, i=0 или i=n+1, что было нужно при организации циклов. Так нет же - Вы берёте и возвращаете диапазоны, что, разумеется, тут же приводит к ошибкам.
Ладно. Встал на уши и сохранил Ваши любимые диапазоны. Получите:
Код:
const
 n1 = 50;

type
 index1 = 1..n1;
 index2 = 1..n1;
 vectorA = array[index1] of Integer;
 vectorB = array[index2] of Integer;

var
 n,i:index1;
 m,j:index2;
 k: Integer;
 A: vectorA;
 B: vectorB;

begin
 Randomize;
 write('количество элементов n= ');
 readln(n);
 writeln('_____________________________________');
 writeln('вектор (А):');
 for i := 1 to n do
  begin
   A[i] := random(41) - 20;
   write(A[i]:5);
  end;
 writeln;
 writeln('_____________________________________');
 i:=1;
 k:=0;
 repeat
  if A[i]<0 then
   begin
    k:=A[i];
    write('первый отрицательный элемент '); write(k);
   end;
  if i<n then i:=i+1;
 until (k<0) or (i=n);
 If (i=n) and (k=0) and (A[n]<0) then k:=A[n];
 writeln;
 If k<0 then
  begin
   writeln('Вектор (В):');
   m:=1;
   for i:=1 to n do
    if A[i]<k then
     begin
      B[m]:=A[i];
      m:=m+1;
     end;
   m:=m-1;
   for j:=1 to m do write(B[j]:4);
   writeln;
  end;
  readln
end.
 
спасибо большое)
Видите ли, я ведь не случайно изменил формат переменных n, i, m, j с диапазонов на "byte". Это дало возможность присвоения этим переменным значений, выходящих за границы диапазонов, в частности, i=0 или i=n+1, что было нужно при организации циклов.
я даже не делитант в програмировании.. если не трудно - обьясните смысл этого типа или дайте ссылку на адекватное обьяснение.
с ваших слов понял, что byte для того и используется, чтобы можно было безошибочно выходить за границы массива.
 
спасибо большое)

я даже не делитант в програмировании.. если не трудно - обьясните смысл этого типа или дайте ссылку на адекватное обьяснение.
с ваших слов понял, что byte для того и используется, чтобы можно было безошибочно выходить за границы массива.
Byte - это любое целое число от 0 до 255. А Вы задаете диапазон, т.е. позволяете переменной изменяться только в пределах этого диапазона, в данном конкретном случае от 1 до n1. Поэтому если в ходе выполнения программы мне нужно, например, присвоить исходное значение 0, или же поставить прерывание цикла при значении переменной n1+1, то, если заданы диапазоны, возникнет ошибка.
 
Byte - это любое целое число от 0 до 255. А Вы задаете диапазон, т.е. позволяете переменной изменяться только в пределах этого диапазона, в данном конкретном случае от 1 до n1. Поэтому если в ходе выполнения программы мне нужно, например, присвоить исходное значение 0, или же поставить прерывание цикла при значении переменной n1+1, то, если заданы диапазоны, возникнет ошибка.
это понятно.
не понятно - почему именно byte, а не integer или word например. может у byte какое-то особое предназначение)
или это по сути тот же integer, только в диапазоне от 0 до 255?
 
Назад
Сверху