Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [pascal] матрица, прогу написал, нужно проверить, удалить столбец в котором все числа <0 
:(
    Опции темы
doda
Дата 11.6.2010, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 9.3.2010

Репутация: нет
Всего: нет



В матрице удалить столбцы, в которых все числа меньше нуля. 
вот код:
uses crt;
type
mas=array[1..50,1..50]of integer;
var n,m,i,j:byte;
a: mas;

procedure inp( n: integer; m: integer; var a: mas);
var i, j: integer;
begin
randomize;
for i:=1 to n do
 for j:=1 to m do
a[i,j]:=random(50)-2;
end;

procedure print( n: integer; m: integer; var a: mas);
var i, j: integer;
begin
for i:=1 to n do  begin
for j:=1 to m do
write(a[i,j]:6);
writeln;
end;
end;

procedure del (var a:mas);
var i, j: integer;
begin
for i:=1 to n do begin
for j:=1 to m do
if a[i,j]<0 then
for i:=1 to n do
for j:=1 to m-1 do
a[i,j]:=a[i,j-1];
end;
end;

begin
clrscr;
write('Kolichestvo strok n=');readln(n);
write('Kolichestvo stolbcov m=');readln(m);

writeln('      Ishodnaya matrica       ');
inp(n,m,a);
print(n,m,A);
end.




что неправильно?

PM MAIL   Вверх
ФедосеевПавел
Дата 11.6.2010, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 2
Всего: 10



Надеюсь, что ты сам уже разобрался...
Но тем не менее добавлю от себя.

1. В основной программе есть ввод исходной матрицы, вывод результата, но нет обработки (удаления столбца).
2. Процедура обработки del выглядит ужасно. Внутри циклов повторно используются переменные цикла (i и j).
3. Т.к. задание
Цитата(doda @  11.6.2010,  13:24 Найти цитируемый пост)
В матрице удалить столбцы, в которых все числа меньше нуля. 

то предлагаю организовать алгоритм так:
п.1. Просматриваем первую строку (т.е. a[1,j]). Если a[1,j]<0, то просматриваем j-й столбец на предмет выполнения условия a[i,j]<0.
п.2. Если для всего j-того столбца условие выполнилось, то удалить j-й столбец.
п.3. Если столбец удалялся, то j остаётся без изменения и переход на п.1. Если удаления не было, то Inc(j) и опять на п.1.

Из-за п.3 цикл по j не может быть for, а только while.

Удаление столбца можно вынести в отдельную процедуру или не жалеть индексных переменных, при помощи которых и организовать сдвиг.
Кроме того, организовав матрицу по другому (изменив определение типа) можно возложить часть работы со "своих рук" на "голову компилятора". Посмотри здесь про обмен столбцов. На базе этого и удаление сам составишь...

Я верю в тебя...
Да что - я?
Весь форум замер в ожидании решения...
PM   Вверх
doda
Дата 12.6.2010, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 9.3.2010

Репутация: нет
Всего: нет



ну вообщето я разобрался с этой задачей, но есть ещё одна посмотрите?

Найти столбец с минимальным средним арифметическим чётных чисел.

вот код:
uses crt;
type                                                                                                                                                             mas=array[1..n, 1..m]of integer;                                                                                                                 mas2= array[1..n]of integer; 
var
a: mas;
b:mas2;
var 
i,j,n,m:integer;
suma:real;
arifm:real;

procedure vvod (var a:mas; var n,m: integer);
var i,j: integer;  
begin
writeln('Vvedite kolichestvo strok ');
readln(n);
writeln('Vvedite kolichestvo stolbcov ');
readln(m);
randomize;
for i:=1 to n do begin
for j:=1 to m do
a[i,j]:=random(20);
end;
end;

procedure vivod(a:mas);
begin
for i:=1 to n do
begin
for j:=1 to m do
write(a[i,j]:6);
writeln;
end;
end;

procedure arifm (var a:mas; var b: mas2; var s:real; n,m: integer);
var i,j: integer;
begin
for i:=1 to m do
begin
s:=0;
for j:=1 to n do
begin
s:=a[j,i]+s;
end;
b[i]:=s/n;
end;
end;

procedure vivodB;
begin
for i:=1 to m do
write('   ',b[i]:2:1);
end;
                                                                                                                                   
begin
clrscr;
vvod;
vivod;
arifm;
writeln;
write('A)');
vivodB;
writeln;
readln;
end.

ну?


PM MAIL   Вверх
ФедосеевПавел
Дата 12.6.2010, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 2
Всего: 10



Цитата(doda @  12.6.2010,  17:53 Найти цитируемый пост)
ну?

И?

Я так понимаю цитируемая фраза переводится как "как найти кнопку "КОД" на форме ввода?"

Да, совершенно верно, она в правом верхнем углу формы ввода. И ею (кнопкой) можно,  НУЖНО пользоваться, чтобы откликнувшиеся на призыв
Цитата(doda @  12.6.2010,  17:53 Найти цитируемый пост)
ну?

не тратили время на переформатирование чужого кода.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0785 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.