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

Sumowanie elementów zbiorów

Object Storage Arubacloud
+1 głos
224 wizyt
pytanie zadane 6 maja 2017 w C i C++ przez Don Corleone Obywatel (1,210 p.)

Witam, moim zadaniem jest zsumowanie elementów dwóch zbiorów i utworzenie nowego zbioru, nie chodzi o to aby dodac do siebie liczby tylko przerzucic wszystkie elementy zbiorów sumowanych do tego ktory otrzymac mam w wyniku, w moim kodzie wychodzą jakieś smieciowe wartości.

Generalnie mam zrobić funkcje sumujacą tablice dynamiczne utworzone przez uzytkownika w czasie programu.

Kod:



#include "stdafx.h"
#include <iostream>
using namespace std;

int* suma(int *tablica, int *tablica2)
{
	int i, j, rozmiar1=0, rozmiar2=0, rozmiar3=0;
	for (i = 0; i < sizeof(tablica) / sizeof(tablica[1]); i++)
	{
		rozmiar1++;
	}
	for (i = 0; i < sizeof(tablica2) / sizeof(tablica2[1]); i++)
	{
		rozmiar2++;
	}
	rozmiar3 = rozmiar1 = rozmiar2;
	int *tablica3 = new int[rozmiar3];
	for (i = 0; i < rozmiar1; i++)
	{
		tablica3[i] = tablica[i];
		for (j = 0; j < rozmiar2; j++)
		{
			tablica3[rozmiar1 + j] = tablica[2];
		}
	}
	return tablica3;
}

int main()
{
	int tablica[10];
	for (int i = 0; i < 10; i++)
	{
		tablica[i] = (i + 5);
	}

	int tablica2[15];
	for (int j = 0; j < 10; j++)
	{
		tablica2[j] = (j + 5);
	}
	int *tablica3;
	tablica3 = suma(tablica, tablica2);
	for (int k = 0; k < 25; k++)
	{
		cout << tablica3[k] << endl;
	}
    return 0;
}

 

komentarz 6 maja 2017 przez Evelek Nałogowiec (28,960 p.)
Jakoś nie zrozumiałem.... co ma się znaleźć w trzeciej tablicy? Wszystkie elementy z pierwszej i drugiej czy jeden element oznaczający sumę wszystkich z pierwszej i drugiej?

A może chcesz dodać do siebie po kolei czyli: tab1[0] + tab2[0] = tab3[0] itd.?
komentarz 6 maja 2017 przez Don Corleone Obywatel (1,210 p.)
Np

Zbior1={1,2,3,4}

Zbior2={1,2,3,4,5}

Zbior3={1,1,2,2,3,3,4,4,5}
komentarz 6 maja 2017 przez andrut Użytkownik (870 p.)
U mnie pierwsze co robi Twój program w trakcie kompilowania, to wyrzuca fatal error: stdafx.h: no such file or directory.
Za co to odpowiada?
komentarz 6 maja 2017 przez Don Corleone Obywatel (1,210 p.)
w visualu programujesz?

w 16 linijce powinno byc rozmiar3=rozmiar2+rozmiar1 ale to i tak nic nie powinno zmienic
komentarz 6 maja 2017 przez andrut Użytkownik (870 p.)
edycja 6 maja 2017 przez andrut
Nie, używam Sublime Text + kompilatora MinGW.
Sprawdziłem sobie tutaj: https://forum.pasja-informatyki.pl/59963/co-oznacza-%23include-stdafx-h
Zakomentowałem to i już działa.
Faktycznie wyrzuca dziwne wartości...
komentarz 6 maja 2017 przez Don Corleone Obywatel (1,210 p.)
Wczesniej programowalem w CodeBlocks i nie spotakalem sie tam z tym nagłówkiem, może jest on specjalny do visuala, nie orientuje sie w tym za bardzo , sproboj go usunac poprostu
komentarz 6 maja 2017 przez Evelek Nałogowiec (28,960 p.)
Czy to musi być tablica? Może to być valarray lub vector?
komentarz 6 maja 2017 przez Don Corleone Obywatel (1,210 p.)
Raczej nie musi, jednak valarray ani vector nie używałem więc byłoby mi z tym ciężko , wolałbym rozwiązanie bazujące na tym kodzie co mam i wskazanie ewentualnych błędów.

3 odpowiedzi

+2 głosów
odpowiedź 6 maja 2017 przez Evelek Nałogowiec (28,960 p.)
edycja 7 maja 2017 przez Evelek
 
Najlepsza

Uniwersalne dwa programy dla dowolnych rozmiarów tablic.

Wersja pierwsza na tablicach:

#include <iostream>
using namespace std;

int *merge(const int array_first[], const int size_first, const int array_second[], const size_t size_second, const size_t size_third) {
	int *array_third = new int[size_third];

	auto first1 = array_first;
	auto last1 = array_first + size_first;
	auto first2 = array_second;
	auto last2 = array_second + size_second;
	size_t count = 0;

	for (; first1 != last1; ++array_third, count++) {
		if (first2 == last2) {
			while (first1 != last1) {
				*array_third++ = *first1++;
				count++;
			}
			for (size_t i = 0; i < count; ++i)
				array_third--;
			return array_third;
		}
		if (*first2 < *first1) {
			*array_third = *first2;
			++first2;
		}
		else {
			*array_third = *first1;
			++first1;
		}
	}

	while (first2 != last2) {
		*array_third++ = *first2++;
		count++;
	}

	for (size_t i = 0; i < count; ++i)
		array_third--;

	return array_third;
}

int main() {
	cout << "First array (size): ";
	size_t size_first;
	cin >> size_first;
	cout << "Second array (size): ";
	size_t size_second;
	cin >> size_second;

	while (cin.get() != '\n')
		continue;

	int *array_first = new int[size_first];
	int *array_second = new int[size_second];

	for (size_t i = 0; i < size_first; ++i)
		array_first[i] = i+100;

	for (size_t i = 0; i < size_second; ++i)
		array_second[i] = i;

	size_t size_third = size_first + size_second;
	int *array_third = merge(array_first, size_first, array_second, size_second, size_third);

	for (size_t i = 0; i < size_third; ++i)
		cout << array_third[i] << " ";

    delete[] array_first;
    delete[] array_second;
    delete[] array_third;

	cin.get();
}

Wersja druga na vectorze:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
	cout << "First array (size): ";
	size_t size_first;
	cin >> size_first;
	cout << "Second array (size): ";
	size_t size_second;
	cin >> size_second;

	while (cin.get() != '\n')
		continue;

	vector<int> vec_first(size_first);
	vector<int> vec_second(size_second);

	for (size_t i = 0; i < size_first; ++i)
		vec_first[i] = i;

	for (size_t i = 0; i < size_second; ++i)
		vec_second[i] = i + 100;

	vector<int> vec_third;
	merge(vec_first.cbegin(), vec_first.cend(), vec_second.cbegin(), vec_second.cend(), back_inserter(vec_third));

	for (auto x : vec_third)
		cout << x << " ";

	cin.get();
}

 

komentarz 6 maja 2017 przez Don Corleone Obywatel (1,210 p.)

A wiedziałbyś jak  by to wyglądało tworząc zbiory w klasie Zbiory, a wykonując tą funkcje suma w inne klasie dziedziczonej np Zbiory_Liczb? Tak zeby wszystko działało dla niewiadomej z początku liczby zbiorów, dopiero użytkownik wpisuje.

Obiektowo od niedawna programuje i strasznie sie w tym gubie ;p

https://zapodaj.net/495a11b674139.png.html

komentarz 6 maja 2017 przez Evelek Nałogowiec (28,960 p.)
edycja 7 maja 2017 przez Evelek

