zwracanie przez funkcje wielu wartości [C]
-
- Użytkownik
- Posty: 795
- Rejestracja: 2 cze 2010, o 08:56
- Płeć: Mężczyzna
- Lokalizacja: Tarnów
- Podziękował: 14 razy
- Pomógł: 66 razy
zwracanie przez funkcje wielu wartości [C]
Witam mam problem z czyms takim:
Chciałbym napisać funkcję która porownuje dwa stringi i sprawdza czy jakies literyz pierwszego powtarzają się w drugim, mogą się powtarzac lub też nie, oraz ilośc tych powtórzeń. Hm może najlepiej przykład:
1string: 'pies'
2string: 'małpa'
W tym przykładzie funkcja powinna zwrócić 'p' oraz liczbę 1
przykład2.
1string: 'banan'
2string: 'alibaba'
zwraca: 'a' i 3 oraz 'b' i 2
Nie do końca jednak w tym tkwi problem, bo moge napisać tak żeby wypisywało ile w sumie tych liter wystąpiło (tj. 1przykład p 2x, 2przykład a 5x b 3x) To nie o to mi chodzi. Moj problem tkwi w tym, że skoro na początku nie wiem czy zwroce tylko litere 'a' czy zwróce 'a' i 'b' czy zwroce cały alfabet to w jaki sposób to 'załatwić w mojej funkcji? Wiem że musze wykorzystać wskaźniki, ale skoro nie wiem ile tych liter zostanie zwróconych to najlepiej je wpisywać do jakiejś tablicy a na końcu zwrócić wskaźnik do pierwszego elementu tej tablicy?
Troche sie rozpisałem, ale mam nadzieje ze dobrze nakreślilem swoj problem. Pozdrawiam.
Chciałbym napisać funkcję która porownuje dwa stringi i sprawdza czy jakies literyz pierwszego powtarzają się w drugim, mogą się powtarzac lub też nie, oraz ilośc tych powtórzeń. Hm może najlepiej przykład:
1string: 'pies'
2string: 'małpa'
W tym przykładzie funkcja powinna zwrócić 'p' oraz liczbę 1
przykład2.
1string: 'banan'
2string: 'alibaba'
zwraca: 'a' i 3 oraz 'b' i 2
Nie do końca jednak w tym tkwi problem, bo moge napisać tak żeby wypisywało ile w sumie tych liter wystąpiło (tj. 1przykład p 2x, 2przykład a 5x b 3x) To nie o to mi chodzi. Moj problem tkwi w tym, że skoro na początku nie wiem czy zwroce tylko litere 'a' czy zwróce 'a' i 'b' czy zwroce cały alfabet to w jaki sposób to 'załatwić w mojej funkcji? Wiem że musze wykorzystać wskaźniki, ale skoro nie wiem ile tych liter zostanie zwróconych to najlepiej je wpisywać do jakiejś tablicy a na końcu zwrócić wskaźnik do pierwszego elementu tej tablicy?
Troche sie rozpisałem, ale mam nadzieje ze dobrze nakreślilem swoj problem. Pozdrawiam.
- rozkminiacz
- Użytkownik
- Posty: 465
- Rejestracja: 24 wrz 2008, o 20:12
- Płeć: Mężczyzna
- Lokalizacja: Krk
- Podziękował: 65 razy
- Pomógł: 36 razy
- kadiii
- Użytkownik
- Posty: 642
- Rejestracja: 20 gru 2005, o 21:04
- Płeć: Mężczyzna
- Lokalizacja: Wrocław
- Pomógł: 130 razy
zwracanie przez funkcje wielu wartości [C]
Nie weim czy do końca rozumiem o co ci chodzi bo trochę metnie tłumaczysz. Jesli chodzi o zadanie to najlepiej jest chyba zrobić dając w parametrze funkcji tablicę i do niej wpisywac ilość powtórzeń. Uzyskałbyś tablice w stylu: tab[0]=3,tab[1]=1 itd która oznaczałaby ilość powtórzeń poszczególnej litery(do łatwego wpisywania i wypisywania można uzyc wartości ASCII liter). Jesli nie o to ci chodzi i chcesz wypisać ciąg o nieznanej długości to rzeczywiście można użyc funkcji, która zwraca wskaźnik - oczywiście wewnątrz funkcji musisz zaalokowac miejsce w pamięci i przypisac do tego adresu, Tyle że w wyniku usyzkałbyś ciąg typu aabba... - nie wiem czy to jest celem. Jeszcze innym rozwiązaniem moze być utworzenie struktury litera, która zawierałaby informację o jaką literę chodzi i ile razy sie powtórzyła. Dalej postępujesz jak w drugim przypadku czyli w efekcie uzyskujesz wskaźnik na tablice struktur.
-
- Użytkownik
- Posty: 795
- Rejestracja: 2 cze 2010, o 08:56
- Płeć: Mężczyzna
- Lokalizacja: Tarnów
- Podziękował: 14 razy
- Pomógł: 66 razy
zwracanie przez funkcje wielu wartości [C]
No ok więc może najlepszym pomyslem będzie wrzucenie swojego kodu (najwyżej zrobie z siebie idiote ale pewnie moj problem sie rozwiaze).
Przy takim kodzie wyświetlane są krzaczki czyli teoretycznie (tak mi sie wydaje) litery ktore mialy zostac zwrocone zostaly zniszczone a wyświetlane są elementy tablicy do których nic nie przypisaliśmy, stąd te śmieci. Tylko, że juz nie mam pomysłu jak inaczej zwrócić te literki przez tą funkcję.
PS: póki co w moim programie pomijam zwracanie ilości powtorzonych liter.
Kod: Zaznacz cały
#include <stdio.h>
#include <stdlib.h>
#define MAX 30
void porownanie(char wyraz1[], char wyraz2[], char c[])
{
int i, j, t = 0;
char tab[MAX];
for(i = 0; wyraz1[i] != '\0'; i++)
{
for(j = 0; wyraz2[j] != '\0'; j++)
{
if(wyraz1[i] == wyraz2[j])
{
*c = wyraz1[i];
c + 1;
}
}
}
}
int main(int argc, char *argv[])
{
char slowo1[MAX], slowo2[MAX];
fgets(slowo1, sizeof(slowo1), stdin);
fgets(slowo2, sizeof(slowo2), stdin);
char temp[MAX];
porownanie(slowo1, slowo2, temp);
printf("\nlitery powtarzajace sie w obu wyrazach to");
puts(temp);
printf("\n\n");
system("PAUSE");
return 0;
}
PS: póki co w moim programie pomijam zwracanie ilości powtorzonych liter.
- kadiii
- Użytkownik
- Posty: 642
- Rejestracja: 20 gru 2005, o 21:04
- Płeć: Mężczyzna
- Lokalizacja: Wrocław
- Pomógł: 130 razy
zwracanie przez funkcje wielu wartości [C]
Rozumiem, ze chcesz aby poprawić twoją koncepcję?
zamień na
Pozostałe "krzaki" musisz niestety albo obciąć z powstałego łańcucha albo ich nie wypisywać(w obu przypadkach musisz znać ilośc liter, które sie powtórzyły). jest to oczywiście wynikiem deklaracji tabnlicy "na sztywno".
Kod: Zaznacz cały
c+1
Kod: Zaznacz cały
c++
- kadiii
- Użytkownik
- Posty: 642
- Rejestracja: 20 gru 2005, o 21:04
- Płeć: Mężczyzna
- Lokalizacja: Wrocław
- Pomógł: 130 razy
zwracanie przez funkcje wielu wartości [C]
Zależy na czym ci najbardziej zależy. Najlepiej to zadanie rozwiązać tak jak podałem w pierwszym poście, ale jak się uparłeś w takiej formie to na pewno dynamiczna alokacja byłaby wskazana. Przecież zwykłym wskaźnikiem pokazujesz tylko na początek obszaru a nie na jego koniec - a zaalokowany na sztywno wskaźnik poprzez podanie rozmiaru tablicy już go z góry okreslą. [poprawiłem bo mi alt coś siada w klawiaturze ]
-
- Użytkownik
- Posty: 374
- Rejestracja: 21 cze 2007, o 11:28
- Płeć: Mężczyzna
- Lokalizacja: Łostowice
- Pomógł: 146 razy
zwracanie przez funkcje wielu wartości [C]
Jeśli chodzi tylko o wypisanie liczby wystąpień znaków z pierwszego wyrazu w drugim wyrazie to Twój program można by zmodyfikować np tak
Kod: Zaznacz cały
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 30
#define LICZBA_ZNAKOW 256
void porownanie(char wyraz1[], char wyraz2[], char c[]) {
int i = 0, j = 0;
unsigned char tab[LICZBA_ZNAKOW]; // tablica 255 możliwych znaków
char tabpomocnicza[LICZBA_ZNAKOW];
for(i = 0; i < LICZBA_ZNAKOW; i++)
tab[i] = 0; // zerowanie tablicy
for(i = 0; wyraz1[i]; i++) {
if (!tab[(unsigned char) wyraz1[i]]) // Jeżeli jeszcze nie sprawdzono pozytywnie danej litery
for(j = 0; wyraz2[j]; j++) {
if (wyraz2[j] == wyraz1[i]) {
tab[(unsigned char) wyraz1[i]]++; // Zwiększ liczbę wystąpień znaku wyraz1[j] o 1
}
}
}
for(i = 32; i < LICZBA_ZNAKOW; i++) // Zaczynamy od spacji kod 32
if (tab[i]) {
sprintf(tabpomocnicza, "%c=%d, ", i, tab[i]); //zapis wyniku do zmiennej pomocniczej
strcat(c, tabpomocnicza); // Dodanie zmiennj pomocniczej do wyniku końcowego
}
}
int main(int argc, char *argv[]) {
char slowo1[MAX], slowo2[MAX];
printf("Podaj pierwszy wyraz : ");
fgets(slowo1, sizeof(slowo1), stdin);
printf("Podaj drugi wyraz : ");
fgets(slowo2, sizeof(slowo2), stdin);
char temp[MAX * 4] = "";
porownanie(slowo1, slowo2, temp);
printf("Litery powtarzajace sie w obu wyrazach to ");
printf("%s
", temp);
//system("PAUSE");
return 0;
}