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

> Правила раздела!

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

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> программа из Уроки от Дмитриева Эдуарда, помогите начинающему разобраться
Данил
сообщение 14.12.2005 20:18
Сообщение #1


Гость






1.По теме "циклы": - напишите программу, печатающую столбик строк такого вида:

1 0 0 0 0 0 0 0 0
0 2 0 0 0 0 0 0 0
0 0 3 0 0 0 0 0 0
0 0 0 4 0 0 0 0 0
0 0 0 0 5 0 0 0 0
0 0 0 0 0 6 0 0 0
0 0 0 0 0 0 7 0 0
0 0 0 0 0 0 0 8 0
0 0 0 0 0 0 0 0 9

я прочитал начиная с первого все уроки и честно сам делал все задания, но не понимаю как эту прогу написать, объясните алгоритм, пожалуйста.... mega_chok.gif
 К началу страницы 
+ Ответить 
klem4
сообщение 14.12.2005 20:38
Сообщение #2


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

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

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


Ты прав, задача очень трудная, вот самое простое решение :

$00401030:	push   %ebp
$00401031: mov %esp,%ebp
$00401033: sub $0x8,%esp
$00401036: mov %ebx,0xfffffff8(%ebp)
$00401039: mov %esi,0xfffffffc(%ebp)
$0040103C: call $4011a0 <fpc_initializeunits>
$00401041: mov $0x0,%cl
$00401043: mov $0x144,%edx
$00401048: mov $0x40a000,%eax
$0040104D: call $401200 <SYSTEM_FILLCHAR$formal$LONGINT$BYTE>
$00401052: movb $0x1,0x40a144
$00401059: decb 0x40a144
$0040105F: nop
$00401060: incb 0x40a144
$00401066: movzbl 0x40a144,%eax
$0040106D: imul $0x24,%eax,%eax
$00401070: movzbl 0x40a144,%edx
$00401077: movzbl 0x40a144,%ecx
$0040107E: mov %ecx,0x409fd8(%eax,%edx,4)
$00401085: cmpb $0x9,0x40a144
$0040108C: jb $401060 <main+48 at __redr.pp:9>
$0040108E: movb $0x1,0x40a144
$00401095: decb 0x40a144
$0040109B: nop
$0040109C: incb 0x40a144
$004010A2: call $401230 <fpc_get_output>
$004010A7: mov %eax,%ebx
$004010A9: call $401260 <fpc_writeln_end>
$004010AE: call $401310 <fpc_iocheck>
$004010B3: movb $0x1,0x40a145
$004010BA: decb 0x40a145
$004010C0: incb 0x40a145
$004010C6: call $401230 <fpc_get_output>
$004010CB: mov %eax,%esi
$004010CD: movzbl 0x40a144,%eax
$004010D4: imul $0x24,%eax,%eax
$004010D7: movzbl 0x40a145,%edx
$004010DE: mov 0x409fd8(%eax,%edx,4),%ecx
$004010E5: mov %esi,%edx
$004010E7: mov $0x0,%eax
$004010EC: call $401390 <fpc_write_text_sint>
$004010F1: call $401310 <fpc_iocheck>
$004010F6: mov $0x20,%cl
$004010F8: mov %esi,%eax
$004010FA: mov $0x0,%ebx
$004010FF: mov %eax,%edx
$00401101: mov %ebx,%eax
$00401103: call $4013f0 <fpc_write_text_char>
$00401108: call $401310 <fpc_iocheck>
$0040110D: mov %esi,%eax
$0040110F: call $4014c0 <fpc_write_end>
$00401114: call $401310 <fpc_iocheck>
$00401119: cmpb $0x9,0x40a145
$00401120: jb $4010c0 <main+144 at __redr.pp:13>
$00401122: cmpb $0x9,0x40a144
$00401129: jb $40109c <main+108 at __redr.pp:11>
$0040112F: call $4014e0 <fpc_get_input>
$00401134: mov %eax,%ebx
$00401136: call $401510 <fpc_readln_end>
$0040113B: call $401310 <fpc_iocheck>
$00401140: call $401690 <SYSTEM_DO_EXIT>
$00401145: mov 0xfffffff8(%ebp),%ebx
$00401148: mov 0xfffffffc(%ebp),%esi
$0040114B: leave
$0040114C: ret
End of assembler dump.




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


