Problem z programem ...

0

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);
}

1
printf("komparatorX %s\n", *compar);

Cóż ty tutaj chciałeś osiągnąć? Bo jeśli wypisanie nazwy funkcji, to nie bardzo to zadziała. C nie ma mechanizmów refleksji, które by ci takie działanie ułatwiły.

printf("daycmpr:->%s ->%s\n",*a,*b);

To samo tutaj. Tak jakbyś oczekiwał, że C ci magicznie zamieni całą strukturę na stringa. Niestety nie. Musisz zrobić to jakoś inaczej. Np. zdefiniować funkcję day_print(struct DAY *day);, która wypisze każde pole z osobna.

        (int (*)(void *, void *))(stringcmpr)

To rzutowanie też jest jakieś karkołomne. Albo zrób typedefa albo najlepiej postaraj się, żeby przekazywane funkcje miały odpowiednią sygnaturę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1