Премини към съдържанието
Excelsior

Помощ със задача на Паскал

Препоръчан отговор


Здравейте, бих искал ако може да ми помогнете със следната задача: Даден е двумерен масив от цели числа с m реда и n стълба. Да се намери номерът на последния ред, в който всички елементи са нечетни числа.

Проблемът е, че не знам как да изведа номерът на последният ред с нечетни числа. Мина ми през ума за брояч на който да се присвои стойност 0 в началото, но мисля, че с него няма как да се получи при положение, че с него мога да преброя само редовете с наличие на нечетни числа от общия брой ( където могат да съществуват и редове без нечетни числа).

Type
Masiv=array[1..10,1..10] of integer;

Var
i,j,m,n:integer;
A:Masiv;

Begin

Write('Брой на редове: '); Readln(m);
Write('Брой на колони(стълбове): '); Readln(n);

For i:=1 to m do
 For j:=1 to n do
 Begin
 Write('Задайте елемента от ',i,'-и ред и ',j,'-и стълб: '); Readln(A[i][j]);
End;

For i:=1 to m do
 For j:=1 to n do
 Begin
 If (A[i][j] mod 2<>0) then Writeln('Ред само с нечетни числа')
 else Writeln('Не всички числа са нечетни');
 End;

...

След това трябва да следва извеждането на номера на последния ред с нечетни числа, което не знам как трябва да стане. Като се замисля, последната част от написаният код може също да е грешна, понеже не съм сигурен как да формулирам изходните съобщения..