Гость






эээ млин если шутите, то несмешно, я только начинаю паскаль.... Эту программу нужно напсать на паскале а не на асемблере...
 К началу страницы 
+ Ответить 
Гость
сообщение 14.12.2005 20:41
Сообщение #4


Гость






ну блин это же наверное несложно, подскажите
 К началу страницы 
+ Ответить 
klem4
сообщение 14.12.2005 20:42
Сообщение #5


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

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

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


ладно не кипятись smile.gif

uses crt;
const
n=9;
var
x : array[1..n,1..n] of integer;
i,j : byte;
begin
fillchar(x, sizeof(x),0); // заполняем весь массив нулями
for i := 1 to n do x[i,i] := i;

for i := 1 to n do begin
writeln;
for j := 1 to n do
write(x[i,j],' ');
end;
readln
end.


диаганальный элемент - элемент и индексов i,i то есть 1,1; 2,2; 3,3; ... итд ;)


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


Гость






klem4 прости я незнал в какой раздел написать, и решил что пусть модератор удалит неправильный вариант...

спасибо большое....
 К началу страницы 
+ Ответить 
Гость
сообщение 14.12.2005 20:47
Сообщение #7


Гость






странно, в этом варианте программы я так понимаю ты используешь двумерный массив, а судя по "Уроки от Дмитриева",которые выложены на этом сайте все должно быть куда проще, т.к. до этой задаче о массивах вообще не упоменалось, только FOR...
 К началу страницы 
+ Ответить 
klem4
сообщение 14.12.2005 20:49
Сообщение #8


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

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

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


for i := 1 to n do begin
writeln;
for j := 1 to n do
if i=j then write(i,' ')
else write(0,' ');
end;


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


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





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

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


воистину все гениальное просто, большое спасибо.. очень полезный у вас портал.... респект good.gif

вот кстати зарегестрировался... smile.gif

Сообщение отредактировано: KENNY - 14.12.2005 21:03
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Altair
сообщение 15.12.2005 2:48
Сообщение #10


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

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


Цитата
Ты прав, задача очень трудная, вот самое простое решение :

и где это скомпилиться? blum.gif rolleyes.gif


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
KENNY
сообщение 15.12.2005 23:08
Сообщение #11





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

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


Вот еще вопрос, нужно посчитать сумму элементов массива расположенных между первым и последнм нулевым эдементами. Все это в однородном массиве, подскажите какова идея решения этой задачи?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 15.12.2005 23:16
Сообщение #12


Гость






Так... это... Идешь с конца массива ДО того как встретишь нулевой элемент, запоминаешь его индекс(это будет последний нулевой)... Потом идешь с начала до первого нулевого (оба эти действия - на цикл While)...

Ну и напоследок - обычным For-ом перебираешь все, что находится между двумя найденными индексами, суммируя при этом элементы...
 К началу страницы 
+ Ответить 
KENNY
сообщение 16.12.2005 0:36
Сообщение #13





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

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


program maasiv1_var3;
const n=10;
var
A: array[1..n] of integer;
B: array[1..n] of integer;
i,j,proiz,nuln,nulk,k,summa,old,new: byte;


begin

proiz:=1;
WRITELN ('VVEDITE N ELEMENTOV MASSIVA');
for i := 1 to n do
read(A[i]);
writeln;

for j:=1 to n do
if odd(j)= false then proiz:=proiz*A[j];
writeln('proizved',proiz);

for j:=n downto 1 do begin
if A[j] = 0 then nuln:=j
else nuln:=0;
end;
for j:=1 to n do begin if A[j]=0 then nulk:=j else nulk:=0;
end;
if j=i then summa:=0 else begin
for j:=nuln to nulk do summa:=summa+A[j];
end;
writeln('summa mezhdu0 ',summa);

for i:=1 to n-1 do
begin new:=A[i];
old:=A[i+1];
k:=i;
if new>A[i+1] then begin
A[i+1]:=new;
A[i]:=old;

end;
end;
for i:=1 to n do writeln(A[i]);
readln;
end.


