Po zapoznaniu się z dokumentacją qsort zmień implementacje bubblesorta oraz insertsorta tworząc uniwersalne funkcje sortujące (argumenty tych funkcji takie jak dla qsort). Napisz program sortujący za ich pomocą zarówno tablicę tekstów , jak i tablicę dni . Z tego co zrozumialem tresc tego polecenia to moje funkcje muszą wyglądac troche jak qsort więc tez niewiem czy dobrze ogarnałem to polecenie ;)
Jak na razie udało mi się przekształcić bubblesorta a inserta nie , bubblesort dziala dla stringów ale nie moge go sprawdzic dla dni bo nie wiem jak zczytywac te dni od uzytkownika oraz je potem wypluwac z powrotem.Coś juz sam napisałem jestem początkującym programistą wiec proszę o wyrozumiałość i prosiłbym żeby ktoś dokończyl mi ten program bo juz nie mam cierpliwości to tego :)
main.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "sort.h"
#include "days.h"
#include "cmpr.h"
void instruction(){
printf("\nzad18\n");
printf("usage: zad18 -n name\n\nn");
printf("name:\n");
printf("bubble - for bubble string sort\n");
printf("insert - for insert string sort\n\nn");
}
/*char* testString() {
char* tabTest[6]= {"dziwak", "burak" ,"arduino" ,"celina","elfy","foka"};
return tabTest;
}*/
int main (int argc, char**argv) {
printf("Podales argumentow %d\n",argc);
if(argc<3) {
printf("\nNieprawidlowe argumenty(za mało)\n");
instruction();
return -1;
}
char *sortAlgotithm = argv[2];
printf("Podales argumentow %s, %s %s", argv[1], sortAlgotithm, argv[3]);
if(strcmp(argv[1],"-n")!=0 && strlen(sortAlgotithm)==0){
instruction();
printf("\nNieprawidlowe argumenty(za krotkie)\n");
return -1;
}
if(argv[3]==NULL)
argv[3]="";
if(strcmp(argv[3],"dni")!=0){
/////////////////Do Stringów Sortowanie//////////////////////
int size=0;
printf("\n\nWybrales %s ,Podaj rozmiar tablicy\n",sortAlgotithm);
scanf("%d",&size);
char **tab = (char**)malloc(size*sizeof(char*));
printf("\n\nWpisz slowa ktore chcesz posortowac wciskajac enter po kazdym:\n\n");
char buf[0x1000] = {'\0'};
for (int i = 0; i < size; i++) {
scanf("%s", buf);
tab[i] = calloc(strlen(buf) + 1, sizeof(char));
strcpy(tab[i], buf);
}
if(strcmp(sortAlgotithm,"insert")==0) {
insertsort(tab, size, sizeof (char *), (int (*)(void*, void*))(stringcmpr));
}
else if(strcmp(sortAlgotithm,"bubble")==0){
bubblesort(tab, size, sizeof (char *), (int (*)(void*, void*))(stringcmpr));
}
printf("\nPO SORTOWANIU STRINGI\n");
for(int i = 0; i < size; i++) {
printf("%s\n", tab[i]);
}
free(tab);
}
///////////////////////////////////////////////////////////////////////////////
if(strcmp(argv[3],"dni")==0){
printf("SORTOWANIE DNI :\n");
struct DAY d1 = {1234, 5, 6};
struct DAY d2 = {1999, 5, 6};
struct DAY d3 = {1234, 2, 28};
struct DAY dni[] = { d1, d2, d3 };
int sizeday = 3;
bubblesort(dni, sizeday, sizeof(struct DAY),( int( * )( const void *, const void * )) (dayscmpr));
printf("PO SORTOWANIU :\n");
for(int i = 0; i < sizeday; i++){
printf("%s-%s-%s\n", dni[i].rok, dni[i].miesiac,dni[i].dzien);
}
return 1;
}
}
bubble.c
#include"sort.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void bubblesort (void **inputTab, int sizeOfTab, int sizeOfObject,int (*compar) (const void *, const void *)) {
// char *temp;
unsigned char *ptr = inputTab;
unsigned char tmp[256];
if(sizeOfTab < 2 || sizeOfObject == 0)
return;
printf("komparatorX %s\n",*compar);
for (int i = 0; i < sizeOfTab - 1; i++) {
for (int j = 0; j < sizeOfTab - 1 - i; j++) {
//int result = (*compar)((inputTab+j), (inputTab+j + 1));
int result = (*compar)((ptr + sizeOfObject * j), (ptr + sizeOfObject * (j+1)));
if (result > 0) {
// temp = inputTab[j + 1];
// inputTab[j + 1] = inputTab[j];
// inputTab[j] = temp;
memcpy(tmp, ptr + sizeOfObject*(j), sizeOfObject);
memcpy(ptr + sizeOfObject*(j), ptr + sizeOfObject*(j+1), sizeOfObject);
memcpy(ptr + sizeOfObject * (j+1), tmp, sizeOfObject);
}
}
}
}
insert.c
#include"sort.h"
#include <stdlib.h>
#include <string.h>
void insertsort (void **inputTab, int sizeOfTab, int sizeOfObject,int (*compar) (const void *, const void *)) {
printf("insert sort start:\n");
char *temp;
int j;
for (int i = 1; i < sizeOfTab; i++) {
temp=inputTab[i];
printf("petla insert start %d %s:\n",i,temp);
j=i-1;
printf("petla insert compare %d %s == %s:\n",i,temp, *(inputTab+j));
printf("komparator %s\n",*compar);
int result = (*compar)((inputTab+j),&temp);
printf("petla insert result %d :\n",result);
while(j>=0 && ((*compar)((inputTab+j),&temp))>0){
inputTab[j+1]=inputTab[j];
j=j-1;
}
inputTab[j+1]=temp;
}
printf("insert sort end:\n");
}
sort.h
#ifndef sort_h
#define sort_h
void bubblesort( void **inputArray, int sizeOfArray, int sizeOfObject,int (*comp)(const void *, const void *) );
void insertsort( void **inputArray, int sizeOfArray, int sizeOfObject,int (*comp)(const void *, const void *) );
#endif
days.h
#ifndef days_h
#define days_h
struct DAY;
int days(struct DAY , struct DAY);
struct DAY {
int dzien;
int miesiac;
int rok;
};
#endif
cmpr.h
#ifndef cmpr_h
#define cmpr_h
#include "days.h"
int stringcmpr(const void *a, const void *b);
int dayscmpr(struct DAY *a, struct DAY *b);
#endif
cmpr.c
#include "cmpr.h"
#include "days.h"
#include <stdlib.h>
#include <string.h>
int dayscmpr(struct DAY *a, struct DAY *b){
printf("daycmpr:->%s ->%s\n",*a,*b);
int r = (*a).rok- (*b).rok;
if(r != 0){
return r;
}
int m = (*a).miesiac- (*b).miesiac;
if(m != 0){
return m;
}
return (*a).dzien- (*b).dzien;
}
int stringcmpr(const void *a, const void *b) {
const char **ia = (const char **)a;
const char **ib = (const char **)b;
printf("stringcmpr:->%s ->%s\n",*ia,*ib);
return strcmp(*ia, *ib);
}