Porovnávanie reťazcov – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Porovnávanie reťazcov – C / C++ – Fórum – Programujte.comPorovnávanie reťazcov – C / C++ – Fórum – Programujte.com

 

Kent0
Stálý člen
30. 1. 2013   #1
-
0
-

Dobrý deň :)

mám dva textové súbory(zoznam.TXT, známky.TXT)
sú písané formou
zoznam:
meno číslo -> Martin 1
                     Dávid 2
známky: 
číslo známky -> 1 123
                         2 445

mám za úlohu napísať program, ktorý keď spustím, tak ma popýta, aby som zadal meno. Keď zadám meno, tak má vypísať priemer známok. Ak sa meno v zozname nenachádza, tak vypíše, že tam nie je.

ale neviem, či mám dobre podmienku pre porovnávanie reťazcov

 

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  FILE *fr1,*fr2;
  
  char a[20],menofr1[20],cislofr1[20],znamky[10],cislofr2[20];
  
  fr1=fopen("zoznam.TXT","r");
  fr2=fopen("znamky.TXT","r");
  
  printf("Zadaj meno: ");
  scanf("%s",a);
   
  
  while(feof(fr1)==0)
  {
                    fscanf(fr1,"%s %s",menofr1,cislofr1);
                    fscanf(fr2,"%s %s",cislofr2,znamky);
                    
                  //  printf("%s ",menofr1);
                   // printf("%s ",cislofr1);                    
                   //  printf("%s ",cislofr2);
                  //  printf("%s ",znamky);
                    
                   
                    printf("\n");
                    }
                    
                    if(strcmp(a,menofr1)==0)
                    {
                                         if(strcmp(cislofr1,cislofr2)==0)
                                         {
                                                                         printf("%s",znamky);
                                                                         }
                                                                         }
                                                                         else
                                                                         printf("Nie je v zozname");
                   
                    
                    
    
  system("PAUSE");	
  return 0;
}

ja by som len poprosil, aby ste mi poradili s tým porovnávaním reťazcov, priemer známok si už spravím aj sám :)

Ďakujem :)


Nahlásit jako SPAM
IP: 145.255.157.–
Kent0
Stálý člen
30. 1. 2013   #2
-
0
-

už som sa trošku pohol dopredu a upravil som ten program

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  FILE *fr1,*fr2;
  
  char a[20],b[20],menofr1[20],cislofr1[20],znamky[10],cislofr2[20];
  
  int i=1,l,sucet=0,n;

  
  fr1=fopen("zoznam.TXT","r");
  fr2=fopen("znamky.TXT","r");
  
  printf("Zadaj meno: ");
  scanf("%s",a);
   
  
  while(feof(fr1)==0)
  {
       while(feof(fr2)==0)   
       {           
                    fscanf(fr1,"%s %s",menofr1,cislofr1);
                    
                    if(strcmp(a,menofr1)==0)
                    printf("Meno %s je v zozname",menofr1);
                    else
                                       
                    fscanf(fr2,"%s %s",cislofr2,znamky);
                    if(strcmp(a,menofr1)==0)
                    {
                                            if(strcmp(cislofr1,cislofr2)==0)
                                             {
                                                                            printf("%s ",menofr1);
                                                                            printf("%s",znamky);
                                             }  
                    }
       }          
                    printf("\n");
  }
  
         
                    
    
  system("PAUSE");	
  return 0;
}

ale neviem, ako mám spraviť podmienku aby keď zadám zlé meno tak mi vypísalo, že sa v zozname nenachádza .. skúšal som to dať za while ale tam mi to nefungovalo 

Nahlásit jako SPAM
IP: 145.255.157.–
Kent0
Stálý člen
30. 1. 2013   #3
-
0
-

