Strona 1 z 1
zwracanie przez funkcje wielu wartości [C]
: 15 lis 2010, o 21:18
autor: wawek91
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.
zwracanie przez funkcje wielu wartości [C]
: 16 lis 2010, o 11:48
autor: rozkminiacz
wskaznik
zwracanie przez funkcje wielu wartości [C]
: 16 lis 2010, o 13:00
autor: wawek91
wskaźnik ale do czego? tak jak napisałem, wpisywac te litery do tablicy i zwrócic wskaźnik do tej tablicy?
zwracanie przez funkcje wielu wartości [C]
: 16 lis 2010, o 15:42
autor: kadiii
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.
zwracanie przez funkcje wielu wartości [C]
: 16 lis 2010, o 19:08
autor: wawek91
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).
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;
}
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.
zwracanie przez funkcje wielu wartości [C]
: 16 lis 2010, o 19:37
autor: kadiii
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".
zwracanie przez funkcje wielu wartości [C]
: 16 lis 2010, o 20:57
autor: wawek91
Mhm więc rozumiem, że bez dynamicznego tworzenia tablic nic tu nie zdziałam tak?
zwracanie przez funkcje wielu wartości [C]
: 16 lis 2010, o 21:36
autor: kadiii
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 ]
zwracanie przez funkcje wielu wartości [C]
: 16 lis 2010, o 23:12
autor: smiechowiec
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;
}