|- - -|
|

Napisati program mysorti 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 -f , onda izvršiti sortiranje ignorišući razliku među malim i velikim slovom. 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 -f -r . 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 imaf);
void qvsort(char *s[], int levi, int desni, int imaf);
int writelines(char *s[], int brlinija);
int writelinesinverz(char *s[], int brlinija);
main(int argc, char *argv[])
{
int brojlinija, imaf=0, imar=0;
char x[]="-f";
char y[]="-r";
char z[]="-fr";
char t[]="-rf";
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)))
{
imaf = 1;
imar = 1;
}
else
{
printf("Greska!!! Ako zelite da ukljucite argumente otkucajte:\nmysorti -r -f");
return 0;
}
}
if (argc == 2)
{
if ((strcmp(argv[1], z) == 0) || (strcmp(argv[1], t) == 0))
{
imaf = 1;
imar = 1;
}
else if (strcmp(argv[1], x) == 0)
imaf = 1;
else if (strcmp(argv[1], y) == 0)
imar = 1;
else
{
printf("Greska!!! Ako zelite da ukljucite argumente otkucajte:\nmysorti -rf");
return 0;
}
}
brojlinija = readlines(lineptr, MAX);
qvsort(lineptr, 0, brojlinija-1, imaf);
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 imaf)
{
char c[MAXDUZ], d[MAXDUZ];
int i;
if (imaf == 0)
return strcmp(a, b);
else
{
for (i=0; a[i]; i++)
if (islower(a[i]))
c[i] = a[i]-32;
else
c[i] = a[i];
for (i=0; b[i]; i++)
if (islower(b[i]))
d[i] = b[i]-32;
else
d[i] = b[i];
return strcmp(c, d);
}
}
void qvsort(char *s[], int levi, int desni, int imaf)
{
char *t;
int i, last;
if (levi < desni)
{
last = levi;
for(i=levi+1; i <= desni; i++)
if(uporedi(s[i], s[levi], imaf) < 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, imaf);
qvsort(s, last+1, desni, imaf);
}
}
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]);
}

Primer:

C:\...>mysorti -r -f
aaa
AAaa
Aa
aRArat
Ararat
asTeROId
asTeRiks
Racunarstvo
racunari
informatika
^Z
Racunarstvo
racunari
informatika
asTeROId
asTeRiks
aRArat
Ararat
AAaa
aaa
Aa


|
|= - =|
|_ - _|