Concurs: Broke This (6)’

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().

15 Responses to Concurs: Broke This (6)’

  1. 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….

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

  3. 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

  4. GuessGen

    Hai ca am facut o timpenie de program :D :D :D
    Da nu mai am chef sa-l modific :D

    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 :D


    #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 :D

    • GuessGen

      am uitat sa pun verificare daca sunt argumente din linia de comanda. Nu-i pe asta :D

  5. superman

    uite o varianta mai usoara :D adica mai scurta :)

    **Edit

  6. Eu paremise n-am intseles bine insarcinarea :D credeam ca trebue sortate liniile nu caracterele pe fiecare linie…

    • superman

      eu tot asa am inteles :D si asa si face programul meu de mai sus… dar cu sortarea literilor de pe fiecare rind e inca mai usor :)

  7. superman

    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(‘ ‘, ”)”

  8. @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 :D ) – http://pastebin.com/PZL4hbzg

  9. GuessGen

    Uite ca mam mai invirtit un pic, din rusine ca am dat-o in bara cu totul :D 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.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>