logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak obliczyć sumę i różnicę dwóch tablic w C?

bardzociekawski 31 Mar 2006 18:52 5556 7
REKLAMA
  • #1 2479095
    bardzociekawski
    Uczeń
    Posty: 63
    Mamy 1. tablicę z 5 liczbami i 2. tablicę z 5 liczbami, które podaje użytkownik i mamy znaleźć sumę i różnicę tych tablic. W tablicach liczby są posortowane rosnąco, ale mogą się powtarzać, np.
    1. tablica: {1, 1, 2, 3, 4}
    2. tablica: {1, 1, 5, 6, 6}

    No i niby mam program na sumę:

    #include<conio.h>
    #include<stdio.h>
    void czytaj1 (int tab1[]);
    void czytaj2 (int tab2[]);
    void suma(int tab3[], int tab1[], int tab2[]);

    int main()
    {
    int tab1[5], tab2[5], tab3[10];
    czytaj1(tab1);
    czytaj2(tab2);
    printf ("suma tych tablic to:\n");
    suma(tab3, tab1, tab2);
    getch ();
    return 0;
    }




    void czytaj1 (int tab1[])
    {
    int i;
    printf ("podaj 5 liczb calkowitych: \n");
    for(i=0; i<5; i++)
    scanf("%d", tab1+i);
    }




    void czytaj2 (int tab2[])
    {
    int i;
    printf ("podaj 5 liczb calkowitych: \n");
    for(i=0; i<5; i++)
    scanf("%d", tab2+i);
    }





    void suma (int tab3[], int tab1[], int tab2[])
    {
    int i;
    for (i=0; i<5; i++)
    {
    tab3[i]=tab1[i];
    printf ("%d ", tab1[i]);
    };
    for (i=0; i<5; i++)
    {
    tab3[i+5]=tab2[i];
    printf ("%d ", tab2[i]);
    };
    }


    ale elementy powtarzające się są i tak wypisywane - co tu zrobić, żeby te elementy co sie powtarzają nie były wypisywane. No i za różnicę tablic nie wiem jak się zabrać żeby były wypisywane elementy należące do tablicy 1. alenie należace do tablicy 2. Jak by to zrobić? :(

    Dodano po 3 [godziny] 35 [minuty]:

    naprawdę nikt nie wie jak to zrobić ???
  • REKLAMA
  • #2 2481028
    ed-ek
    Poziom 34  
    Posty: 1814
    Pomógł: 275
    Ocena: 42
    Jak to mam rozumieć? Z 2 tablic np 5 elementowych tworzysz jako sumę jedną 10 elementową - i to ma być suma? Czy przypadkiem nie chodzi ci o dodawanie zbiorów, jeżeli piszesz aby elementy się nie powtarzały. Normalnie: tab1[4]={1,4,4,6);tab2={2,3,5,1);tab[1]+tab[2]={3,7,9,7};
    Czyli są u ciebie zbiory czy tablice?
  • REKLAMA
  • #3 2481056
    bardzociekawski
    Uczeń
    Posty: 63
    źle napisałem bo faktycznie sumę i różnicę dwóch tablic bardzo łatwo było by obliczyć
    chodziło mi o sumę i różnicę dwóch ZBIORÓW, ale najlepiej byłoby wykorzystać do tego tablice - 1. zbiór zapisać jako tablicę 1. a drugi jako tablicę 2. tylko jak dodać te dwa zbiory żeby elementy się nie powtarzały i jak wyznaczyć różnicę.....? :(
  • #4 2481504
    eihs
    Poziom 13  
    Posty: 33
    Pomógł: 6
    nie pisze w c [wiec moga byc bledy], ale na moje oko to powinno byc mniej wiecej jakos tak:

    tworzysz sobie funkcje, ktora sprawdza czy dany element z tablicy2 nie znajduje sie przypadkiem juz gdzies w tablicy1. jesli znajduje funkcja zwraca wartosc 1, jesli nie to zwraca 0
    int nalezy (int x, int tab1[])
    {
    	int nalezy,i;
    	nalezy=0;
    
    	for (i=0; i<5; i++)
    	{
    		if ( x==tab2[i] ) nalezy=1;
    	}
    
    	return nalezy;
    }
    


    teraz wystarczy przy dodawaniu elementow do tablicy3 sprawdzac czy element z tablicy2 nie jest juz z tablicy1 za pomoca powyzszej funkcji, jesli nie ma go to dodajemy go takze do tablicy3, jesli jest to nie robimy nic:

    
    void suma (int tab3[], int tab1[], int tab2[])
    {
    	int i,j;
    
    	j=0;
    
    	for (i=0; i<5; i++)
    	{
    		tab3[j]=tab1[i];
    		j++;
    		
    		if ( nalezy(tab2[i],tab1) != 1 )
    		{
    			tab3[j] = tab2[i];
    			j++;
    		}
    	}
    }
    


    greets
  • #5 2481765
    bardzociekawski
    Uczeń
    Posty: 63
    no niestety to nie to...... myślę i myślę nad tym, ale jak się zaczęło dopiero niedawno programować to samemu bez pomocy nie bardzo idzie to zrobić :/
  • REKLAMA
  • #6 2481876
    ed-ek
    Poziom 34  
    Posty: 1814
    Pomógł: 275
    Ocena: 42
    Jeżeli to zbiory,to skorzystaj z kontenera set:
    #include <set>
    #include <iostream>
    #include <conio.h>
    #include <iterator>
    using namespace std;
    int zb1[5]={4,5,1,2,4};
    int zb2[5]={22,1,21,2,4};

    int main()
    {
    set<int>zbior_w;
    for(int i=0;i<5;i++)
    zbior_w.insert(zb1[0]);
    for(int i=0;i<5;i++) zbior_w.insert(zb2[i]);
    copy(zbior_w.begin(),zbior_w.end(),ostream_iterator<int>(cout,"\n"));

    cout<<"size= "<<zbior_w.size()<<endl;
    getch();
    }

    otrzymasz wynik: 1 2 4 21 22
  • #7 2482101
    bardzociekawski
    Uczeń
    Posty: 63
    Po pierwsze to musi być w C a nie w C++
    A po drugie nie można korzystać z gotowych funkcji - trzeba je samemu napisać
  • REKLAMA
  • #8 2495054
    ed-ek
    Poziom 34  
    Posty: 1814
    Pomógł: 275
    Ocena: 42
    Jeżeli masz 2 zbiory i w każdym z nich są powtarzające się elementy, musisz najpierw utworzyć 2 nowe zbiory,w których elementy nie będą się powtwrzały. Zrobi to program:

    #include<conio.h>
    #include <stdio.h>

    const int m=13;
    int a[m]={1,1,12,1,3,1,1,3,1,1,4,1,11};
    int tab[100];
    int i,j;
    char c;

    char t_n(int j)
    {c='n';
    for(i=0;i<j;i++)if(a[i]==a[j])c='t';
    //if(c!='t') c='n';
    return c;
    }
    int main()
    {

    int a_pom=1;
    tab[0]=a[0];
    for(j=1;j<m;j++)
    {t_n(j);
    if(c=='n'){tab[a_pom]=a[j];a_pom++;}
    }
    printf("\n");
    for(i=0;i<a_pom;i++)printf("%d\n",tab[i]);
    getch();
    }

    a potem trzeba napisać program na dodanie 2 zbiorów.
    Przestaw się na C++,mnie łatwiej jest w nim pisać.

Podsumowanie tematu

✨ Dyskusja dotyczy problemu obliczenia sumy i różnicy dwóch zbiorów reprezentowanych jako tablice w języku C. Autor początkowo mylił pojęcia sumy tablic (konkatenacji) z sumą zbiorów, gdzie elementy się nie powtarzają. Wskazano, że aby uzyskać sumę zbiorów bez powtórzeń, należy napisać funkcję sprawdzającą, czy dany element z drugiej tablicy już występuje w pierwszej, i tylko wtedy dodawać go do wyniku. Zaproponowano przykładową funkcję sprawdzającą przynależność elementu oraz sposób łączenia tablic z eliminacją duplikatów. Zasugerowano również użycie kontenera set w C++ do operacji na zbiorach, jednak autor podkreślił konieczność implementacji w czystym C bez użycia gotowych bibliotek. W dalszej części przedstawiono przykład usuwania duplikatów z tablicy w C, co jest krokiem wstępnym do operacji na zbiorach. Podsumowując, rozwiązanie wymaga napisania własnych funkcji do sprawdzania przynależności elementów, usuwania duplikatów oraz implementacji operacji sumy i różnicy zbiorów na tablicach w języku C.
Wygenerowane przez model językowy.
REKLAMA