tu to už mám aj s priemerom známok

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  FILE *fr1,*fr2;
  
  char a[20],b[20],menofr1[20],cislofr1[20],znamky[10],cislofr2[20];
  
  int i,l,sucet=0,n;

  
  fr1=fopen("zoznam.TXT","r");
  fr2=fopen("znamky.TXT","r");
  
  printf("Zadaj meno: ");
  scanf("%s",a);
   
  
  while(feof(fr1)==0)
  {
       while(feof(fr2)==0)   
       {           
                    fscanf(fr1,"%s %s",menofr1,cislofr1);
                    
                    if(strcmp(a,menofr1)==0)
                    printf("Meno %s je v zozname\n",menofr1);
                               
                    fscanf(fr2,"%s %s",cislofr2,znamky);
                    if(strcmp(a,menofr1)==0)
                    {
                                            if(strcmp(cislofr1,cislofr2)==0)
                                            {
                                                    printf("%s ma znamky %s",menofr1,znamky);
                                                    l=strlen(znamky);
                                                    for(i=1;i<=l;i++)
                                                    {
                                                                     strncpy(b,znamky+(i-1),1);
                                                                     n=atoi(b);
                                                                     sucet=sucet+n;
                                                    }
                                                    printf("\n");
                                                    printf("Priemer %s znamok je %d",menofr1,sucet/l);
                                            }  
                    }
       }          
                    printf("\n");
  }
  
  
 

tak ja by som vás poprosil len aby ste mi poradili s ošetrením toho, aby keď zadám zlé meno mi program vypísal že sa tam nenachádza a skončil :)

Nahlásit jako SPAM
IP: 145.255.157.–
Kent0
Stálý člen
30. 1. 2013   #4
-
0
-

tak už som si spravil aj to :D
 

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  FILE *fr1,*fr2;
  
  char a[20],b[20],menofr1[20],cislofr1[20],znamky[10],cislofr2[20];
  
  int i,l,sucet=0,n;

  
  fr1=fopen("zoznam.TXT","r");
  fr2=fopen("znamky.TXT","r");
  
  printf("Zadaj meno: ");
  scanf("%s",a);
   
  
  while(feof(fr1)==0)
  {
       while(feof(fr2)==0)   
       {           
                    fscanf(fr1,"%s %s",menofr1,cislofr1);
                    
                    if(strcmp(a,menofr1)==0)
                    printf("Meno %s je v zozname\n",menofr1);
                    if(strcmp(a,menofr1)!=0)
                    printf("Meno %s nie je v zozname\n",a);
                    system("pause");
                    return 0;
                               
                    fscanf(fr2,"%s %s",cislofr2,znamky);
                    if(strcmp(a,menofr1)==0)
                    {
                                            if(strcmp(cislofr1,cislofr2)==0)
                                            {
                                                    printf("%s ma znamky %s",menofr1,znamky);
                                                    l=strlen(znamky);
                                                    for(i=1;i<=l;i++)
                                                    {
                                                                     strncpy(b,znamky+(i-1),1);
                                                                     n=atoi(b);
                                                                     sucet=sucet+n;
                                                    }
                                                    printf("\n");
                                                    printf("Priemer %s znamok je %d",menofr1,sucet/l);
                                            }  
                    }
       }          
                    printf("\n");
  }  
                   
    
  system("PAUSE");	
  return 0;
}

ale ak sa ten program dá spraviť aj jednoduchšie tak prosím napíšte :)

Nahlásit jako SPAM
IP: 145.255.157.–
zlz
~ Anonymní uživatel
634 příspěvků
30. 1. 2013   #5
-
0
-

Vždyť ti to ani nefunguje. A zkus si představit (nebo přidat výpisy), jak ten program probíhá, máš tam nesmysly.

Jednoduše najdi to jméno a pak známky.

{
	FILE *fzoznam, *fznamky;
	char hladanemeno[100], meno[100], znamky[100];
	int hladanecislo = -1, cislo, pocetznamok = 0, sucetznamok = 0;

	printf("zadaj meno: ");
	scanf("%s", hladanemeno);

	fzoznam = fopen("zoznam.txt", "r");
	while (fscanf(fzoznam, "%s %d", meno, &cislo) == 2)
	{
		if (strcmp(meno, hladanemeno) == 0)
		{
			hladanecislo = cislo;
			break;
		}
	}
	fclose(fzoznam);

	if (hladanecislo == -1)
	{
		printf("meno {%s} nie je v zozname\n", hladanemeno);
		return EXIT_FAILURE;
	}

	fznamky = fopen("znamky.txt", "r");
	while (fscanf(fznamky, "%d %s", &cislo, znamky) == 2)
	{
		if (cislo == hladanecislo)
		{
			pocetznamok = strlen(znamky);
			for (int i = 0; i < pocetznamok; i++)
			{
				char znamka[2] = { znamky[i], '\0' };
				sucetznamok += atoi(znamka);
			}
			break;
		}
	}
	fclose(fznamky);

	if (pocetznamok == 0)
	{
		printf("pre meno {%s} nie je zadana zadna znamka\n", hladanemeno);
		return EXIT_FAILURE;
	}

	printf("priemer znamok je %.2f\n", (double)sucetznamok / pocetznamok);
	return EXIT_SUCCESS;
}