Tak, wiedziałbym. Ale nie zrobię tego za Ciebie. Do operowania na zbiorach są gotowe funkcje, więc nie musisz ich wymyślać na nowo. Podałem zresztą 2 programy w których myślę ewidentnie pokazałem różnicę pomiędzy użyciem funkcji wbudowanych w język a pisaniem ich na nowo. Funkcje, które Ci się przydadzą:

  • set_union() - suma zbiorów
  • set_intersection() - iloczyn zbiorów
  • set_difference() - różnica zbiorów
  • set_symetric_difference() - różnica symetryczna zbiorów.

Wracając do problemu z głównego zadania - przypuszczam teraz, że będziesz chciał operować dalej na tablicy pierwszej i drugiej, więc drobna poprawka:

#include <iostream>
using namespace std;

int *merge(const int array_first[], const int size_first, const int array_second[], const size_t size_second, const size_t size_third) {
	int *array_third = new int[size_third];

	auto first1 = array_first;
	auto last1 = array_first + size_first;
	auto first2 = array_second;
	auto last2 = array_second + size_second;
	size_t count_first = 0;
	size_t count_second = 0;
	size_t count_third = 0;

	for (; first1 != last1; ++array_third, count_third++) {
		if (first2 == last2) {
			while (first1 != last1) {
				*array_third++ = *first1++;
				count_first++;
				count_third++;
			}
			for (size_t i = 0; i < count_first; ++i)
				array_first--;
			for (size_t i = 0; i < count_third; ++i)
				array_third--;
			return array_third;
		}
		if (*first2 < *first1) {
			*array_third = *first2;
			++first2;
			count_second++;
		}
		else {
			*array_third = *first1;
			++first1;
			count_first++;
		}
	}

	while (first2 != last2) {
		*array_third++ = *first2++;
		count_third++;
	}

	for (size_t i = 0; i < count_first; ++i)
		array_first--;
	for (size_t i = 0; i < count_second; ++i)
		array_second--;
	for (size_t i = 0; i < count_third; ++i)
		array_third--;
	
	return array_third;
}

int main() {
	cout << "First array (size): ";
	size_t size_first;
	cin >> size_first;
	cout << "Second array (size): ";
	size_t size_second;
	cin >> size_second;

	while (cin.get() != '\n')
		continue;

	int *array_first = new int[size_first];
	int *array_second = new int[size_second];

	for (size_t i = 0; i < size_first; ++i)
		array_first[i] = i+100;

	for (size_t i = 0; i < size_second; ++i)
		array_second[i] = i;

	size_t size_third = size_first + size_second;
	int *array_third = merge(array_first, size_first, array_second, size_second, size_third);

	cout << "First array:\n";
	for (size_t i = 0; i < size_first; ++i)
		cout << array_first[i] << " ";

	cout << "\nSecond array:\n";
	for (size_t i = 0; i < size_second; ++i)
		cout << array_second[i] << " ";

	cout << "\nThird array:\n";
	for (size_t i = 0; i < size_third; ++i)
		cout << array_third[i] << " ";

    delete[] array_first;
    delete[] array_second;
    delete[] array_third; 

	cin.get();
}

 

komentarz 6 maja 2017 przez Don Corleone Obywatel (1,210 p.)
Dzieki, bardzo pomogles :)
komentarz 6 maja 2017 przez draghan VIP (106,230 p.)

Evelek, a gdzie masz delete[]? :)))

komentarz 6 maja 2017 przez Evelek Nałogowiec (28,960 p.)
No patrz.. Drugi raz mnie już łapiesz na tym. :D Oczywiście, że delete[] tam jest potrzebne wszędzie... Don Corleone pamiętaj dopisać. ;)
0 głosów
odpowiedź 6 maja 2017 przez Wiciorny Ekspert (269,590 p.)
Mam program z implementacja wszystkich funkcji na zbiorach- pisanym w C++, bez użycia biblioteki gotowej STD::ALGORITM, zarówno na vektorach jak i "bardziej  nieoszczędnej i zjadatliwej opcji- tablicowej". Jeśli by Cię interesowało, coś-  napisz prywatną wiadomość.  Bo reszte kolega tutaj wkleił i ten problem moim zdaniem został juz wyczerpany.
–1 głos
odpowiedź 6 maja 2017 przez Marcin_N_97 Stary wyjadacz (10,290 p.)

