Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Schimbare bec far VW Touran 1T3

Ce parere aveti de viteza/ modul ...

Love Lies Bleeding - 2024

Cum sterg mails din Promotions
 Vanzare cumparare fara transfer b...

Receptie ciudata, in functie de t...

Donez medicamente renale ptr pisica

Ce componenta e asta si ce ziceti...
 Dupa 20 ani de facultate, am uita...

Mobile.de ofera imprumut de bani ...

problema test grila

Digi24 a disparut de pe TV Lg
 Drept de proprietate intelectuala...

Jante noi shitbox

Trinitas TV 4K

Dacia 1316 cu 6 usi ...
 

Problema de programare cu fisiere.

- - - - -
  • Please log in to reply
2 replies to this topic

#1
gidea98

gidea98

    New Member

  • Grup: Junior Members
  • Posts: 3
  • Înscris: 12.11.2017
Vreun programator sau cunoscator in ale programarii. Am si eu o problemuta. Acest program momentan sorteaza intr-un fisier crescator in functie de cantitate,produsele, insa denumirea lor nu reusesc din cauza declararii lui k.As fi profund recunoscator daca m-ati putea ajuta :)
#include <stdio.h>
#include <string.h>
#define DIM 100
typedef struct
{
int cantitate;
float pret;
char denumireprodus[100];
}gestiune;
//gestiune loss[DIM];
int n;
void cit_sir (char* sir)
{
do
{
gets (sir);
} while (strlen (sir)==0);
}
int main (void)
{
FILE *f, *h;
int i=0,temp,j,aux1;
gestiune g[DIM];
char* k;
printf ("Cate produse doriti sa inregistrati? \n");
scanf ("%d", &n);
for (i=0;i<n;i++)
{
printf ("Numele produsului %d:",i+1);
fflush(stdin);
gets (g[i].denumireprodus);
fflush(stdin);
printf ("Pretul %d:",i+1);
scanf ("%f", &g[i].pret);
printf ("Cantitatea %d:",i+1);
scanf ("%d", &g[i].cantitate);

}
f=fopen ("produsetest.txt", "w+");
h=fopen ("produsesortate.txt", "w+");
if (f==NULL)
printf ("Fisierul nu se poate crea!");
else
{ n=i;
for(i=0;i<n-1;i++)
  for(j=i+1;j<n;j++)
  if(g[j].cantitate<g[i].cantitate)
{
			temp=g[i].cantitate;
			aux1=g[i].pret;
			k=g[i].denumireprodus;
   g[i].cantitate=g[j].cantitate;
   g[i].pret=g[j].pret;
	g[i].denumireprodus=g[j].denumireprodus;
   g[j].cantitate=temp;
   g[j].pret=aux1;
			g[j].denumireprodus=k;
}
	 for(i=0;i<n;i++)
//fwrite (&g[0], sizeof(gestiune), 1, f);
fprintf(h,"%s %f %d \n",g[i].denumireprodus,g[i].pret,g[i].cantitate);
fclose (f);
remove("produsetest.txt");
  fclose(h);
  rename("produsetest.txt", "produsesortate.txt");

}
return 0;
}



#2
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,957
  • Înscris: 24.04.2013

View Postgidea98, on 22 mai 2018 - 21:18, said:

typedef struct
{ … char denumireprodus[100]; } …
…
char* k;
… k=g[i].denumireprodus;
… g[i].denumireprodus=g[j].denumireprodus;
… g[j].denumireprodus=k;
k este un pointer, deci el nu face decat sa indice unde sunt stocate niste char-uri fara a stoca si acele caractere. De asemenea in context de expresie un nume de array (denumireprodus in acest caz) se evalueaza ca pointer constant la primul element al sau - deci nu continutul, ci doar adresa unde este stocat acest continut. Prin urmare:
  • nu poti atribui o valoare lui g[ i ].denumireprodus pentru ca este o contanta
  • chiar daca ai putea, ce ai face cu acele atribuiri este doar sa interschimbi niste adrese fara a te atinge si de caracterele stocate la acele adrese - de exemplu in g[13].denumireprodus ramane denumirea citita inital, chiar daca intre timp tu ai modificat in g[13] pretul.
Ca sa o rezolvi ai mai multe alternative:
  • prevezi un buffer temporar si nu doar un pointer, similar cu temp si aux1 care stocheaza valoarea si nu doar adresa ei, pentru a interschimba caracterele din g[ * ].denumireprodus copiind sirurile explicit
  • stii ca std::string (clasa C++), spre deosebire de char [], are un copy-constructor care la atribuirea unor valori de acest tip copiaza continutul?
  • stii ca poti face atribuire de structuri cu totul, caz in care se copiaza continutul ei in intregime?


#3
Mosotti

Mosotti

    Geniu umil

  • Grup: Senior Members
  • Posts: 33,295
  • Înscris: 21.04.2004
Redefineste k de forma:

char k[100];


Apoi folosesti functia strcpy ca sa copiezi continutul intr-o parte in alta:

for(i=0;i<n-1;i++)
  for(j=i+1;j<n;j++)
	if(g[j].cantitate<g[i].cantitate)
	{
	  temp=g[i].cantitate;
	  aux1=g[i].pret;
	  strcpy(k, g[i].denumireprodus);
	  g[i].cantitate=g[j].cantitate;
	  g[i].pret=g[j].pret;
	  strcpy(g[i].denumireprodus, g[j].denumireprodus);
	  g[j].cantitate=temp;
	  g[j].pret=aux1;
	  strcpy(g[j].denumireprodus, k);
	}


Asta daca vrei sa ramii la C, in C++ poti folosi std:string;

In cazul tau mai bine schimbi intre ele elementele vectorului:

gestiune swap;
for(i=0;i<n-1;i++)
  for(j=i+1;j<n;j++)
	if(g[j].cantitate<g[i].cantitate)
	{
	  swap = g[i];
	  g[i]=g[j];
	  g[j] = swap;
	}


De asemenea ar trebui sa incepi sa te obisnuiesti sa dai nume relevante si in engleza variabilor, f, h, k, aux1 nu spun nimic :w00t:

Anunturi

Chirurgia spinală minim invazivă Chirurgia spinală minim invazivă

Chirurgia spinală minim invazivă oferă pacienților oportunitatea unui tratament eficient, permițându-le o recuperare ultra rapidă și nu în ultimul rând minimizând leziunile induse chirurgical.

Echipa noastră utilizează un spectru larg de tehnici minim invazive, din care enumerăm câteva: endoscopia cu variantele ei (transnazală, transtoracică, transmusculară, etc), microscopul operator, abordurile trans tubulare și nu în ultimul rând infiltrațiile la toate nivelurile coloanei vertebrale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate