Pentru cei care doresc o problema suplimentara, pentru ca problema de azi nu e foarte grea.
Propun urmatoarea problema.
Sa se elaboreze un program care primeste 2 parametri din linia de comanda, fisier pentru intrare si fisier pentru iesire.
Programul trebuie sa sorteze alfabetic randurile care le contine fisierul de intrare si sa scrie rezultatul in fisierul de iesire.
Model de fisier care poate fi ca input:
|
1 2 3 4 |
prima linie
a doua linie
a treia linia
si tot asa |
Nota: Daca folositi C se poate sa folositi functia standart qsort().

pentru a putea citi parametrii trimisi din linia de comanda trebuie sa folosim prototipul:
int main(int argc, char* argv[])
pentru Windows daca argc = 2 avem 1 argument, pentru linux daca argc = 2 avem 2 argumente.
in *argv[] se pastreaza parametrii, *argv – primul argument, *(argv+1) – al doilea….
Functia qsort() are nevoie de un parametru care se numeste comparator.
Comparatorul pentru qsort() trebuie sa returneze 0 daca datele trimise ca parametru sunt egale, -1 daca primul parametru e mai mic ca al doilea, si 1 daca al primul e mai mare ca al doilea.
Comparatorul trebuie sa aiba 2 parametri de tip void.
un exemplu de comparator:
int compareC(const void *a, const void *b)
{
const char *a1 = (const char*)a;
const char *a2 = (const char*)b;
return strcmp(a1,a2);
}
Am folosit masiv de pointeri… nimic mai ingenios nu mi-a venit in cap…
Am incercat cit de cit sa economisesc memoria la extragerea liniilor din fishier…
http://img560.imageshack.us/img560/1329/fdvd.png
Hai ca am facut o timpenie de program

Da nu mai am chef sa-l modific
Nush dac am inteles bine conditia, dar astfel am inteleso:
Se ia prima linie, se sorteaza in ordine alfabetica, se scrie in fileul de iesire si tot asa cu fiece linie
Daca e asa, inseamna ca aproape ca e corect, doar ca ” ” spatiul e mai mic ca orice litera in ASCII sh il pune in fata literelor, sh imi era lene sa mai schimb shi asta
#include
#include
void sort(char *x){
char aux;
for(int i = strlen(x)-1; i > 0; --i)
for(int j = 0; j x[j+1]){
aux = x[j];
x[j] = x[j+1];
x[j+1] = aux;
}
}
}
main(int argv, char* argc[]){
std::ifstream fin(argc[1]);
std::ofstream fout(argc[2]);
std::string x;
while(getline(fin, x) && x!=""){
sort(&x[0]);
fout << x << "\n";
}
}
basically programu face ceea ce trebu, daca am inteles eu cum trebu. In fine
am uitat sa pun verificare daca sunt argumente din linia de comanda. Nu-i pe asta
uite o varianta mai usoara
adica mai scurta
**Edit
Eu paremise n-am intseles bine insarcinarea
credeam ca trebue sortate liniile nu caracterele pe fiecare linie…
eu tot asa am inteles
si asa si face programul meu de mai sus… dar cu sortarea literilor de pe fiecare rind e inca mai usor
cu sortarea literelor intr-adevar e mai ushor… De program Sorry dar nu shtiu python, nu prea am intseles ce se intimpla aici:
rsp=”.join(rsp)
din array introduc totul in ‘string’
iaca versiunea noua… cu sortarea textului din linii… eu am eliminat ” ” deoarece nu are rost sa mai sortez spatiul ca o sa fie primul…
#!/usr/bin/python
import sys
f=open(sys.argv[1], ‘r’)
txt=f.readlines()
f.close()
f=open(sys.argv[2], ‘w’)
rsp=[]
for i in txt:
rsp+=”.join(sorted(i.replace(‘\n’, ”).replace(‘ ‘, ”))) + ‘\n’
rsp=”.join(rsp)
f.write(rsp)
f.close()
pentru a lasa spatiul e destul de sters “.replace(‘ ‘, ”)”
hmm, nu inteleg ce faci cu join acolo
@Superman si @Kemonosake, ati inteles corect. trebuiau sortate liniile.
@Gueesgen ai inteles gresit, probabil eu nu m-am exprimat corect.
iata si rezolvarea mea (imi pare ca mergea
) – http://pastebin.com/PZL4hbzg
Uite ca mam mai invirtit un pic, din rusine ca am dat-o in bara cu totul
Si cred ca am gasit o solutie bunicica.
Parca se aranjeaza rindurile deja.
#!/bin/bash
if [ ! $2 ]
then
echo "Nu sunt suficienti parametri"
else
sort $1 > $2
fi
Ma bucur ca cunoasteti mai mult ca mine si trebuie sa mai invatz cite ceva ca sa pot concura cu voi.
Oricum, cred ca de data asta am venit cu o solutie nice, voi ce ziceti?
mie in general imi plac solutiile oferite de tine. Bash nu pre cunosc, asa pe apucate cateva chestii am facut. Posibil e buna. Aici nu rezolvam pentru cineva problemele, rezolvam fiecare pentru noi.