• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Macierz permutacyjna

Object Storage Arubacloud
0 głosów
338 wizyt
pytanie zadane 28 maja 2022 w C i C++ przez jjjjjj Nowicjusz (120 p.)

Treść zadania:

Macierzą permutacyjną nazywamy macierz kwadratową, której elementami są tylko zera i jedynki i która w każdym wierszu i w każdej kolumnie ma dokładnie jedną 1. Np. macierz jednostkowa jest macierzą permutacyjną. Napisz funkcję o nazwie Permutacyjna, której parametrami będą: tablica dwuwymiarowa A i dwie liczby naturalne m oraz n oznaczające, odpowiednio, liczbę wierszy i kolumn w macierzy A. Funkcja ta powinna zwrócić wartość 1, jeśli macierz A jest permutacyjna i wartość 0 w przeciwnym przypadku. Można założyć, że macierz nie będzie miała więcej niż 100 wierszy i 100 kolumn.

Mój kod:

#include <stdio.h>

int Permutacyjna(int m, int n, int A[m][n])
{
    if(m!=n)
        return 0;
    int ilosc_jedynek;
    //po wierszach
    for(int i=0; i<m; i++)
    {
        ilosc_jedynek = 0;
        for(int j=0; j<n; j++)
    {
        if(A[i][j]!=0 && A[i][j]!=1)
            return 0;
        if(A[i][j]==1)
            {
            ilosc_jedynek++;
            printf("%d", ilosc_jedynek);
            if(ilosc_jedynek>1)
            return 0;
        }

    }


    }
    return 1;
}

int main(){
    int m, n;
    scanf("%d %d", &m, &n);
    int A[m][n];
    for(int i=0; i<m; i++)
    {
        for(int j=0; j<n; j++)
    {
        scanf("%d", &A[i][j]);
    }

    }
    printf("%d", Permutacyjna(m, n, A[m][n]));

    return 0;

}

Kiedy wczytuję macierz jednostkową 2x2, program zwraca 0 i nie rozumiem dlaczego tak się dzieje. W moim kodzie zliczam ile jest jedynek tylko po wierszach i chyba tak samo powinienem po kolumnach? Jak lepiej to napisać, może przy pomocy wskaźników?

1 odpowiedź

0 głosów
odpowiedź 28 maja 2022 przez Wiciorny Ekspert (269,710 p.)

Kiedy wczytuję macierz jednostkową 2x2, program zwraca 0

może dlatego, że sam taki warunek napisałeś? 
 

 if(m!=n)
        return 0;

 

komentarz 28 maja 2022 przez jjjjjj Nowicjusz (120 p.)
ale m nie jest różne od n, kiedy m=2 i n=2?
komentarz 28 maja 2022 przez wizarddos Nałogowiec (25,930 p.)
Może dlatego że jest tam pomiędzy ! i = jest spacja?
komentarz 28 maja 2022 przez Wiciorny Ekspert (269,710 p.)

@jjjjjj, a jak ma być różne skoro m jest 2 i n jest 2 ? Coś mi się wydaje, że komuś podwaliłeś ten program. 

#include <iostream>

using namespace std;

int main()
{
    int m=2;
    int n=2;
     if(m!=n)
    cout<<"Hello World";
    
    return 0;
}

/// return : 0 

To sa typy prymitywne, one odnoszą się zawsze do swojej wartości, nie do adresu, stąd nawet pusty -deklaracyjnie typ prosty, ma wartość domyślną zero. 
Inaczej typy referencyjne. 

komentarz 28 maja 2022 przez jjjjjj Nowicjusz (120 p.)
To źle ci się wydaje :) I tak się składa, że problem nie tkwi w warunku m!=n (który swoją drogą jest poprawny, bo gdy m=2 i n=2 to ten warunek nie jest spełniony i to nie z jego powodu zwraca się 0), usunąłem te dwie linijki i 0 nadal jest zwracane
komentarz 28 maja 2022 przez Wiciorny Ekspert (269,710 p.)

super to nie pytaj, tylko naprawiaj :) swoją drogą  to jest źle, a to żę masz inne błędy w nie swoim kodzie to już nie moja wina i mnie się nie musi wydawać, bo wystarczy ze sobie kod uruchomisz na górze :)

A ten twoj warunek na jeden element, który porównuje czy JEDNOCZEŚNIE  ta sama liczba nie jest 0 i jedynką, też jest poprawny skoro masz macierz ZERO-JEDYNKOWĄ? Jeśli ten sam element :D jest różny od zera i ten sam element różny od jeden gdy zbiorem wartości jest 0,1 ? 

if(A[i][j]!=0 && A[i][j]!=1)


 

komentarz 28 maja 2022 przez Wiciorny Ekspert (269,710 p.)

dalej idąc 

   if(A[i][j]==1)

to się nigdy nie wykona przy warunku KONIUNKCJI  

if(A[i][j]!=0 && A[i][j]!=1)

bo jeśli nie jest jedynką i jednocześnie nie jest zerem, to potem nie może ta sama wartość być równa 1 . Także ... logiczne myślenie jeszcze przed tobą 

Jak robisz deklaracje  int ilosc_jedynek; -> to i tak jest ich zero :) więc to jest niepotrzebne
ilosc_jedynek = 0;
swoją drogą, jak już komuś próbujesz coś udowodnić, to przemyśl czy masz odpowiednio przepracowany materiał :D bo wstyd sobie robisz 

komentarz 28 maja 2022 przez jjjjjj Nowicjusz (120 p.)
If z koniunkcją nie dotyczy już ifa poniżej
komentarz 28 maja 2022 przez jjjjjj Nowicjusz (120 p.)

@Wiciorny, większym wstydem jest wmawianie komuś, że ukradł skądś kod pod pretekstem pomocy, ja nie czuję wstydu z powodu proszenia o pomoc 

komentarz 28 maja 2022 przez Wiciorny Ekspert (269,710 p.)

to nie wstyd, ale jak ktoś Ci wskazuje błędy, żebyś coś poprawił, przemyślał, to uważaasz żę to jest okej, a nie jest. Bo ty widzisz tylko 1 punkt, a nie opanowałeś logicznego myślenia żeby wyłapać dlaczego to może być jednak źle : 
przeczytaj sobie dokładnie treść 

która w każdym wierszu i w każdej kolumnie ma dokładnie jedną 1

a teraz popatrz jak przebiegają twoje iteracje po wierszu i kolumnie i gdzie zwracasz 0, a gdzie 1 :) 

Podobne pytania

0 głosów
0 odpowiedzi 68 wizyt
pytanie zadane 19 kwietnia 2020 w C i C++ przez ResCrove Obywatel (1,700 p.)
0 głosów
2 odpowiedzi 167 wizyt
0 głosów
0 odpowiedzi 159 wizyt
pytanie zadane 5 stycznia 2019 w C i C++ przez MS Początkujący (430 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...