+ ošetření chyb

Nahlásit jako SPAM
IP: 80.188.216.–
Kent0
Stálý člen
30. 1. 2013   #6
-
0
-

máš pravdu s tým, že mi to nefunguje .. potom som to zistil aj ja

ale nefunguje len táto časť  

if(strcmp(a,menofr1)!=0)
                    printf("Meno %s nie je v zozname\n",a);
                    system("pause");
                    return 0;

a na to som sa aj pýtal :)
keď tam toto nemám tak to ide bez problémov :) 

Nahlásit jako SPAM
IP: 145.255.157.–
zlz
~ Anonymní uživatel
634 příspěvků
30. 1. 2013   #7
-
0
-

načteš jeden řádek ze seznamu a jeden ze známek a porovnáváš je. co když budou ty záznamy v jiném pořadí?
co když v seznamu bude méně záznamu? budeš porovnávat nenačtenou hodnotu.
co když v něm bude více záznamů? nikdy ten poslední nenačteš a zacyklí se ti to.
pokaždé vypisuješ, že jméno je nebo není v seznamu. jak to víš, když jsi ho ještě neprošel celý?

hovno ide :) kdyby byl problém jen v tom returnu, tak bych nic nepsal a čekal, že si to zkusíš spustit a všimneš si toho sám.

Nahlásit jako SPAM
IP: 80.188.216.–
Kent0
Stálý člen
30. 1. 2013   #8
-
0
-

Tá úloha je postavená na tom, že ten textový súbor sa nebude meniť..takže záznamy nebudú v inom poradí ani nebude viac ani menej záznamov

Ospravedlňujem sa, je to moja chyba, že som to nenapísal :)

Nahlásit jako SPAM
IP: 145.255.157.–
zlz
~ Anonymní uživatel
634 příspěvků
31. 1. 2013   #9
-
0
-

Na co tam pak je to číslo a proč ho testuješ? Obávám se, že po odevzdání a ohodnocení budeš nemile překvapený.

Nahlásit jako SPAM
IP: 80.188.216.–
Kent0
Stálý člen
31. 1. 2013   #10
-
0
-

zoznam:
meno číslo -> Martin 1
                     Dávid 2
známky:
číslo známky -> 1 123
                         2 445

to číslo tam je na to, aby som vedel, ktoré známky patria ktorému človeku. Ja som si tú úlohu nevymyslel..dostal som ju v tomto znení 

Nahlásit jako SPAM
IP: 145.255.157.–
zlz
~ Anonymní uživatel
634 příspěvků
31. 1. 2013   #11
-
0
-

O tom přece mluvím. Ty máš pravděpodobně ze jména zjistit číslo a pro to číslo pak zjistit známky. A nespoléhat na to, že jméno a známky budou na stejném řádku, i kdyby byly.

Martin 1
David 2
Kent 3

1 123
2 445
3 555
Martin 1
David 2
Kent 3

1 123
3 555
Martin 1
Kent 3
David 2

1 123
2 445
3 555
Martin 1
Kent 3
David 2

2 445
3 555
1 123

Nahlásit jako SPAM
IP: 80.188.216.–
Kent0
Stálý člen
31. 1. 2013   #12
-
-1
-
Mimo téma

už som napísal, že textový súbor sa meniť nebude..to znamená, že vždy to bude usporiadané tak, že meno a známky budú na tom istom riadku..ja som si to nevymyslel, také zadanie som dostal..

3. krát to už písať nebudem 

každopádne Ďakujem za rady :)

