Liczba postów: 8
Liczba wątków: 4
Dołączył: 10.09.2013
18.04.2014, 15:46
[C/C++] Porównanie wartości w kilku tablicach jednowymiarowcyh
Zaprezentuje na przykladzie o co mi chodzi.
Mam 3 tablice
da() = {35,30,30}
db() = {20,20,30}
dc() = {35,30,50}
Chodzi o to zeby w efekcie uzyskac cos takiego
35 : 2
30 : 4
20 : 2
50 : 1
Czyli inaczej sumowanie/zliczanie tych 3 tablic i zapisanie moze do innej tablicy oraz wyswietlenie w formie powyzej. Ma ktos pomysl jak to wykonac?
 Ogłoszenie
Liczba postów: 8054
Liczba wątków: 287
Dołączył: 16.08.2009
18.04.2014, 17:52
RE: [C/C++] Porównanie wartości w kilku tablicach jednowymiarowcyh
Użyj tablicy dwuwymiarowej. na pozycji tablica[X][0] zapiszesz jaka to liczba, na pozycji tablica[X][1] liczbę powtórzeń.
Jeżeli liczby nie ma w tablicy tworzysz nowe miejsce, jeżeli jest zwiększasz liczbę wystąpień o jeden.
Każdy dzień bez forum to dzień stracony.
Liczba postów: 8
Liczba wątków: 4
Dołączył: 10.09.2013
18.04.2014, 17:56
RE: [C/C++] Porównanie wartości w kilku tablicach jednowymiarowcyh
musze to zrobic bez uzycia tablic dwuwymiarowych
Liczba postów: 8054
Liczba wątków: 287
Dołączył: 16.08.2009
18.04.2014, 18:06
RE: [C/C++] Porównanie wartości w kilku tablicach jednowymiarowcyh
Więc zapisuj wyniki do tablicy jednowymiarowej i pamiętaj które miejsce odpowiada której liczbie. Możesz też skorzystać z dodatkowych klas, takich jak Dictionary.
Każdy dzień bez forum to dzień stracony.
Liczba postów: 8
Liczba wątków: 4
Dołączył: 10.09.2013
18.04.2014, 21:59
(Ten post był ostatnio modyfikowany: 18.04.2014, 22:10 przez viamarimar.)
RE: [C/C++] Porównanie wartości w kilku tablicach jednowymiarowcyh
mowisz klas czyli nie idzie tego zrobic bez obiektowosci?
co to jest ta klasa dictionary?
pomogl by mi ktos to napisac, chyba jednak nie jestem mistrzem programowania ;/
Mam cos takiego i w dodatku nie w c bo nie mam kompilatora ale przerobic szybko,oczywiscie nie dziala tak jak chce ..
Kod:
For i = 0 To rozmiar2
juz_jest = 0
l = 0
Do While l < i
If (dc(i) = dc(l)) Then
juz_jest = 1
End If
l = l + 1
Loop
If (juz_jest = 0) Then
j = 1
k = i + 1
Do While k < rozmiar2
If (dc(i) = dc(k)) Then
j = j + 1
End If
k = k + 1
Loop
TextBox23.Text = TextBox23.Text & CStr(da(i)) & " " & CStr(j) + vbCrLf
End If
Next
Liczba postów: 8054
Liczba wątków: 287
Dołączył: 16.08.2009
18.04.2014, 22:17
(Ten post był ostatnio modyfikowany: 18.04.2014, 22:32 przez Rincewind.)
RE: [C/C++] Porównanie wartości w kilku tablicach jednowymiarowcyh
Jeżeli nie korzystasz z C++ z bibliotekami .NET sam musisz sobie taką klasę napisać. Jeżeli nie możesz korzystać z tablic dwuwymiarowych wydaje się to najbardziej eleganckim rozwiązaniem. Oczywiście jest parę innych sposobów ale jeżeli chcesz mieć taki wynik jak podałeś tj. liczba - ilość wystąpień wydaje mi się to dosyć prostym rozwiązaniem.
Możesz też pójść na skróty, napisać parę pętli które najpierw zapisuje aktualnie sprawdzany element do zmiennej, a następnie sprawdza każdą z tablic czy element ten się powtarza i natychmiast drukować wynik.
czyli w pseudokodzie:
Kod:
for(petla_wskazujaca_ktory_element_jest_sprawdzany)
int element = tablica[x];
int wynik = 1;
for(pętla_przechodząca_przez_kazda_z_tablic)
if(tablica[i] == element)
wynik++;
if(tablica1[i] == element)
wynik++;
if(tablica2[i] == element)
wynik++;
cout << element << " = " << wynik << endl;
I tak dalej. Rozwiązań jest parę, parę masz tu podanych.
Tutaj masz przykładowy program w C#, błędnie drukuje wyniki (tj. po każdym przejściu głównej pętli wyświetla wynik - do poprawienia, ale samo liczenie działa.
Kod:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TablicaCheck
{
class Program
{
private static int []tablica = {12, 22, 32, 11};
private static int []tablica1 = {13, 11, 22, 32};
private static int []tablica2 = {12, 11, 4, 2};
static void Main(string[] args)
{
Console.WriteLine("Sprawdzamy ile razy jaki element się pojawia w tablicach");
for(int i = 0; i < 4; i++)
{
int element = tablica[i];
int wynik = 0;
for(int x = 0; x < 4; x++)
{
if (tablica[x] == element)
wynik++;
if (tablica1[x] == element)
wynik++;
if (tablica2[x] == element)
wynik++;
}
Console.WriteLine(element + " " + wynik);
element = tablica1[i];
wynik = 0;
for (int x = 0; x < 4; x++)
{
if (tablica[x] == element)
wynik++;
if (tablica1[x] == element)
wynik++;
if (tablica2[x] == element)
wynik++;
}
Console.WriteLine(element + " " + wynik);
element = tablica2[i];
wynik = 0;
for (int x = 0; x < 4; x++)
{
if (tablica[x] == element)
wynik++;
if (tablica1[x] == element)
wynik++;
if (tablica2[x] == element)
wynik++;
}
Console.WriteLine(element + " " + wynik);
}
Console.ReadKey();
}
}
}
Nie kompilowałem go ale powinien działać. Zmodyfikuj go i przeanalizuj - może coś się przyda.
Każdy dzień bez forum to dzień stracony.
Liczba postów: 8
Liczba wątków: 4
Dołączył: 10.09.2013
19.04.2014, 02:20
(Ten post był ostatnio modyfikowany: 19.04.2014, 02:25 przez viamarimar.)
RE: [C/C++] Porównanie wartości w kilku tablicach jednowymiarowcyh
No tak samo liczenie dziala, nawet sie kompliuje jak sie wwywali jednego z usingow, ale mniejsza o to. Wystepuje tu problem ktory ja mam przez caly czas. Umiem wykonac to zadanie dla jednej tablicy czyli pozliczac i zapisac w w/w postaci. Nawet wyszlo mi dla dwoch(sposobem), ale nie wiem jak to zrobic dla trzech. Nie mam kompletnie pomyslu jak to zrobic. Wezmy na przykladzie tego co dales, bo to raczej to o co mi chodzi
Dla pierwszej tablicy zwracane wyniki w postaci
Console.WriteLine(element + " " + wynik);
dla kolejnej
Console.WriteLine(element + " " + wynik);
i ostatniej
Console.WriteLine(element + " " + wynik);
czyli wyniki sie dubluja a moj najwiekszy problem w tym co zrobic zeby przy pomocy wyswietlenia
Console.WriteLine(element + " " + wynik);
zwracana byla zliczona juz wartosc z trzech tablic nie suma a jak w formie jak powyzej
Liczba postów: 2466
Liczba wątków: 17
Dołączył: 12.11.2007
19.04.2014, 08:07
(Ten post był ostatnio modyfikowany: 19.04.2014, 12:47 przez Szachista.)
RE: [C/C++] Porównanie wartości w kilku tablicach jednowymiarowcyh
Można to zadanie rozwiązać ładnie z użyciem STL:
Kod:
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int, int> val;
int t_1[] = {35,30,30}, t_2[] = {20,20,30}, t_3[] = {35,30,50};
for (int i = 0; i < 3; i++)
{
val[t_1[i]]++;
val[t_2[i]]++;
val[t_3[i]]++;
}
for (map<int, int>::iterator i = val.begin(); i != val.end(); i++)
cout << i->first << ':' << i->second << endl;
return 0;
}
Można i bez:
Kod:
#include <stdio.h>
int val_to_idx(int val, int *indices)
{
int *i = indices;
while (*i != val && *i != 0)
i++;
*i = val;
return i - indices;
}
int main()
{
int t_1[] = {35,30,30}, t_2[] = {20,20,30}, t_3[] = {35,30,50}, i, indices[256] = {0}, count[256] = {0};
for (i = 0; i < 3; i++)
count[val_to_idx(t_1[i], indices)]++;
for (i = 0; i < 3; i++)
count[val_to_idx(t_2[i], indices)]++;
for (i = 0; i < 3; i++)
count[val_to_idx(t_3[i], indices)]++;
for (i = 0; indices[i] != 0; i++)
printf("%2d : %d\n", indices[i], count[i]);
return 0;
}
Wadą tego rozwiązania jest to, że wykorzystuje 0 jako informację, że dana liczba nie wystąpiła jeszcze (jeśli 0 należy do zbioru, to program się wysypie).
Zamiast powyższego rozwiązania możesz też wykorzystać listę jednokierunkową:
Kod:
#include <stdio.h>
#include <stdlib.h>
typedef struct __list
{
int val, count;
struct __list *next;
} list;
list *values = NULL;
int add_val(int val)
{
if (values == NULL)
{
values = (list*)malloc(sizeof(list));
values->val = val;
values->count = 1;
values->next = NULL;
return 0;
}
else
{
list *head = values;
while (head->next != NULL)
{
if (head->val == val)
{
head->count++;
return;
}
head = head->next;
}
if (head->val == val)
{
head->count++;
return;
}
head->next = (list*)malloc(sizeof(list));
head = head->next;
head->val = val;
head->count = 1;
head->next = NULL;
}
}
int main()
{
int t_1[] = {35,30,30}, t_2[] = {20,20,30}, t_3[] = {35,30,50}, i;
list *head = values;
for (i = 0; i < 3; i++)
add_val(t_1[i]);
for (i = 0; i < 3; i++)
add_val(t_2[i]);
for (i = 0; i < 3; i++)
add_val(t_3[i]);
for (head = values; head != NULL; head = head->next)
printf("%2d : %d\n", head->val, head->count);
head = values;
while (head != NULL)
{
head = head->next;
free(values);
values = head;
}
return 0;
}
|