Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Din ce este facuta terasa asta?

Cum accesez site-ul CNAS ?

Algoritm simplu de calculare al u...

Bitdefender Total Security ș...
 casa verde 2024

Intrerupator cu N - doza doar cu ...

Incalzire casa fara gaz/lemne

Incalzire in pardoseala etapizata
 Suprataxa card energie?!

Cum era nivelul de trai cam din a...

probleme cu ochelarii

Impozite pe proprietati de anul v...
 teava rezistenta panou apa calda

Acces in Curte din Drum National

Sub mobila de bucatarie si sub fr...

Rezultat RMN
 

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,848
  • Î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

Second Opinion Second Opinion

Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale.

Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit.

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