Nahlásit jako SPAM
IP: 77.234.226.–
vitamin+8
Grafoman
31. 1. 2013   #13
-
+1
-
Zajímavé

#12 Kent
Naco tam je potom to id/index

Uplne by stacilo:

/*subor1*/
Martin
Kent
David

/*subor2*/
123
445
555

//alebo:

/*subor*/
Martin 123
Kent 445
David 555
Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Kent0
Stálý člen
31. 1. 2013   #14
-
0
-

to je pravda
ale tak ako som to napísal, tak nám to povedal učiteľ 

Nahlásit jako SPAM
IP: 77.234.226.–
vitamin+8
Grafoman
31. 1. 2013   #15
-
0
-

#14 Kent
Podla mna tam ucitel to cislo nedal len tak, takze by si mal pocuvnut zlz a spravyt to poriadne.

edit: To vas v skole ucia vsade davat system("pause"); ? 

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Kent0
Stálý člen
31. 1. 2013   #16
-
0
-

#15 vitamin
idem si to spraviť tak ako povedal :)

a čo sa týka toho system("pause") tak to si dávam len ja aby som zastavil program a videl čo sa stalo :)

Nahlásit jako SPAM
IP: 77.234.226.–
Kent0
Stálý člen
31. 1. 2013   #17
-
0
-

 #15 vitamin

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  FILE *fr1,*fr2;
  
  fr1=fopen("zoznam.TXT","r");
  fr2=fopen("znamky.TXT","r");
  
  char b[20],meno[20],menoziaka[20],znamky[20];
  int cislo, index=-1,n,i,m;
  float priemer,sucet=0;
  
  printf("Zadaj meno: ");
  scanf("%s",meno);
  
  while(feof(fr1)==0)
  {                                         
                     fscanf(fr1,"%s %d",menoziaka,&cislo);
                     if(strcmp(meno,menoziaka)==0)
                     {
                           index=cislo;
                           break;
                     }
  }     
  if(index==-1)
  {
  printf("%s sa nenachadza v zozname\n",meno);
  system("pause");
  return EXIT_FAILURE;
  }
  
  while(feof(fr2)==0)
  {                     
                     fscanf(fr2,"%d %s",&index,znamky);
                     
                     if(cislo==index)
                     {
                                  n=strlen(znamky);
                                  for(i=1;i<=n;i++)
                                  {
                                                   strncpy(b,znamky+(i-1),1);
                                                   m=atoi(b);
                                                   sucet=sucet+m;
                                  }
                     priemer=sucet/n;
                     }
  }              
  fclose(fr1);
  fclose(fr2);
  if(n==0)
  {
          printf("%s nema ziadne znamky\n",menoziaka);
          system("pause");
          return EXIT_FAILURE;
  }
    
  printf("%s ma priemer znamok %.2f\n",menoziaka,priemer);
  
  system("PAUSE");	
  return 0;
}

mohlo by to byť takto?

Nahlásit jako SPAM
IP: 77.234.226.–
vitamin+8
Grafoman
31. 1. 2013   #18
-
0
-

#17 Kent
Mas tam chyby...

zlz ti sem dal funkcny kod, preco sa nanho nepozres?

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Kent0
Stálý člen
1. 2. 2013   #19
-
0
-

#18 vitamin
aké chyby?

Nahlásit jako SPAM
IP: 77.234.226.–
vitamin+8
Grafoman
1. 2. 2013   #20
-
0
-

#19 Kent
Len take drobnosti, lepsie by bolo testovat navratovu hodnotu scanf, obmedzit dlzku nacitavaneho stringu v scanf  "%19s"... )

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Kent0
Stálý člen
1. 2. 2013   #21
-
0
-

 #20 vitamin

while (fscanf(fzoznam, "%s %d", meno, &cislo) == 2)

toto myslíš? 
len keď ja som nevedel prečo sa to rovná 2..také sme sa v škole neučili tak preto som to nepoužil 

Nahlásit jako SPAM
IP: 77.234.226.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 16 hostů

Podobná vlákna

Pole reťazcov — založil Tomáš

Rovnosť reťazcov — založil Grungy

Spájanie reťazcov — založil Dodiq

Dynamické pole reťazcov — založil gaben

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý