Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Laptop cu HDD atasare memorie MMC...

Hartile google nu mai au chenarul...

Tomate in ghiveci la curte?

Idei cale de actiune recuperare g...
 Intoleranța lactoza- vegan v...

Tobe acustice insonorizare in blo...

Cine canta? Fragment din melodie...

Tablou sigurante Dacia Sandero 2012
 Baby Reindeer - 2024

Hotii voteaza hoti?!

Camera video masina

Zilele emailului din gospodaria n...
 Best gaming laptop?

Humane (2024)

Recomandare casti 100-150 lei

Schimbare bec far VW Touran 1T3
 

Problema la afisarea unui nume dupa cautare

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

#1
lupulalbastru1

lupulalbastru1

    Junior Member

  • Grup: Members
  • Posts: 110
  • Înscris: 24.05.2013
Buna!
Am un articol si am facut o cautare dupa nume dar nu reusesc sa afisez datele corespunzatoare cautarii facute. Ma poate ajuta cineva, va rog?

//#include <stdio.h>
#include <conio.h>
#include <string.h>
typedef enum{hotel,pensiune}tip_cazare;
typedef enum{stele_2,stele_3,stele_4}tip_hotel;
typedef union{
		   int loc_libere;
	 tip_hotel nr_stele;
			 }info_cazare;
typedef struct{
			char nume[20];
	  int capacitate;
	  char nume_statiune[20];
	  tip_cazare t_cazare;
	  info_cazare info;
			  }cazare;
cazare c[30];
int i,n=0;


void citire()
{
FILE *f;
if((f=fopen("hotel.txt","rt"))==NULL)
	{  printf("Fisierul nu a fost gasit!");
	
  return ;
}
while(!feof (f))
{
  fscanf(f,"%s%d%s%d",c[n].nume,&c[n].capacitate,c[n].nume_statiune,&c[n].t_cazare);
  switch(c[n].t_cazare)
  {
   case 0: fscanf(f,"%d",&c[n].info.nr_stele);
	break;
   case 1: fscanf(f,"%d",&c[n].info.loc_libere);
	break;
  }
n++;
}

fclose(f);
printf("\nS-a efectuat citirea\n");
}


void afisare()
{
for(i=0;i<n;i++)
  {
  printf("\n%s\t%d\t%s\t%d",c[i].nume,c[i].capacitate,c[i].nume_statiune,c[i].t_cazare);
  switch(c[n].t_cazare)
  {
   case 0: printf("\t%d",c[i].info.nr_stele);
	break;
   case 1: printf("\t%d",c[i].info.loc_libere);
	break;
  }
}
}


int cautare_liniara(char nume_hotel[])
{
int i=0;
while((strcmp(c[i].nume,nume_hotel)!=0) && i<=n)
	i=i+1;
return i;
}

int main()
{
int opt=0;
char nume_hotel[20];
do{
   printf("\n1.Citire");
   printf("\n2.Afisare");
   printf("\n3.Cautare liniara");
  
   printf("\n0.Iesire");
   printf("\nIntroduceti optiunea: ");
   scanf("%d",&opt);
   switch(opt)
   {
   
   case 1: citire();
	 break;
   case 2: afisare();
	 break;
   case 3: printf("Dati numele dorit: ");
				scanf("%s",nume_hotel);
			   printf("\n%s\t%d\t%s\t%d",c[i].nume,c[i].capacitate,c[i].nume_statiune,c[i].t_cazare);
				cautare_liniara(nume_hotel);
				break;
 
   case 0: break;
   }
}while(opt!=0);
getch();
return 0;
}


Edited by lupulalbastru1, 22 October 2014 - 16:12.


#2
yonut_a

yonut_a

    Trala la la la

  • Grup: Senior Members
  • Posts: 3,947
  • Înscris: 03.08.2008
zi si ce ai in fisierul ala

#3
lupulalbastru1

lupulalbastru1

    Junior Member

  • Grup: Members
  • Posts: 110
  • Înscris: 24.05.2013
Fisier hotel.txt

nume		 capacitate		  nume_statiune			   t_cazare	  nr_stele sau loc_libere
Albatros	 50			   Mamaia		 0				  0
Vraja_marii	 10			  Mamaia		 1				8


Edited by lupulalbastru1, 22 October 2014 - 16:25.


#4
yonut_a

yonut_a

    Trala la la la

  • Grup: Senior Members
  • Posts: 3,947
  • Înscris: 03.08.2008
pai ia vezi ce faci cu i ul ala din cautare_liniara.

Ori il folosesti global, ori local ?

Si nu ti se pare normal mai intai sa apelezi functia de cautare si pe urma sa faci afisarea ?

Sfat renunta la variabilele alea globale. Aici ai folosit doar 2-3 si deja ti au facut probleme

#5
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,239
  • Înscris: 24.02.2007
De ce ai folosit union acolo?