Редактирано от Excelsior (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

1. Направи последния цикъл да е от m до 1. По този начин ще намериш веднага последния ред, който отговаря на условието

2. Проверката за нечетност не е правилна. В нея трябва да се проверяват всички елементи от реда(I,J) дали са нечетни. И ако всички са нечетни, точно това е тръсения ред (I)

 

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 18 часа, TRN написа:

1. Направи последния цикъл да е от m до 1. По този начин ще намериш веднага последния ред, който отговаря на условието

2. Проверката за нечетност не е правилна. В нея трябва да се проверяват всички елементи от реда(I,J) дали са нечетни. И ако всички са нечетни, точно това е тръсения ред (I)

 

1. Много добра идея да се започне отзад напред.

2. Тук нещо не разбрах. Проверката за нечетност не трябва ли да е точно тази => ако число разделено на 2 има остатък, то тогава то е нечетно число. Ако остатъкът е 0, то числото е четно.

Въпрос: Къде трябва да се изведе резултатът за последният ред в цикъла или извън него ?

 

П.С. Замислих се над това, което ми каза и стигнах до това заключение:

Program KR;

Type
Masiv=array[1..10,1..10] of integer;

Var
i,j,m,n:integer;
A:Masiv;
odd:boolean;

Begin

Write('Брой редове: '); Readln(m);
Write('Брой стълбове: '); Readln(n);

For i:=1 to m do
 For j:=1 to n do 
 Write('Задайте елемента от ',i,'-я ред и ',j,'-я стълб: '); Readln(A[i][j]);
End;
 
For i:=m downto 1 do begin
 odd:=true
 For j:=1 to n do begin
 if (A[i][j] mod 2=0) then odd:=false;
End;
 
If odd then begin
  Writeln('Последният ред с нечетни числа е: ',i)
  else Writeln('Няма ред само с нечетни числа!')
  break;
End;

Readln;

End.

Та направих няколко пускания на програмата и изглежда, че пуска точни резултати. Вие какво мислите ?

Редактирано от Excelsior (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
For i:=m downto 1 do begin
 odd:=true
 For j:=1 to n do begin
 if (A[i][j] mod 2=0) then odd:=false;
End;

Заключението частично е вярно, но не изцяло.

преди 9 часа, Excelsior написа:

if (A[j] mod 2=0) then odd:=false;

Това ще покаже, че поне един елемент от реда е нечетен, а трябва да са нечетни всички.

Допълнително може да се декларира променлива, която да се увеличава с 1 при нечетен елемент от реда - нещо като брояч,  който да брои колко от елементите в реда са нечетни, като предварително се нулира при започване на цикъла за проверка на реда

И ако n на брой, колкото са елементите в реда,  са нечетни, се присвоява стойност на odd:=true, прекъсват се циклите и тогава може да се изведе резилтата. Има няколко начина за прекъсване, само трябва да се прочете кой какво прави.

преди 9 часа, Excelsior написа:

Въпрос: Къде трябва да се изведе резултатът за последният ред в цикъла или извън него ?

Според мен след прекъсване на циклите. Има информация как е приключила проверката, а и i е със стойността на точния ред.

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
type
  Masiv=array[1..10,1..10] of integer;

var
    i,j,m,n,v:integer;
    A:Masiv;
    
begin

  Write('Broi redove: ');
  Readln(m);
  Write('Broi stulbove: ');
  Readln(n);

  For i:=1 to m do
   For j:=1 to n do
    begin
      Write('Zadaite elementa ot ',i,'-q red i ',j,'-q stulb: ');
      Readln(A[i][j]);
    end;

  For i:=m downto 1 do begin
    v:=0;
    For j:=1 to n do begin
      If (A[i][j] mod 2<>0) then v:=v+1
      end;
    If v=n then
    Writeln('Posledniqt red samo s nechetni chisla e: ',i)
    else if v<>n then
    Writeln('Nqma red samo s nechetni chisla');
    end;

  Readln;
end.   

Пробвах по този начин с брояч на елементите (Не знам дали броенето въобще е правилно) и без променлива тип истина/лъжа. 

Ако напиша примерно елементи в масив с 3 реда и 3 стълба, в които примерно само единия ред (първият) да отговаря на условието, то ми изкарва правилният отговор, но изкарва и надписи за останалите два, че не са редове с нечетни числа. Което ме навежда над мисълта, че трябва да брейкна някъде, но не съм сигурен къде, при положение, че проверявам отзад напред.

Ако се чудите защо кода изглежда малко по-различен, това е защото смених компилатора. Преди използвах Free Pascal, но имах бъг, който не ми записваше данните на отделни редове, а ги презаписваше само на един ред и се прецакваше изгледа - а сега ползвам Lazarus + вграден Free Pascal Компилатор. Ако случайно знаете как се оправя подобен бъг, моля споделете :) (Мисля, че е поради факта, че с използвам Windows 10 x64, а Free Pascal Компилатора е x86, a и не използвам cross компилатор от x86 към x64.)

Редактирано от Excelsior (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Тук трябва да се сложи команда за прекъсване на цикъла с i

Нали бях написал, че трябва прекъсване на цикъла. Няма смисъл да проверява повече, а ако проверява, явно че ще даде такъв резултат

И никъде не съм казал, че не трябва да има променлива лъжа/истина. А тя ще е необходима ако извеждането на резултата ще е след двата цикъла.

If v=n then
    Writeln('Posledniqt red samo s nechetni chisla e: ',i)
Редактирано от TRN (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
type
  Masiv=array[1..10,1..10] of integer;

var
    i,j,m,n,v:integer;
    A:Masiv;

begin

  Write('Broi redove: ');
  Readln(m);
  Write('Broi stulbove: ');
  Readln(n);

  for i:=1 to m do begin
     for j:=1 to n do begin
        Write('A[',i,',',j,'] = ');
        Readln(A[i][j]);
     end;
     writeln;
  end;

  for i:=1 to m do begin
      write('red ',i,': ');
      for j:=1 to n do
         write(a[i,j],' ');
      writeln;
  end;

  For i:=m downto 1 do begin
    v:=0;
    For j:=1 to n do
      if odd(A[i,j]) then inc(v)
      else break;

    If v=n then begin
       Writeln('Posledniqt red samo s nechetni chisla e: ',i);
       break;
    end;
  end;
  if v<>n then
    Writeln('Nqma red samo s nechetni chisla');
end.

 

Редактирано от ined (преглед на промените)
  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Не ми се искаше да му се дава всичко наготово. Нека да седне и прочете малко. Нещата му ги бях описал, но май няма кой да чете. 

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Ами, благодаря, че ми я написахте. И аз не одобрявам да се дава наготово. Разглеждах стари теми на хора питали за решения на задачи на Паскал, а и не само. И отговорът беше да се опитат, а Вие да помогнете. И оттам си извадих изводите. Много неща изчетох свързани с този програмен език. Когато не съм сигурен, какво трябва да направя следвам принципа проба-грешка, както се вижда по-нагоре в темата. Аз никога не съм се стремял в училище (за момента и университета) да получавам нещо наготово, при положение, че съм бил в среда в която нещата са зависели от мен. 

В случая научих къде трябва да се поставят break-овете, както и че имало специфична функция за нечетни числа, както и функция за увеличаване. 

 

Случайно някой от Вас да знае на какво се дължи гореописания проблем с Free Pascal компилатора  ?

 

П.С. Чета много добре какво сте написали. Преди да си редактирате коментара не успях да схвана къде точно имахте предвид, че трябва да се сложи прекъсването. Сега всичко е ясно. И никъде не съм споменавал, че Вие сте казали, че не трябва да има променлива тип истина/лъжа, просто реших да експериментирам без нея, но с променлива брояч. :shy11:

Редактирано от Excelsior (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 8 часа, ined написа:

    If v=n then begin
       Writeln('Posledniqt red samo s nechetni chisla e: ',i);
       break;
    end;
  end;
  if v<>n then
    Writeln('Nqma red samo s nechetni chisla');
end.

 

@ined Между другото в условията на IF-овете не трябва ли да са v=m и v<>m вместо с n или не е от значение ?

П.С. Разбрах от какво значение са, трябва да е n.

Редактирано от Excelsior (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

След бая проверки започна да пуска точн ирезултати. Но проблема е, че ги пуска само при равен брой на редове и стълбове в масива. Примерно показва точни резултати за масиви от вида 3x3, 4x4 и т.н. Но извежда грешни резултати при масиви от вида 3x4, 4x3 и т.н. 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Нещо не си я преписал както трябва.

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Ами да, след подробен оглед, открих, че не бях запаметил последните промени. Всичко вече работи както трябва. Много благодаря на отзовалите се за съдействието!

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход


×

Информация

Този сайт използва бисквитки (cookies), за най-доброто потребителско изживяване. С използването му, вие приемате нашите Условия за ползване.