Przekazywanie elementu tablicy do funkcji.

0

Cześć, mam takie zadanie: Dana jest tablica wypełniona liczbami naturalnymi. Napisać funkcje, która odpowiada na pytanie czy w tablicy istnieje wiersz, w którym każda liczba zawiera co najmniej jedną cyfrę będącą liczbą pierwszą?
Problem jest w tym, że nie za bardzo wiem jak przekazać pojedynczy element tablicy do funkcji(komentarz z pytajnikami), żeby ta potem na nim działała. I pewnie oczywiście nawet źle ją zadeklarowałem na początku.
W innym zadaniu zrobiłem tak samo(jednowymiarowa była) i tam działało a tutaj niestety jest źle.

#include <iostream>
#include <cstdlib>
#include <time.h>
using namespace std;
int const maks1 = 10;
int const maks2 = 10;
int znajdz_pierwsza(int tab[][], int, int);
int main() {
    srand(time(NULL));
    int licz, i, j;
    bool x, y;
    int tab[maks1][maks2];

    for (i = 0; i < maks1; i++) {
        for (j = 0; j < maks2; j++) {
            tab[i][j] = rand() % 100;
            cout << tab[i][j] << " ";
        }
        cout << endl;
    }

    y = 1;
    for (i = 0; i < maks1, y == 1; i++) {
        x = 1;
        licz = 0;
        for (j = 0; j < maks2, x == 1; j++) {
            x = znajdz_pierwsza(tab, i, j);//???????
            licz++;
        }
        if (j == licz) {
            cout << "tak, numer wiersza: " << i << endl;
            y = 0;
        }
    }
}

int znajdz_pierwsza(int tab[][], int i, int j) {
    while (tab[i][j] > 0) {
        if ((tab[i][j] % 10) % 2 != 0 && (tab[i][j] % 10)!=9) {
            return 1;

        }
        tab[i][j] = tab[i][j] / 10;
    }
    return 0;
}
3

Jeśli chcesz przekazać element, to przekaż element, nie całą tablicę.

int tab[10][10]{};
foo(tab[1][1]); // drugi element drugiego elementu tablicy

Sygnatura funkcji przyjmującej ten element też jest niepoprawna. Jeśli chcesz przyjąć pojedynczy element - przyjmuj int, jeśli chcesz przekazywać tablicę, to musisz podać przynajmniej wielkość wszystkich wymiarów poza ostatnim:

void bar(int arr[][10]); // argumentem jest (nieznanej wielkości) tablica tablic 10-elementowych
void qux(int (&arr)[10][10]); //wymusza pełną zgodność wymiarów

Jeśli chodzi o funkcję znajdz_pierwsza niepotrzebnie próbujesz przezkazać tablicę i koordynaty elementu, który chcesz sprawdzić. Przekaż po prostu wartość tak jak pokazałem na samej górze (a funkcja niech przyjmuje int). Ponadto w tej funkcji zmieniasz tablicę: tab[i][j] = tab[i][j] / 10; Jeśli to celowe działanie, to funkcja jest niepoprawnie nazwana - funkcje szukające nie powinny modyfikować danych.

Zbędne modulo 10:

(tab[i][j] % 10) % 2

Według poniższego kodu 1,3,5,7 to liczby pierwsze. 1 taką nie jest. (ponadto oddelegowałbym sprawdzanie pierwszości do osobnej funkcji)

        if ((tab[i][j] % 10) % 2 != 0 && (tab[i][j] % 10)!=9) {
            return 1;
 
        }
0
supergosc napisał(a):
int znajdz_pierwsza(int tab[][], int, int);
.
.
.
        for (j = 0; j < maks2, x == 1; j++) {
            x = znajdz_pierwsza(tab, i, j);//???????
            licz++;
        }
.
.
.

int znajdz_pierwsza(int tab[][], int i, int j) {
    while (tab[i][j] > 0) {
        if ((tab[i][j] % 10) % 2 != 0 && (tab[i][j] % 10)!=9) {
            return 1;

        }
        tab[i][j] = tab[i][j] / 10;
    }
    return 0;
}
int znajdz_pierwsza(int tab);
.
.
.
x = znajdz_pierwsza(tab[i][j]);//???????
.
.
.
int znajdz_pierwsza(int tab) {
    int liczba = tab;
    while (liczba > 0) {
        if ((liczba % 10) == 3 || (liczba % 10) == 5 || (liczba % 10) == 7) {
            return 1;

        }
        liczba = liczba / 10;
    }
    return 0;
}

Może być?
I dlaczego zbędne modulo 10? A jak sprawdzić wszystkie cyfry?

0

Kopiowanie z tab do liczba nie jest niezbędne, ale ogółem wygląda ok, chociaż nie wiem jak wygląda od strony kompilatora optymalizacja kilku wywołań modulo 10 na liczbie - wydaje się, że powinien to spokojnie zamienić na jedną operację, ale głowy bym nie dał. edit: tak, bezproblemowo: http://goo.gl/grrDHd

edit: Zbędne modulo 10 było w (tab[i][j] % 10) % 2 - modulo 2 z wyniku operacji modulo 10 na dowolnej liczbie będzie taki sam jak poddanie tej liczby bezpośrednio do modulo 2.

0

Mam jeszcze pytanko co do tego:

for (j = 0; j < maks2, x == 1; j++) {

czy to oznacza, ze musza zajsc oba warunki czyli j<maks2 i x musi byc rowny 1? I skonczy sie dopiero wtedy kiedy j > maks2 ale też x = 0?
Bo przez to chyba program nie dziala poprawnie.
A nie wiem jak to inaczej zrobić.

1

Faktycznie, to jest błąd. Jeśli chcesz, aby zaszły oba warunki, użyj operatora &&, jeśli przynajmniej jeden - ||, przecinek ma zupełnie inne znaczenie (w przypadku Twojej pętli - tylko drugi warunek jest efektywny).

for (j = 0; j < maks2 && x == 1; j++)  // oba muszą być prawdziwe
for (j = 0; j < maks2 || x == 1; j++)  // jeden lub oba muszą być prawdziwe
2

Zobacz

int main()
{
  int a = 91, b = 100;
  cout<<(a, b);
  return 0;
}

Tak działa operator,
(a, b, c) = c
Co jednak nie znaczy, ze tylko operacja "najbardziej na prawo" jest wykonywana:

int main()
{
  int a = 0, b = 100;
  (a = 50, b = 900);
  cout<<a<<endl<<b;
  return 0;
}
0

@kq jestem ogromnie wdzięczny
@pingwindyktator już rozumiem, dzięki
Już wszystko działa tylko musiałem tutaj zmienić warunek na x i potem na if bo mi po pierwszej sprawdzonej liczbie już dalej nie sprawdzało:

 for (j = 0; j < maks2 && x == 1 ; j++) {
			x = znajdz_pierwsza(tab[i][j]);//???????
			
		}
		if (j == (maks2))

Pozdrawiam!

1 użytkowników online, w tym zalogowanych: 0, gości: 1