тута я пытался: сначала найти произведение эл-ов массива с четными номерами, потом сумму эл-ов между первыми последним нулевыми элементами, ну и в конце упорядочить по возростанию... конечно же ничего не получается, ну почему я такой корявый??? blink.gif blink.gif blink.gif
Во, тама кое что изменил, теперь сортирует, а вот произведение неправильно делает....

Сообщение отредактировано: volvo - 3.11.2006 0:27
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 16.12.2005 1:00
Сообщение #14


Гость






Ну, допустим, произведение она как раз правильно считает... Неправильно вычисляется сумма... Смотри, почему...
Вот твой код:
for j:=n downto 1 do begin
if A[j] = 0 then nuln:=j
else nuln:=0; { Вот эта ветка не нужна }
end;
for j:=1 to n do begin
if A[j]=0 then nulk:=j
else nulk:=0; { Эта, соответственно, тоже }
end;

{ разве нужно сравнивать I и J, а не nuln и nulk ? }
if j=i then summa:=0
else begin
for j:=nuln to nulk do summa:=summa+A[j];
end;

Почему Else в обоих случаях не нужен? Потому, что тебе нужно найти позиции нулевых элементов, ненулевые ты должен просто игнорировать, а ты не игнорируешь, а обращаешь на них внимание...
 К началу страницы 
+ Ответить 
KENNY
сообщение 16.12.2005 1:17
Сообщение #15





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

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


VOLVO что бы я без тебя делал!!! Спасибо тебе огромное, тока есть еще один вопрос, как сделать в сортировке так чтоб он нули в начало сувал? а то так как я написал, нули остаются на своих места, хотя остальное нормально выстраивается....

Блин и произведение он неправильно считает... я вот щас вводил элементы:
0
1
3
4
0
2
6
7
8
9
он вывел что произведение =248 а на самом деле 504....

Сообщение отредактировано: KENNY - 16.12.2005 1:18
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 16.12.2005 1:23
Сообщение #16


Гость






Ну, так пользуйся любым из методов сортировки... Например, обычный "пузырек":
for i := 1 to n do
for j := n downto i + 1 do
if a[j - 1] > a[j] then begin
old := a[j - 1]; a[j - 1] := a[j]; a[j] := old
end;

А вообще, загляни сюда, чтобы не изобретать велосипед: FAQ: Методы сортировок

Кстати, произведение считается правильно, только вспомни, какой диапазон значений у типа Byte? wink.gif Просто произведение больше, чем Byte может вместить... Опиши его как Integer...
 К началу страницы 
+ Ответить 
KENNY
сообщение 16.12.2005 1:28
Сообщение #17





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

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


точто... байт.... smile.gif еще раз спасибо... мне этот паскаль позарез в уневере нужен.. так что буду совершенствоваться... спасибо большое VOLVO.

P.S. мне всегда нравились машины вольво smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
KENNY
сообщение 17.12.2005 21:48
Сообщение #18





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

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


ч одномерным массивом вроде немного разобрался, теперь двумерный массив... в уроках на вашем сервере о них ничего не объясняется, я правда пытался понять чтонибудь из Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи > FAQ там есть про матрицы, но тоже трудно понять.. мне напимер нужно упорядочить строки целочисленной матрицы по возрастанию количества одинаковых элементов в каждой строчке, причем желательно это сделать в виде процедуры.. если не очень трудно не могли бы объяснить как?

Сообщение отредактировано: KENNY - 17.12.2005 21:49
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 17.12.2005 22:11
Сообщение #19


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

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

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


А что ты хочешь .. чтобы тебе полную программу выложили ?

Для начала сообрази как подсчитать колво одинковыйх элементов в одномерном массиве, потом на основе этого алгоритмя реализуешь ф-ю, которая будет считать кол-во одинаковых элементов в i-ой строке, после этого пойдешь в наш FAQ и там выберешь себе понравившийся метод сортировки и дело в шляпе.


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





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

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


Ну можно и полностью программу..... сейчас буду соображать...

делать проверку для каждого элемента и искать равные ему? больше ничего не могу придумать..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



- Текстовая версия 20.07.2025 21:16
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"