Wskażniki, tablice, funkcje

0

Ostatnio zaczęłam naukę wskaźników i pojawiły się problemy przy zadaniach gdzie znajduje się zarówno wskaźnik jak i tablica i funkcja. A mianowicie moje zadanie polega na tym że mam utworzyć 4 funkcje: jedna która wypisze dwie tablice A i B , jedna która obliczy trzecia tablice C jako iloczyn A i B, jedna która wyswietli A B C i ostatnia ktora znajdzie min i max A i B i poda liczbę różniących je elementów. Do tego argumenty mają zostać przesłane do funkcji jako wskazniki i operacje wewnatrz tez na wskaznikach. Napisałam 3 pierwsze funkcje z 4 mam problem, jednak przy wyswietlaniu tablic, tablica C wyświetla same 0. Czy mógłby mi ktoś pomóc zrozumieć o co chodzi?


```#include <iostream>

using namespace std;
void wczytywanie_tablicy(int *wsk);
int iloczyn_tablic(int *wsk1,int *wsk2, int *wsk3);
void wypisywanie_tablicy(int *wsk);
int tablicaA[20], tablicaB[20], tablicaC[20];
int i;
int main()
{
        int *wskaznik;
        wczytywanie_tablicy(wskaznik);
        iloczyn_tablic(wskaznik, wskaznik,wskaznik);
        wypisywanie_tablicy(wskaznik);

}
//*******************************************
void wczytywanie_tablicy(int *wsk)
{
    wsk=tablicaA;
    cout <<"Wprowadz elementy do pierwszej tablicy: "<<endl;

    for (i=0; i<20; i++)
    {
        cout <<"tablica A["<<i<<"]=";
        cin >> *wsk;

    }
    wsk=tablicaB;
    cout << "\nWprowadz elementy do drugiej tablicy: "<<endl;
    for (i=0; i<20; i++)
    {
        cout <<"tablicaB["<<i<<"]=";
        cin>>*wsk;
    }


}
//********************************************
int iloczyn_tablic( int *wsk1, int *wsk2, int *wsk3)
{

wsk3=tablicaC;
    for (i=0, wsk1=&tablicaA[0], wsk2=&tablicaB[0]; i<20; i++, wsk1++, wsk2++)
    {
        *wsk3=(*wsk1)*(*wsk2);

    }
return tablicaC[i];
}
//********************************************
void wypisywanie_tablicy(int *wsk)
{
    wsk=tablicaA;
    cout << "Wydruk pierwszej tablicy: "<< endl;
    for (i=0; i<20; i++)
    {

        cout << "tablica A["<<i<<"]="<<*wsk<<endl;
    }
    wsk=tablicaB;
    cout << "Wydruk drugiej tablicy: "<<endl;
    for (int i=0; i<20; i++)
    {
        cout << "tablica B["<<i<<"]="<<*wsk<<endl;
    }
    wsk=tablicaC;

     cout << "Suma tablic: "<<endl;
     for (i=0; i<20; i++)
     {
         cout << "tablica C["<<i<<"]="<<*wsk<<endl;

     }


}

PS. domyślam się że moje zapisy mogą ranić oczy informatyków ale proszę o wyrozumiałość XD
0

Ja bym zrobił np. coś takiego:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void print(int *tab, size_t size)
{
	int i = 0;
	for (; i < size; ++i)
	{
		printf("%d, ", *(tab++));
	}
	putchar('\n');
}

void multiply(int *first, int* second, int *result, size_t size)
{
	int i = 0;
	for (; i < size; ++i, first++, second++, result++)
	{
		*result = *first * *second;
	}
}

enum operation { MIN, MAX };
void extremum(int *tab, size_t size, int *result, enum operation op)
{
	int i = 0;
	*result = *tab;
	switch (op)
	{
	case MIN:
		for (; i < size; ++i, tab++)
		{
			if (*tab < *result)
				*result = *tab;
		}
		break;
	case MAX:
		for (; i < size; ++i, tab++)
		{
			if (*tab > *result)
				*result = *tab;
		}
		break;
	}
}

void initialize(int *tab, size_t size)
{
	int i = 0;
	for (; i < size; ++i, tab++)
	{
		*tab = rand() % 5;
	}
}

void diff(int *first, int* second, int *result, size_t size)
{
	int i = 0;
	for (; i < size; ++i, first++, second++)
	{
		if (*first != *second)
		{
			(*result)++;
		}
	}
}

int main()
{
	srand((unsigned)time(NULL));

	int first[10], second[10], result[10];
	size_t size_first = sizeof(first) / sizeof(first[0]);
	size_t size_second = sizeof(second) / sizeof(second[0]);
	size_t size_result = sizeof(result) / sizeof(result[0]);

	initialize(first, size_first);
	initialize(second, size_second);

	print(first, size_first);
	print(second, size_second);

	multiply(first, second, result, size_result);
	print(result, size_result);

	int min = 0, max = 0, di = 0;
	extremum(result, size_result, &min, MIN);
	extremum(result, size_result, &max, MAX);
	diff(first, second, &di, size_result);

	printf("\nMIN: %d\nMAX: %d\nDIFF: %d\n", min, max, di);

	return 0;
}
  • Twoje tablice niepotrzebnie są globalne;
  • Rozmiar przekazuj jako argument funkcji. Jak gdzieś będziesz chciał tablice innego rozmiaru to będziesz musiał wszystkie dwudziestki zamienić np. na dziesiątki;
  • W ogóle zrezygnuj ze zmiennych globalnych, bo prawie zawsze nie będzie potrzeby ich używania;
  • Iloczyn niepotrzebnie zwraca wartość, w dodatku bardzo nieładnie. Zresztą wynik przy wywołaniu i tak idzie w kosmos.
0
grzesiek51114 napisał(a):

Ja bym zrobił np. coś takiego:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void print(int *tab, size_t size)
{
	int i = 0;
	for (; i < size; ++i)
	{
		printf("%d, ", *(tab++));
	}
	putchar('\n');
}

void multiply(int *first, int* second, int *result, size_t size)
{
	int i = 0;
	for (; i < size; ++i, first++, second++, result++)
	{
		*result = *first * *second;
	}
}

enum operation { MIN, MAX };
void extremum(int *tab, size_t size, int *result, enum operation op)
{
	int i = 0;
	*result = *tab;
	switch (op)
	{
	case MIN:
		for (; i < size; ++i, tab++)
		{
			if (*tab < *result)
				*result = *tab;
		}
		break;
	case MAX:
		for (; i < size; ++i, tab++)
		{
			if (*tab > *result)
				*result = *tab;
		}
		break;
	}
}

void initialize(int *tab, size_t size)
{
	int i = 0;
	for (; i < size; ++i, tab++)
	{
		*tab = rand() % 5;
	}
}

void diff(int *first, int* second, int *result, size_t size)
{
	int i = 0;
	for (; i < size; ++i, first++, second++)
	{
		if (*first != *second)
		{
			(*result)++;
		}
	}
}

int main()
{
	srand((unsigned)time(NULL));

	int first[10], second[10], result[10];
	size_t size_first = sizeof(first) / sizeof(first[0]);
	size_t size_second = sizeof(second) / sizeof(second[0]);
	size_t size_result = sizeof(result) / sizeof(result[0]);

	initialize(first, size_first);
	initialize(second, size_second);

	print(first, size_first);
	print(second, size_second);

	multiply(first, second, result, size_result);
	print(result, size_result);

	int min = 0, max = 0, di = 0;
	extremum(result, size_result, &min, MIN);
	extremum(result, size_result, &max, MAX);
	diff(first, second, &di, size_result);

	printf("\nMIN: %d\nMAX: %d\nDIFF: %d\n", min, max, di);

	return 0;
}
  • Twoje tablice niepotrzebnie są globalne;
  • Rozmiar przekazuj jako argument funkcji. Jak gdzieś będziesz chciał tablice innego rozmiaru to będziesz musiał wszystkie dwudziestki zamienić np. na dziesiątki;
  • W ogóle zrezygnuj ze zmiennych globalnych, bo prawie zawsze nie będzie potrzeby ich używania;
  • Iloczyn niepotrzebnie zwraca wartość, w dodatku bardzo nieładnie. Zresztą wynik przy wywołaniu i tak idzie w kosmos.

okej przeanalizowałam, pozmieniałam w swojej co trzeba i stało się to jaśniejsze dziękuję za pomoc

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