Pereiti prie turinio

Char tipo lyginimas


Rekomenduojami pranešimai

Sveiki, turiu tokią problemą. Turiu tekstinį failą, kuriame tarkim pirmoje eilutėje yra žmonių skaičius k. Tolesnėse eilutėse yra tų žmonių vardai, kurių vardas, tebunie būna ne didesnis nei 10 raidžių ir jų amžius(sveikasis skaičius). Noriu paklausti kaip naudojant char galima sulyginti tų žmonių vardus, t.y, kaip for cikle sulyginti ar nulinis narys yra toks pats kaip pirmasis ar antrasis narys?

 

Duomenys.txt

5

Jonas 13

Petras 18

Vytas 26

Jonas 14

Jonas 32

 

#include <iostream>
#include <fstream>
using namespace std;

struct duomenys
{
   char vardas[10];
   int amzius;
};

void skaityk(duomenys A[], int &k);
void skaiciuok(duomenys A[], int k, char apskritis);

int main()
{
   duomenys A[100];
   int k;

   skaityk(A, k);
   skaiciuok(A, k, apskritis);

   return 0;
}

void skaityk(duomenys A[], int &k)
{
   ifstream Duom("Duomenys.txt");

   Duom >> k;

   Duom.ignore();

   for(int i=0; i<k; i++)
   {
       Duom.get(A[i].vardas, 10); // Nuskaitau žmogaus vardą
       Duom >> A[i].amzius;       // Nuskaitau žmogaus amžių
       Duom.ignore();
   }

   Duom.close();
}

 

Duomenis nuskaito teisingai. Dabar nežinau kaip sintaksiškai teisingai priskirti kad tarkim nulinį narį lygintų su mano sugalvotu vardu "Jonas".

 

void skaiciuok(duomenys A[], int k, char vardas)
{
   A[0].vardas = "Jonas"; 
   for(int i=1; i<k; i++)
   {
       int kiekis = 0;
       if(A[i].vardas == "Jonas")
       {
           kiekis++;
       }
   }
}

 

Žodžiu kiekį turėtų parodyti 3, nes tekstiniame faile trys elementai sutampa su mano sugalvotu vardu "Jonas".

Nežinau ar teisingai paaiškinau sąlygą, bet tikiuosi kad kažkas pagelbės. Ar tokiu atveju reiktų naudoti string? Gal kas gali paaiškinti kuo skiriasi char nuo string?

 

Mane domina kaip charo narį prilyginti kažkokiam sugalvotam žodžiui ir kaip po to for cikle lyginti ar tokie vardai pasikartoja.

Redagavo CaL
Nuoroda į pranešimą
Dalintis kituose puslapiuose

1. Variantas C kalbos

 

#include <string.h>

if(strcmp(vardas, "Jonas") == 0) std::cout << "go";

 

2. Variantas C++ kalbos

 

char vardas[10] = "Jonas";
std::string sVardas = vardas;
if(sVardas == "Jonas") std::cout << "go";

 

Nu ir taip toliau, pilna variacijų. Ir išvis, kokio velnio naudoji char masyvą, o ne string, kuomet programuoji c++?

Redagavo Pattio
Nuoroda į pranešimą
Dalintis kituose puslapiuose

rezultatai.txt

Jonas 3

Petras 1

Vytas 1

 

#include <iostream>
#include <fstream>

using namespace std;

struct asmuo{
string vardas;
int amzius;
int kiek;
};
//-----------------------------
//Konstantos
const char CDfv[] = "duomenys.txt";
const char CRfv[] = "rezultatai.txt";
const int Cmax = 100;
//-----------------------------
//Funkciju prototipai
void skaityti(asmuo A[], int & n);
void ieskoti(asmuo A[], int & n);
int kiek(asmuo A[], int & n, int m, string pav);
void salinti(asmuo A[], int & n, int index);
void rikiuoti(asmuo A[], int n);
void rodyti(asmuo A[], int n);
//-----------------------------
int main()
{
   asmuo A[Cmax];
   int n;
   skaityti(A, n);
   ieskoti(A, n);
   rikiuoti(A, n);
   rodyti(A, n);
   return 0;
}
//-----------------------------------
//Nuskaito duomenys
void skaityti(asmuo A[], int & n)
{
   ifstream fd(CDfv);
   fd>>n;
   fd.ignore(80, '\n');
   for(int i = 0; i<n; i++)
   {
       char eil[9];
       fd.get(eil, 9);
       A[i].vardas = eil;
       fd>>A[i].amzius;
       fd.ignore(80, '\n');
       A[i].kiek = 1;
   }
   fd.close();
}
//-----------------------------
//Suranda kiek tokiu pat vardu
void ieskoti(asmuo A[], int & n)
{
   for(int i = 0; i<n; i++)
   {
       A[i].kiek += kiek(A, n, i, A[i].vardas);
   }
}
//-----------------------------------------------------
//Jeigu suranda toki pat varda pasalina ji ir gražina skaičiu kuris nurodo kiek tokiu pat vardu
int kiek(asmuo A[], int & n, int m, string pav)
{
   int k = 0;
   for(int i = m+1; i<n; i++)
   {
       if(A[i].vardas==pav)
       {
           k++;
           salinti(A, n, i);
           i--;
       }
   }
   return k;
}
//-----------------------------------------------
//Pasalina struktura elementa(Vienoda varda)
void salinti(asmuo A[], int & n, int index)
{
   for(int i = index; i<n; i++)
   {
       A[i] = A[i+1];
   }
   n--;
}
//-----------------------------------------
//Surikiuoja didejanciai pagal kiek tokiu pat vardu. (Burbuliuko metodas)
void rikiuoti(asmuo A[], int n)
{
   for(int i = 0; i<n-1; i++)
       for(int j = i+1; j<n; j++)
   {
       if(A[i].kiek<A[j].kiek)
       {
           swap(A[i], A[j]);
       }
   }
}
//---------------------------------------
//Isveda rezultatus i faila
void rodyti(asmuo A[], int n)
{
   ofstream fr(CRfv);
   for(int i = 0; i<n; i++)
   {
       fr<<A[i].vardas<<A[i].kiek<<endl;
   }
   fr.close();
}

Nuoroda į pranešimą
Dalintis kituose puslapiuose

rezultatai.txt

Jonas 3

Petras 1

Vytas 1

 

#include <iostream>
#include <fstream>

using namespace std;

struct asmuo{
string vardas;
int amzius;
int kiek;
};
//-----------------------------
//Konstantos
const char CDfv[] = "duomenys.txt";
const char CRfv[] = "rezultatai.txt";
const int Cmax = 100;
//-----------------------------
//Funkciju prototipai
void skaityti(asmuo A[], int & n);
void ieskoti(asmuo A[], int & n);
int kiek(asmuo A[], int & n, int m, string pav);
void salinti(asmuo A[], int & n, int index);
void rikiuoti(asmuo A[], int n);
void rodyti(asmuo A[], int n);
//-----------------------------
int main()
{
   asmuo A[Cmax];
   int n;
   skaityti(A, n);
   ieskoti(A, n);
   rikiuoti(A, n);
   rodyti(A, n);
   return 0;
}
//-----------------------------------
//Nuskaito duomenys
void skaityti(asmuo A[], int & n)
{
   ifstream fd(CDfv);
   fd>>n;
   fd.ignore(80, '\n');
   for(int i = 0; i<n; i++)
   {
       char eil[9];
       fd.get(eil, 9);
       A[i].vardas = eil;
       fd>>A[i].amzius;
       fd.ignore(80, '\n');
       A[i].kiek = 1;
   }
   fd.close();
}
//-----------------------------
//Suranda kiek tokiu pat vardu
void ieskoti(asmuo A[], int & n)
{
   for(int i = 0; i<n; i++)
   {
       A[i].kiek += kiek(A, n, i, A[i].vardas);
   }
}
//-----------------------------------------------------
//Jeigu suranda toki pat varda pasalina ji ir gražina skaičiu kuris nurodo kiek tokiu pat vardu
int kiek(asmuo A[], int & n, int m, string pav)
{
   int k = 0;
   for(int i = m+1; i<n; i++)
   {
       if(A[i].vardas==pav)
       {
           k++;
           salinti(A, n, i);
           i--;
       }
   }
   return k;
}
//-----------------------------------------------
//Pasalina struktura elementa(Vienoda varda)
void salinti(asmuo A[], int & n, int index)
{
   for(int i = index; i<n; i++)
   {
       A[i] = A[i+1];
   }
   n--;
}
//-----------------------------------------
//Surikiuoja didejanciai pagal kiek tokiu pat vardu. (Burbuliuko metodas)
void rikiuoti(asmuo A[], int n)
{
   for(int i = 0; i<n-1; i++)
       for(int j = i+1; j<n; j++)
   {
       if(A[i].kiek<A[j].kiek)
       {
           swap(A[i], A[j]);
       }
   }
}
//---------------------------------------
//Isveda rezultatus i faila
void rodyti(asmuo A[], int n)
{
   ofstream fr(CRfv);
   for(int i = 0; i<n; i++)
   {
       fr<<A[i].vardas<<A[i].kiek<<endl;
   }
   fr.close();
}

 

Bet man regis nuskaito tik pirmą eilutę. Ar neteisus aš? kaip patikrinti?

Ir rezultaitai gaunasi

4

Jonas 131

Redagavo CaL
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...