|- - -|
|

Napisati program mysort koji koji leksikografski sortira u neopadajućem poretku linije teksta sa ulaza (niz linija limitirane dužine). Ako je kao argument komandne linije zadat opcioni argument -n , onda izvršiti numeričko sortiranje. Ako je kao argument komandne linije zadat opcioni argument -r , onda promeniti redosled sortiranja u nerastući poredak. Obezbediti da program radi i kad su prisutna oba opciona argumenta -r -n . Može se pretpostaviti da ukupan broj linija nije veći od 1000, kao i da dužina svake linije nije veća od 80 karaktera.
rešenje (.c)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX 1000
#define MAXDUZ 80
char *lineptr[MAX];
int getline(char a[], int lim);
int readlines(char *s[], int max);
int uporedi(char a[], char b[], int iman);
void qvsort(char *s[], int levi, int desni, int iman);
int writelines(char *s[], int brlinija);
int writelinesinverz(char *s[], int brlinija);
main(int argc, char *argv[])
{
int brojlinija, iman=0, imar=0;
char x[]="-n";
char y[]="-r";
char z[]="-nr";
char t[]="-rn";
if (argc > 3)
{
printf("Greska!!! Lose ste uneli argumente komandne linije");
return 0;
}
if (argc == 3)
{
if (((strcmp(argv[1],x)==0)&&(strcmp(argv[2],y)==0))||((strcmp(argv[2],x)==0)&&(strcmp(argv[1],y)==0)))
{
iman = 1;
imar = 1;
}
else
{
printf("Greska!!! Ako zelite da ukljucite argumente otkucajte:\nmysorti -r -n");
return 0;
}
}
if (argc == 2)
{
if ((strcmp(argv[1], z) == 0) || (strcmp(argv[1], t) == 0))
{
iman = 1;
imar = 1;
}
else if (strcmp(argv[1], x) == 0)
iman = 1;
else if (strcmp(argv[1], y) == 0)
imar = 1;
else
{
printf("Greska!!! Ako zelite da ukljucite argumente otkucajte:\nmysorti -rn");
return 0;
}
}
brojlinija = readlines(lineptr, MAX);
qvsort(lineptr, 0, brojlinija-1, iman);
if (imar == 0)
writelines(lineptr, brojlinija);
else
writelinesinverz(lineptr, brojlinija);
return 0;
}
int getline(char a[], int lim)
{
int i;
char c;
for(i=0; ((i<lim-1) && ((c = getchar()) != EOF) && (c != '\n')); i++)
a[i] = c;
if (c == '\n')
a[i++] = c;
a[i] = '\0';
return i;
}
int readlines(char *s[], int max)
{
int i=0, len, brojlinija=0;
char *p;
char line[MAXDUZ];
while (brojlinija < max-1)
if (((len = getline(line, MAXDUZ)) == 0) || ((p = (char *) malloc(len+1)) == NULL))
return brojlinija;
else
{
strcpy(p, line);
s[i++] = p;
brojlinija++;
}
return brojlinija;
}
int uporedi(char a[], char b[], int iman)
{
double a1, b1;
if (iman == 0)
return strcmp(a, b);
else
{
a1 = atof(a);
b1 = atof(b);
if (a1 < b1)
return -1;
else if (a1 > b1)
return 1;
else
return 0;
}
}
void qvsort(char *s[], int levi, int desni, int iman)
{
char *t;
int i, last;
if (levi < desni)
{
last = levi;
for(i=levi+1; i <= desni; i++)
if(uporedi(s[i], s[levi], iman) < 0)
{
last++;
t = s[i];
s[i] = s[last];
s[last] = t;
}
t = s[levi];
s[levi] = s[last];
s[last] = t;
qvsort(s, levi, last-1, iman);
qvsort(s, last+1, desni, iman);
}
}
int writelines(char *s[], int brlinija)
{
int i;
for (i=0; i<brlinija; i++)
printf("%s", s[i]);
}
int writelinesinverz(char *s[], int brlinija)
{
int i;
for (i=brlinija-1; i >= 0; i--)
printf("%s", s[i]);
}

|
|= - =|
|_ - _|