Zacznijmy od tego, że programując w visual studio nie twórz projekt C++ tylko empty project, bo przez to masz ten śmieszny nagłówek, który powoduje wiele rzeczy w działa bodajże preprocesora, a Ty tego nie potrzebujesz, a gdybyś potrzebował to zrobiłbyś to na swój własny sposób :D

1. Skoro chcesz operować później na tablicach dynamicznych a nie statycznych to nie powinieneś używać takiego wyrażenia:

sizeof(tablica) / sizeof(tablica[1])

ponieważ dla tablicy statycznej zwróci rozmiar tablicy, a dla dynamicznej zróci 1 (w starszych kompilatorach) lub zrozmiar zmiennej np. int 4. Jednakże nie powinno się go używać do tego.

2. Przekazując funkcji tablice musisz pamiętać, że przekazujesz albo wskaźnik na początek i koniec tablicy, albo wskaźnik na początek i ilość elementów.

3. Kiedy zastosujesz się do powyższych możesz zrobić fora, który operauje na arytmetyce wskaźników, przez co zliczasz rozmiar obu tablic, a następnie alokujesz dynamicznie trzecią, do której przepisujesz pierw jedną, a potem drugą.

 

Wiedząc to co Ci wyżej napisałem powinieneś już sobie poradzić z tym problemem, jakbyś nadal czegoś nie rozumiał lub coś nie wychodziło to wal śmiało ;)

komentarz 6 maja 2017 przez Don Corleone Obywatel (1,210 p.)
Gdybym chcial przekazac do funkcji wskaznik na poczatek tablicy  to jak obliczyc ilosc elementow w tablicy dynamicznej nie wiedząc co wpisze uzytkownik?
komentarz 6 maja 2017 przez Marcin_N_97 Stary wyjadacz (10,290 p.)
Najbardziej popularne są dwa sposoby możliwości wpisywania elementów do tablicy:

1. Podaj ile chcesz wpisać elementów. I robisz tablicę dynamiczną, która pomieści tyle elementów, a następnie umożliwiasz wpisywać tyle elementów ile podał użytkownik (kontrola błędów, jeśli będzie chciał inaczej). Wtedy do funkcji dajesz wskaźnik na pierwszy element tablicy oraz liczbę elementów podaną przez użytkownika na początku.

2. Użytkownik wpisuje elementy aż do podania znaku kończącego np q. Wtey możesz zrobić to na dwa sposoby:

a) wpisywać to do statycznego bufory zajmującego dużo pamięci, aby nie dało się go zapełnić

b) wpisywać do tablic dynamicznej, jeżeli ktoś chce wpisać kolejny znak to przepisujesz to do innej tablicy dynamicznej, zwalniasz tą pierwszą i tworzysz ją o wielkości o jeden większą niż poprzednią. Mało wydajny sposób, ale czasami potrzebny.
komentarz 6 maja 2017 przez Don Corleone Obywatel (1,210 p.)
A jak mam zapisac ta liczbe elementow? Np jak uzytkownik stworzy sobie 5 zbiorow , kazdy z rozna liczba elementow a nastepnie bedzie chcial zsumowac 3 i 5?
komentarz 7 maja 2017 przez Marcin_N_97 Stary wyjadacz (10,290 p.)
Nie rozumiem chyba Twojego pytania? No po prostu masz zrobić np. int a; cin << a. No i tworzysz dynamiczną tablice a-elementową.

Podobne pytania

0 głosów
1 odpowiedź 104 wizyt
pytanie zadane 2 grudnia 2018 w C i C++ przez Sic Dyskutant (8,510 p.)
0 głosów
1 odpowiedź 612 wizyt
pytanie zadane 12 lutego 2020 w C i C++ przez Agnes Użytkownik (990 p.)
0 głosów
1 odpowiedź 500 wizyt
pytanie zadane 9 grudnia 2019 w Java przez krzy123 Początkujący (260 p.)

92,535 zapytań

141,376 odpowiedzi

319,449 komentarzy

61,920 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!

...