theparasite Posted December 29, 2015 Report Posted December 29, 2015 Salutari,Am si eu nevoie de ajutor, daca se poate, pentru un proiect de sintaxa in C pentru citirea dintr-un fisier dar random. Eu am 32 de numere in fisierul numit citire, vreau sa pun intr-un vector in mod random numerele din fisier. Ma puteti ajuta cu sintaxa full? Adica declarare, citire si inchidere? Am nevoie in limbaj C, eu in C++ stiu doar citirea, sa folosesc functia RAND nu stiu. Ma puteti ajuta, va rog?Multumesc. Quote
theandruala Posted December 29, 2015 Report Posted December 29, 2015 rand - C++ ReferenceAcolo ai functia de random, cu exemplu.Ca sa bagi intr-un vector random, folosesti ceva de genulint val // valoarea in care citesti cate un nrin v[rand] bagi val, si verifici daca v[rand] este ocupat.Daca e ocupat, mai incerci o data.p.s. mai bine declari v[32] inafara int main-ului, asa iti va fi mai usor sa vezi daca e ocupat. 1 Quote
theparasite Posted December 29, 2015 Author Report Posted December 29, 2015 Multumesc pentru raspuns, dar mi se pare complicat. Adica nu stiu de unde sa incep( iertati-mi lipsa de experienta, sunt incepator). Poti sa ma ajuti cu mai multe detalii?Adica eu vreau de exemplu sa pun intr-un vector 32 de numere ( citite din fisier) in mod random. Dar nu stiu cum sa fac sa imi citeasca random, iar asta cu ocupat ( sa verific daca e ocupat) este cu vector de pozitie?(daca da, nici asta nu stiu). Multumesc. Quote
Active Members MrGrj Posted December 29, 2015 Active Members Report Posted December 29, 2015 Daca ti se pare greu o poti lua pas cu pas:- citesti fisierul si adaugi numerele intr-un array. (gasesti tone de exemple pe google)- randomizezi arrayul respectiv ( vezi aici )- afisezi arrayul final, care va avea elementele intr-o ordine aleatoare.Incearca sa creezi un program dupa structura data si apoi o sa te ajutam daca ai erori. Quote
tjt Posted December 29, 2015 Report Posted December 29, 2015 (edited) Salutari,Am si eu nevoie de ajutor, daca se poate, pentru un proiect de sintaxa in C pentru citirea dintr-un fisier dar random. Eu am 32 de numere in fisierul numit citire, vreau sa pun intr-un vector in mod random numerele din fisier. Ma puteti ajuta cu sintaxa full? Adica declarare, citire si inchidere? Am nevoie in limbaj C, eu in C++ stiu doar citirea, sa folosesc functia RAND nu stiu. Ma puteti ajuta, va rog?Multumesc.Esti la liceu sau la facultate ?Eu nu inteleg ce vrei sa zici prin "citirea dintr-un fisier dar random". Vrei sa citesti toate numerele din fisier intr-un vector si dupa sa le aranjezi random in vector ?Sau doresti sa realizezi citirea propriu-zisa intr-un mod random ?Fisierul din care citesti datele este un fisier text sau binar ? Poate ar fi mai bine sa pui cerinta (daca o ai). Edited December 29, 2015 by tjt Quote
theparasite Posted December 29, 2015 Author Report Posted December 29, 2015 Esti la liceu sau la facultate ?Eu nu inteleg ce vrei sa zici prin "citirea dintr-un fisier dar random". Vrei sa citesti toate numerele din fisier intr-un vector si dupa sa le aranjezi random in vector ?Sau doresti sa realizezi citirea propriu-zisa intr-un mod random ?Fisierul din care citesti datele este un fisier text sau binar ? Poate ar fi mai bine sa pui cerinta (daca o ai).Facultate. Eu am 32 de numere intr-un fisier. Eu initial m-am gandit sa le pun intr-un vector si apoi sa le amestesc, generandu-mi un vector diferit mereu. Este ca amestecarea unui pachet de carti. Cerinta este a mea, adica am un proiect de facut, si am nevoie de aceasta parte pe care nu stiu sa o fac. Am vectorul citit din fisier si vreau sa-l amestesc, sau sa citesc din fisier 32 de numere in mod aleatoriu. Cum pot face asta?Nu ma pricep la diferite functii si imi este dificil sa inteleg solutiile propuse de membrii de mai sus. Am tot cautat solutii, dar nu imi ies. Quote
theandruala Posted December 29, 2015 Report Posted December 29, 2015 (edited) asta este metoda gandita de mine #include <iostream>#include<fstream>#include<stdlib.h>#include<time.h>using namespace std;int vect[32]; //vect este declarat inafara int main-ului.asa vect[0],[1],[2]...[32] va fi egal cu 0.acesst lucru ma ajuta la ***int main(){ srand (time(NULL)); // asta e pentru random int nr; //nr e nr citit din fisier ifstream f("fisier.txt"); ofstream g("fisieriesire.txt"); while (f>>nr) {iar: int c=rand() %32; //c este randomul din vector, atribui lui C o valoarea random cuprinsa intre 0 si 31. if(vect[c]==0) vect[c]=nr; //*** else goto iar; } f.close(); cout<<endl;////de aici se afiseaza sirul construti intr-un fisier. for(int i=0;i<=31;i++) g<<vect[i]<<" "; g.close();return 0;}Pe romaneste, ii cer calculatorului sa-mi dea o valoare random cuprinsa intre 0 si 31.Cand mi-a dat una, atribuiesc lui v[valoare random] primul numar din lista data.ca sa verific daca nu cumva este un numar in avel loc in care vreau sa atribui valoarea random, verific prin == 0.La inceput am initializat tot cu 0, si asa pot sti daca e modificat sau nu.DEZAVANTAJ: daca prin acele numere se afla un zero...o sa ruleze la nesfarsit.Ca sa eviti asta pur si simplu initializezi tot vectorul cu o alta valoare, gen -23451, si modifici if(vect[c]==0) vect[c]=nr; in if(vect[c]==-23451) vect[c]=nr; Edited December 29, 2015 by theandruala Quote
theparasite Posted December 29, 2015 Author Report Posted December 29, 2015 asta este metoda gandita de mine #include <iostream>#include<fstream>#include<stdlib.h>#include<time.h>using namespace std;int vect[32]; //vect este declarat inafara int main-ului.asa vect[0],[1],[2]...[32] va fi egal cu 0.acesst lucru ma ajuta la ***int main(){ srand (time(NULL)); // asta e pentru random int nr; //nr e nr citit din fisier ifstream f("fisier.txt"); ofstream g("fisieriesire.txt"); while (f>>nr) {iar: int c=rand() %32; //c este randomul din vector, atribui lui C o valoarea random cuprinsa intre 0 si 31. if(vect[c]==0) vect[c]=nr; //*** else goto iar; } f.close(); cout<<endl;////de aici se afiseaza sirul construti intr-un fisier. for(int i=0;i<=31;i++) g<<vect[i]<<" "; g.close();return 0;}Pe romaneste, ii cer calculatorului sa-mi dea o valoare random cuprinsa intre 0 si 31.Cand mi-a dat una, atribuiesc lui v[valoare random] primul numar din lista data.ca sa verific daca nu cumva este un numar in avel loc in care vreau sa atribui valoarea random, verific prin == 0.La inceput am initializat tot cu 0, si asa pot sti daca e modificat sau nu.DEZAVANTAJ: daca prin acele numere se afla un zero...o sa ruleze la nesfarsit.Ca sa eviti asta pur si simplu initializezi tot vectorul cu o alta valoare, gen -23451, si modifici if(vect[c]==0) vect[c]=nr; in if(vect[c]==-23451) vect[c]=nr;Multumesc.In fisier am asa:7 7 7 7 8 8 8 8 9 9 9 9 10 10 10 10 11 11 11 11 12 12 12 12 13 13 13 13 14 14 14 14 14 FILE *stream; /*declarare stream (flux de date)*/ stream = fopen("citire.txt", "r"); /*deschidere fisier*/ if(stream == NULL) { printf ("Eroare la impartirea cartilor"); }srand (time(NULL)); int nr; //nr e nr citit din fisier while (fscanf(stream, "%d", &nr)) { iar: int c=rand() %32; //c este randomul din vector if(pachet[c]==0) pachet[c]=nr; //*** else goto iar; } fclose(stream);In C, si la compilare imi da o eroare :error: 'iar' undeclared (first use in this function)|error: label 'iar' used but not defined| Quote
theandruala Posted December 29, 2015 Report Posted December 29, 2015 in C++ imi ruleaza, aici e un exemplu in C, si vad ca tot la fel e...goto statement in C Quote
theparasite Posted December 29, 2015 Author Report Posted December 29, 2015 in C++ imi ruleaza, aici e un exemplu in C, si vad ca tot la fel e...goto statement in CEu chestia asta o fac într un subprogram, apelat din main. Trebuie neap?rat sa fie in int main treaba asta? Quote
theandruala Posted December 29, 2015 Report Posted December 29, 2015 Daca folosesti si iar: si goto iar; in acelasi subprogram cred ca ar trebui sa mearga...dar cred ca poti folosi si asa, dar e mult mai retardat.Ceva de genulwhile(sem==1){sem =1cod etc etc for(int j=0;j<=31;j++){if vect[j]==0 sem=0;}}Asta ca sa nu mai folosesti goto-ul.In while verifica de fiecare data la sfarsit daca valorile vectorului sunt diferite de 0, daca una nu e diferita, sem devine 0, si while-ul continua. Quote
theparasite Posted December 29, 2015 Author Report Posted December 29, 2015 (edited) Am modificat asa si a mers, sunt uimit:int i=0; FILE *stream; /*declarare stream (flux de date)*/ stream = fopen("citire.txt", "r"); /*deschidere fisier*/ if(stream == NULL) { printf ("Eroare la impartirea cartilor"); }srand (time(NULL)); int nr; //nr e nr citit din fisier while (!feof(stream)) { fscanf(stream,"%d", &nr); int c; iar: c=rand() %32; //c este randomul din vector if(pachet[c]==0) pachet[c]=nr; //*** else goto iar; } fclose(stream); for(i=0;i<=31;i++) printf("%d ", pachet[i]);Va multumesc mult pentru ajutor. Multa sanatate si fericire va doresc! Edited December 29, 2015 by theparasite Quote
S.L.C Posted December 30, 2015 Report Posted December 30, 2015 (edited) Varianta C:#include <time.h> // time#include <stdio.h> // sscanf#include <stdlib.h> // rand#include <string.h> // strlenvoid Extract(int * vec, int size, const char * str){ const char * data = str; int value = 0, offset = 0, pos = 0; while (sscanf(data, " %d%n ", &value, &offset) == 1) { vec[pos] = value; // Save the value data += offset; // Skip the read value // Are we in range? if (++pos >= size) break; // End of array/vector }}int main(int argc, char **argv){ char * buffer = 0; // File contents long length; // File length // Open the file FILE * file = fopen ("file.txt", "r"); // Could the file be opened? if (file) { // Go to the end of the file fseek(file, 0, SEEK_END); // Calculate buffer size from beginning to current position length = ftell(file); // Go back to the beginning fseek(file, 0, SEEK_SET); // Allocated a proper buffer buffer = (char *)malloc(length); // Could the buffer be allocated? if (buffer) { // Read the file contents into out buffer fread (buffer, 1, length, file); } // Close the file handle fclose(file); } // Do we have a buffer? if (!buffer || strlen(buffer) <= 0) { puts("No data to process"); return EXIT_FAILURE; } #define ELEM_COUNT 32 // Numbers array int int_vec[ELEM_COUNT] = {0}; // Extract the numbers from the string Extract(int_vec, ELEM_COUNT, buffer); // We no longer need the file contents free(buffer); // Feed the random generator srand(time(0)); // Shuffle elements for (int i = 0, b, r; i < ELEM_COUNT; i++) { // Obtain a random element r = rand() % ELEM_COUNT; // Backup the current element b = int_vec[i]; // Swap with the random element int_vec[i] = int_vec[r]; int_vec[r] = b; } // Output array/vector contents for (unsigned i = 0; i < ELEM_COUNT; i++) printf(" %d ", int_vec[i]); return EXIT_SUCCESS;}Varianta C++#include <ctime> // std::time#include <cstdio> // std::sscanf#include <vector> // std::vector#include <string> // std::string#include <random> //std::mt19937#include <fstream> // std::ifstream#include <iostream> // std::cout, std::endl#include <algorithm> // std::shuffle#include <streambuf> // std::istreambuf_iteratorvoid Extract(std::vector< int > & vec, const std::string & str){ std::string::const_pointer data = str.c_str(); int value = 0, offset = 0; while (std::sscanf(data, " %d%n ", &value, &offset) == 1) { vec.push_back(value); data += offset; }}int main(int argc, char **argv){ // Open the file std::ifstream file("file.txt", std::ifstream::in); // Read file contents to a string std::string text((std::istreambuf_iterator< char >(file)), std::istreambuf_iterator< char >()); // Prepare an empty vector std::vector< int > int_vec; // Extract the elements from the string Extract(int_vec, text); // Create a random number generator std::mt19937 rg(std::time(nullptr)); // Shuffle the vector elements std::shuffle(int_vec.begin(), int_vec.end(), rg); // Output vector contents for (const auto & n : int_vec) { std::cout << n << " "; } return EXIT_SUCCESS;}ATENTIE: Varianta C++ necesita un compiler cu suport pentru C++11! Ambele versiuni au fost testate pe MinGW-w64 GCC 5.2.0 x32 Edited December 30, 2015 by S.L.C Quote