zwracanie przez funkcje wielu wartości [C]

wawek91
Użytkownik
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]

Post 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.
Awatar użytkownika
rozkminiacz
Użytkownik
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

zwracanie przez funkcje wielu wartości [C]

Post autor: rozkminiacz »

wskaznik
wawek91
Użytkownik
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]

Post autor: wawek91 »

wskaźnik ale do czego? tak jak napisałem, wpisywac te litery do tablicy i zwrócic wskaźnik do tej tablicy?
Awatar użytkownika
kadiii
Użytkownik
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]

Post 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.
wawek91
Użytkownik
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]

Post 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.
Awatar użytkownika
kadiii
Użytkownik
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]

Post 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".
wawek91
Użytkownik
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]

Post autor: wawek91 »

Mhm więc rozumiem, że bez dynamicznego tworzenia tablic nic tu nie zdziałam tak?
Awatar użytkownika
kadiii
Użytkownik
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]

Post 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 ]
smiechowiec
Użytkownik
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]

Post 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;
}
ODPOWIEDZ