#6
lupulalbastru1

lupulalbastru1

    Junior Member

  • Grup: Members
  • Posts: 110
  • Înscris: 24.05.2013
Am renuntat la i declarat global.
Dar imi intra in bucla infinita si asa
printf("Dati numele dorit: ");
				scanf("%s",nume_hotel);
	printf("\n%s\t%d\t%s\t%d",c[i].nume,c[i].capacitate,c[i].nume_statiune,c[i].t_cazare);
				cautare_liniara(nume_hotel);
si asa
printf("Dati numele dorit: ");
				scanf("%s",nume_hotel);
				cautare_liniara(nume_hotel);
			   printf("\n%s\t%d\t%s\t%d",c[i].nume,c[i].capacitate,c[i].nume_statiune,c[i].t_cazare);


#7
yonut_a

yonut_a

    Trala la la la

  • Grup: Senior Members
  • Posts: 3,947
  • Înscris: 03.08.2008
pai daca ai renuntat la el global atunci ce valoare mai ia i ul de aici ?

printf("\n%s\t%d\t%s\t%d",c[i].nume,c[i].capacitate,c[i].nume_statiune,c[i].t_cazare);

si de ce functia cautare_liniara returneaza ceva daca nu e folosit nicaieri ?

#8
lupulalbastru1

lupulalbastru1

    Junior Member

  • Grup: Members
  • Posts: 110
  • Înscris: 24.05.2013

 dani.user, on 22 octombrie 2014 - 16:37, said:

De ce ai folosit union acolo?
Pentru ca asa zice in enunt. Problema are mai multe cerinte (mai trebuie facute niste sortari), dar alea imi merg.

#9
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,239
  • Înscris: 24.02.2007
Scrie in enunt ca numarul de locuri libere si numarul de stele sa fie stocate in acelasi loc in memorie? N-as prea crede...

Edited by dani.user, 22 October 2014 - 16:43.


#10
lupulalbastru1

lupulalbastru1

    Junior Member

  • Grup: Members
  • Posts: 110
  • Înscris: 24.05.2013

 dani.user, on 22 octombrie 2014 - 16:43, said:

Scrie in enunt ca numarul de locuri libere si numarul de stele sa fie stocate in acelasi loc in memorie? N-as prea crede...
Fie TDA-urile:
	tip_cazare enumerare, cu elementele:  hotel, pensiune
	tip_hotel  enumerare, cu elementele: stele_2, stele_3, stele_4
	info_cazare uniune, cu campurile:
		loc_libere (de tip int ), daca este vorba de o pensiune
		nr_stele (de tip tip_hotel), daca este vorba de un hotel
	cazare articol (cu variante) cu campurile:
		nume (de tip sir de caractere)
		capacitate(int)
		nume_statiune(de tip sir de caractere)
		t_cazare(de tip tip_cazare)
		info(de tip info_cazare)
Sa se scrie un program in limbajul C care sa implementeze TDA-urile de mai sus, si,
folosind un tablou de tip cazare sa gestioneze informatiile din fiserul "hotel.txt".
Programul va fi interactiv (cu meniu), realizand urmatoarele operatii:
a) incarcarea datelor din fisierul ”hotel.txt” in tabloul de articole;
B) afisarea tuturor datelor din tabloul de articole ;
c) Cautarea unui hotel dupa nume (numele cautat se citeste de la tastatura) folosind:
	-tehnica cautarii liniare,
	-tehnica fanionului
d) sortarea tabloului in ordine alfabetica dupa nume.
e)Cautarea unui hotel dupa nume (numele cautat se citeste de la tastatura) folosind:
	-tehnica cautarii binare,
	-tehnica cautarii binar performante.

Fisier hotel.txt
nume		  capacitate	nume_statiune	t_cazare	nr_stele
								sau loc_libere
Albatros		50		 Mamaia		 0		 0
Vraja_marii	 10		 Mamaia		 1		 8

 yonut_a, on 22 octombrie 2014 - 16:40, said:

pai daca ai renuntat la el global atunci ce valoare mai ia i ul de aici ?

printf("\n%s\t%d\t%s\t%d",c[i].nume,c[i].capacitate,c[i].nume_statiune,c[i].t_cazare);

si de ce functia cautare_liniara returneaza ceva daca nu e folosit nicaieri ?
Deci functia cautare_liniara returneaza pozitia hotelului cautat. Dar cum fac sa afisez si datele referotoare la acel hotel?

#11
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,239
  • Înscris: 24.02.2007
Pointerii ii stii/intelegi?

#12
yonut_a

yonut_a

    Trala la la la

  • Grup: Senior Members
  • Posts: 3,947
  • Înscris: 03.08.2008
pai returneaza pozitia, da o returneaza degeaba daca tu nu o folosesti mai departe

#13
lupulalbastru1

