na codeblocks gdy wpisuję string a="Usmiech!" To nie znajduje funkcji string. Czy string potrzebuje jakiejś innej biblioteki niż stdio?
Wersja do druku
Chciałbym posortować tablicę liczb całkowitych, w funkcji która przyjmuje tylko jako argumenty tablicę i rozmiar n. Wiec pomyślałem, aby w funkcji odwołać się do funkcji, przerobiłem quickSorta z internetu pod moje zmienne, i wyskakują błędy przypisania wskaźnika do inta(bo jako argument podaje podwójny wskaźnik), jak to mogę inaczej zrobić lub jak przerobić kod tego sortowania żeby to śmigało(próbowałem na wiele sposobów, ale bez tipów nie dam rady).
KOD: http://pastebin.com/1QbwfWjC
Kod:#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct znaki {
int lcalk;
};
// FUNKCJE \\
void quickSort(znaki * tab, int left, int right) {
int i = left, j = right;
znaki tmp;
int pivot;
pivot = tab[(left + right) / 2].lcalk;
/* partition */
while (i <= j) {
while (tab[i].lcalk < pivot)
i++;
while (tab[j].lcalk > pivot)
j--;
if (i <= j) {
tmp = tab[i];
tab[i] = tab[j];
tab[j] = tmp;
i++;
j--;
}
};
/* recursion */
if (left < j)
quickSort(tab, left, j);
if (i < right)
quickSort(tab, i, right);
}
//MAIN
int main() {
int n = 5, i;
char x = 'h';//szukany znak
znaki tab[5];
//przed sortowaniem
for (i = 0; i<n; i++)
printf("Liczba numer %d, ma wartosc %d\n", i, tab[i].lcalk);
quickSort(tab, 0,n-1);
printf("\n");
//po sortowaniu
for (i = 0; i<n; i++)
printf("Liczba numer %d, ma wartosc %d\n", i, tab[i].lcalk);
system("PAUSE");
return EXIT_SUCCESS;
}
@up dzięki za tip ! Chyba jako jedyny zrozumiałeś ! Danke ! :)
Kod:#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
//Struktura:
struct znaki {
int lcalk;
char znak;
double lzmienno;
};
// FUNKCJE \\
struct znaki ** losowanie(int n) {
int i;
struct znaki (**tab) = (struct znaki**)malloc ( sizeof(struct znaki) *n);//wskaźnik na wskaźnik tablicy struktur
for (i=0;i<n;i++) { //przypisanie struktury do tablicy wskaźników
tab[i] = (struct znaki*)malloc( sizeof(struct znaki));
}
srand((unsigned)time(0));//pseaudolosowość liczb uzależniona od czasu rzeczywistego
for ( i=0 ; i<n ; i++) {
tab[i]->lcalk = rand() % 10000001; // liczba z <0:10^6>
tab[i]->znak = rand() % (26) + 97; //małe litery przedział z kodu ASCII <97;122>
// tab[i]->znak = 97 + rand() % 26;
tab[i]->lzmienno = 8;
}
return tab ; //zwraca adres tablicy
}
void kasowanie(struct znaki** tab, int n) {
int i;
for ( i=0 ; i<n ; i++) {
free(tab[i]);
}
free(tab);
}
void quickSort(struct znaki ** tab, int left, int right) {
int i = left, j = right;
znaki *tmp;
int pivot;
pivot = (*tab[(left + right) / 2]).lcalk;
/* partition */
while (i <= j) {
while ((*tab[i]).lcalk < pivot)
i++;
while ((*tab[j]).lcalk > pivot)
j--;
if (i <= j) {
tmp = tab[i];
tab[i] = tab[j];
tab[j] = tmp;
i++;
j--;
}
};
/* recursion */
if (left < j)
quickSort(tab, left, j);
if (i < right)
quickSort(tab, i, right);
}
int zlicz_znaki(struct znaki** tab, int n, char x) {
int i,licznik=0;
for ( i=0 ; i<n-1;i++) {
if (tab[i]->znak == x)
licznik++;
}
return licznik;
}
//MAIN
int main() {
//Zegar start:
clock_t begin,end;
double time_spent;
begin = clock();
int n=300000,i;
int licznik;//liczba struktur, liczna wystąpień znaku
char x='h';//szukany znak
//Wywołanie funkcji:
struct znaki** tab = losowanie(n);
//przed sortowaniem
for (i=0;i<n;i++)
printf("Liczba numer %d, ma wartosc %d\n",i,tab[i]->lcalk);
quickSort(tab, 0,n-1);
printf("\n");
//po sortowaniu
for (i=0;i<n;i++)
printf("Liczba numer %d, ma wartosc %d\n",i,tab[i]->lcalk);
licznik = zlicz_znaki(tab, n, x);
kasowanie(tab,n);
//Zegar stop:
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Liczba wystapien znaku: %d\n",licznik);
printf("Czas wykonania skryptu: %f\n",time_spent);
system("PAUSE");
return EXIT_SUCCESS;
}
Ja tak zrobiłem i sortuje ładnie ;o
Cytuj:
void quickSort(struct znaki ** tab, int left, int right) {
int i = left, j = right;
int tmp;
int pivot;
pivot = tab[(left + right) / 2]->lcalk;
/* partition */
while (i <= j) {
while (tab[i]->lcalk < pivot)
i++;
while (tab[j]->lcalk > pivot)
j--;
if (i <= j) {
tmp = tab[i]->lcalk;
tab[i]->lcalk = tab[j]->lcalk;
tab[j]->lcalk = tmp;
i++;
j--;
}
};
/* recursion */
if (left < j)
quickSort(tab, left, j);
if (i < right)
quickSort(tab, i, right);
}
No ja w sumie też zacząłem C++, no ale już tam na zajęciach cały semestr tłukliśmy to C :P. No to ja zacząłem czytać Symfonię C++, większość ludzi ją poleca, no wg mnie jest dobra, ale nie mam porównania z tą książką Praty. Dodatkowo polecam to : http://helion.pl/ksiazki/wskazniki-w...ese,wskazc.htm
Spróbuj najpierw jedną jak ci nie podpasuje to spróbuj z drugą. Ja przeczytałem symfonię i pasję i obie te czesci mialem w pdfie ale jako skany. I w międzyczasie gdy czegoś nie pamiętałem to zamiast wracać gdzieś do poprzednich stron to szukałem właśnie w cpp primer bo tam mogłem szukać wyszukiwarką w tekście ;p
Ponadto cpp primer wydawała mi się znacznie bardziej zrozumiale napisana pomimo tego że ją po angielsku czytałem. A symfonia była bardziej wymagająca jeśli chodzi o skupienie. Często w symfonii są duże kawałki kodu, czasem podzielone na kilka stron, a pod tymi liniami są obszerne wyjaśnienia. Mi się często trudno było na tym skupić. Ale z drugiej strony zrozumienie kodu i zaimplementowanie go potem w podobny sposób daje bardzo dużo.
A jak mi się nie chciało nic robić to puszczałem filmiki typu:
https://www.youtube.com/watch?v=ABRP...E50B89DA30C77A
Żeby sobie utrwalić wiadomości + załapać angielskiego
https://www.youtube.com/watch?v=7arYbAhu0aw
Mimo wszystko i tak najlepszym sposobem jest po prostu pisanie kodu. A bez pisania dużej ilości kodu się zapomni tych wiadomości z książek
Nigdzie lepiej nie nauczycie sie kodzic, niż podczas pisania swoich programów i szukając pomocy na necie w celu rozwiązania swoich problemów.
Moim zdaniem czytanie książki 1k stron na starcie swojej przygody to strata czasu