lupulalbastru1

    Junior Member

  • Grup: Members
  • Posts: 110
  • Înscris: 24.05.2013

 dani.user, on 22 octombrie 2014 - 17:00, said:

Pointerii ii stii/intelegi?
Ii stiu cat de cat.

 yonut_a, on 22 octombrie 2014 - 17:01, said:

pai returneaza pozitia, da o returneaza degeaba daca tu nu o folosesti mai departe
am facut asa:
printf("Dati numele hotelului: ");
	   scanf("%s", nume_hotel);
	i=cautare_liniara(nume_hotel);
	if(i==n+1)
	 printf("Nu s-a gasit hotelul \n");
	else
	 printf("S-a gasit hotelul pe pozitia: %d \n",i);
Dar eu vreau sa fac sa-mi afiseze si date despre hotelul respectiv.

#14
yonut_a

yonut_a

    Trala la la la

  • Grup: Senior Members
  • Posts: 3,947
  • Înscris: 03.08.2008
pune tot codul modificat

#15
lupulalbastru1

lupulalbastru1

    Junior Member

  • Grup: Members
  • Posts: 110
  • Înscris: 24.05.2013
#include <stdio.h>
#include <conio.h>
#include <string.h>
typedef enum{hotel,pensiune}tip_cazare;
typedef enum{stele_2,stele_3,stele_4}tip_hotel;
typedef union{
		   int loc_libere;
	 tip_hotel nr_stele;
			 }info_cazare;
typedef struct{
			char nume[20];
	  int capacitate;
	  char nume_statiune[20];
	  tip_cazare t_cazare;
	  info_cazare info;
			  }cazare;
cazare c[30];
int n=0;
void citire()
{
FILE *f;
if((f=fopen("hotel.txt","rt"))==NULL)
	{  printf("Fisierul nu a fost gasit!");
  return ;
}
while(!feof (f))
{
  fscanf(f,"%s%d%s%d",c[n].nume,&c[n].capacitate,c[n].nume_statiune,&c[n].t_cazare);
  switch(c[n].t_cazare)
  {
   case 0: fscanf(f,"%d",&c[n].info.nr_stele);
	break;
   case 1: fscanf(f,"%d",&c[n].info.loc_libere);
	break;
  }
n++;
}

fclose(f);
printf("\nS-a efectuat citirea\n");
}
void afisare()
{int i;
for(i=0;i<n;i++)
  {
  printf("\n%s\t%d\t%s\t%d",c[i].nume,c[i].capacitate,c[i].nume_statiune,c[i].t_cazare);
  switch(c[n].t_cazare)
  {
   case 0: printf("\t%d",c[i].info.nr_stele);
	break;
   case 1: printf("\t%d",c[i].info.loc_libere);
	break;
  }
}
}
int cautare_liniara(char nume_hotel[])
{
int i=0;
while((strcmp(c[i].nume,nume_hotel)!=0) && i<=n)
	i=i+1;
return i;
}
int main()
{
int i=0,opt=0;
char nume_hotel[20];
do{
   printf("\n1.Citire");
   printf("\n2.Afisare");
   printf("\n3.Cautare liniara");
   printf("\n0.Iesire");
   printf("\nIntroduceti optiunea: ");
   scanf("%d",&opt);
   switch(opt)
   {
   
   case 1: citire();
	 break;
   case 2: afisare();
	 break;
   case 3: printf("Dati numele hotelului: ");
		scanf("%s", nume_hotel);
		i=cautare_liniara(nume_hotel);
		if(i==n+1)
	  printf("Nu s-a gasit hotelul \n");
	 else
		 printf("S-a gasit hotelul pe pozitia: %d \n",i);
	 break;
  
   case 0: break;
   }
}while(opt!=0);
getch();
return 0;
}


#16
yonut_a

yonut_a

    Trala la la la

  • Grup: Senior Members
  • Posts: 3,947
  • Înscris: 03.08.2008
daca pui afisare la loc

printf("\n%s\t%d\t%s\t%d",c[i].nume,c[i].capacitate,c[i].nume_statiune,c[i].t_cazare);

merge

#17
lupulalbastru1

lupulalbastru1

    Junior Member

  • Grup: Members
  • Posts: 110
  • Înscris: 24.05.2013

 yonut_a, on 22 octombrie 2014 - 17:23, said:

daca pui afisare la loc

printf("\n%s\t%d\t%s\t%d",c[i].nume,c[i].capacitate,c[i].nume_statiune,c[i].t_cazare);

merge
Multumesc mult!

#18
xyv123

xyv123

    Member

  • Grup: Members
  • Posts: 439
  • Înscris: 01.03.2012
1. Scrie teste. De exemplu, tie nici macar citirea datelor din fisier nu-ti functioneaza corect, dar normal ca n-ai testat asta.
2. Invata sa faci debugging.

Anunturi

Bun venit pe Forumul Softpedia!

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