tiedosto/sanapeli

Olen yrittänyt tehdä perus C ohjelmoinnilla yksinkertaista ohjelmaa, joka lukee sanoja tiedostosta (sanat.txt) ja poistaa sanat jotka esiintyvät tekstissä monta kertaa, jolloin tulostuu vain ne sanat joita on vain yksi kappale tekstissä. Ohjelman pitäisi tulostaa erillinen taulukko jossa on vain ne sanat jotka esiintyvät tekstisä vain yhden kerran...ja tämä ei vaan onnistu millään :(
Osaan kyllä avata tiedoston ja fgets:lla tallentaa sen taulukkoon, mutta siihen se siten jääkin.En vaan millään keksi miten saisin tehtyä sellaisen vertailun joka poistaisi kahteen kertaan esiintyvät sanat taulukosta. Eli jos jollakin olisi todella yksinkertainen esimerkki tai vinkki niin olisin kiitollinen.


(teksti.txt) sisältö:

one1 g4 j5 kick9 numb4 word.
4k u9 j5 n4 7p.
word peace 4k.
numb4 4k j5.
7p.


........

eli ohjelman pitäisi tulostaa vain sanat:

one1
g4
kick9
u9
n4
peace




miten saan tehtyä laskutoimituksen joka poistaa
152584
Äänestä

Muut lukivat myös

Vastaukset 15

Vanhimmat

Tee toinen, kaksiulotteinen taulukko jossa char (sana) ja int (lkm).

Sitten luet ensimmäistä taulukkoa sana kerrallaan ja vertaat löytyykö se toisesta taulukosta. Jos löytyy, lisäät sen lkm arvoa yhdellä. Jos ei löydy niin siirrät sen sinne ja asetat lkm arvoksi 1.

Tulostamalla toinen taulukko lopuksi näkyy sanat vain yhteen kertaan ja lukumäärä montako kertaa se esiintyi tiedostossa.

Äänestä

Eiköhän tuo sanojen olemassaolon tarkastelu olisi paras tehdä samalla kun luet niitä taulukkoon: Jos uusi sana on jo taulukossa, siirryt seuraavaan, muussa tapauksessa lisäät sen taulukkoon. Lopuksi ei tarvitse tehdä muuta kuin tulostaa taulukko.

Äänestä

[code]
#include
#include
#include
int main(){
   FILE * fp;
   fp=fopen("teksti.txt","r");
   if(fp==NULL){exit(1);}
char array[30];int b;
   char rivi[50];
   char letter;
   char a;
while (!feof(fp))
      {
fgets(array,(30),fp);
   printf("%s",array);      
         }
      for(b=0;b

Äänestä
  • -Lue tiedostosta rivi kerrallaan(ehkäpä getline..tai..) ja sovella allaolevaa
    systeemiä periaatteellisesti(!!),kun luet sanat taulukkoon.
    -Aiemmin annoin koodin taulukosta,johon luetaan sanat,jotka esiintyvät vai kerran.
    Tämä olisi sitten se tsekattava taulukko,jossa on kaikki failin sanat!!
    -Kokeile!!

    #include
    #include
    #include
    #include

    using namespace std;

    int main()
    {
    //Huom! tilanvaraus 500 stringiä
    string *tau=new string[500];
    //Huom! tilanvaraus 300 merkkiä rivillä
    char input[300] = "abc dfgds d ggg dddd xxxxx sssss";
    char *p;
    //Tämä vastaa riviä,jonka luet tiedostosta
    //strtok eka kerta
    p = strtok(input, "");
    if (p) printf("%s\n", p);
    //*****************************************************************************
    //strtok niin kauan,kuin sanoja riittää
    //Tämä vastaa myös riviä,jonka luet tiedostosta
    int i=0;
    while(strtok(NULL, "")!=NULL)
    {
    p = strtok(NULL, "");
    if(p)
    {
    tau[i]=p;
    i++;
    }
    }//while
    //*****************************************************************************
    //Tulostetaan "sanat"
    for(int x=0;x

    Äänestä

  • Builder kirjoitti:

    -Lue tiedostosta rivi kerrallaan(ehkäpä getline..tai..) ja sovella allaolevaa
    systeemiä periaatteellisesti(!!),kun luet sanat taulukkoon.
    -Aiemmin annoin koodin taulukosta,johon luetaan sanat,jotka esiintyvät vai kerran.
    Tämä olisi sitten se tsekattava taulukko,jossa on kaikki failin sanat!!
    -Kokeile!!

    #include
    #include
    #include
    #include

    using namespace std;

    int main()
    {
    //Huom! tilanvaraus 500 stringiä
    string *tau=new string[500];
    //Huom! tilanvaraus 300 merkkiä rivillä
    char input[300] = "abc dfgds d ggg dddd xxxxx sssss";
    char *p;
    //Tämä vastaa riviä,jonka luet tiedostosta
    //strtok eka kerta
    p = strtok(input, "");
    if (p) printf("%s\n", p);
    //*****************************************************************************
    //strtok niin kauan,kuin sanoja riittää
    //Tämä vastaa myös riviä,jonka luet tiedostosta
    int i=0;
    while(strtok(NULL, "")!=NULL)
    {
    p = strtok(NULL, "");
    if(p)
    {
    tau[i]=p;
    i++;
    }
    }//while
    //*****************************************************************************
    //Tulostetaan "sanat"
    for(int x=0;x

    Koodi on virheellinen..!!!!!!!
    Palataan???!

    Äänestä

  • Builder kirjoitti:

    Koodi on virheellinen..!!!!!!!
    Palataan???!

    Tässä vähän parempi koodinpätkä
    Tuota voi sitten soveltaa(toivottavasti)


    #include
    #include
    #include
    #include

    using namespace std;

    int main()
    {
    char input[100] = "aa bb cc stringi";
    char *p;
    int sanat=0;//Sanoja kpl
    //200 stringiä
    string *tau=new string[200];
    //Eka sana
    p = strtok(input, " ");
    if (p)
    {
    tau[sanat]=p;
    sanat ;
    }
    //Rivin loppuun
    for(;;)
    {
    p = strtok(NULL, " ");
    if (p)
    {
    tau[sanat]=p;
    sanat ;
    }
    else break;
    }
    //Tulostetaan
    for(int x=0;x

    Äänestä

  • Builder kirjoitti:

    Koodi on virheellinen..!!!!!!!
    Palataan???!

    Tässä vähän parempi koodinpätkä
    Tuota voi sitten soveltaa(toivottavasti)


    #include
    #include
    #include
    #include

    using namespace std;

    int main()
    {
    char input[100] = "aa bb cc stringi";
    char *p;
    int sanat=0;//Sanoja kpl
    //200 stringiä
    string *tau=new string[200];
    //Eka sana
    p = strtok(input, " ");
    if (p)
    {
    tau[sanat]=p;
    sanat ;
    }
    //Rivin loppuun
    for(;;)
    {
    p = strtok(NULL, " ");
    if (p)
    {
    tau[sanat]=p;
    sanat ;
    }
    else break;
    }
    //Tulostetaan
    for(int x=0;x

    Äänestä

  • Builder kirjoitti:

    Koodi on virheellinen..!!!!!!!
    Palataan???!

    koska kskustelupalstalla ol jotain atk-ongelmia.

    Äänestä

Vaihda sinäkin suosiolla C :aan. :)

Mutta tässäpä pieni esimerkki.

#include
#include
#include
#include

int main(int argc, char* argv[])
{
std::ifstream file("file.txt");
std::string curr_line;
std::set words;
size_t pos = 0, prev = 0;
while (std::getline(file, curr_line))
{
while ((pos=curr_line.find(" ", pos 1))!=std::string::npos)
words.insert(curr_line.substr(prev, pos-prev));
prev = pos 1;
} words.insert(curr_line.substr(prev));

std::cout

Äänestä
  • Jaah, ei ollenkaan niitä sanoja jotka esiintyvät kahdesti, aattelin että sellaset sanat vain kerran.

    Survoo vaan johonki taulukkoon ja sitte kattelee onko siellä samoja esim.

    Äänestä

//Tässä on pyytämäsi vertailuohjelma,joka lukee listasta "nimet",
//listaan nimet2 ainoastaan ne nimet jotka esiintyvät.
//siinä vain kerran.Sinun tehtäväsi on lukea omat stringisi listaan "nimet".
//Nimien lukumäärä(=n)tiedostossa on helppo saada selville.
//Valitettavasti sisennykset näyttävät aina
häipyvän

#include
#include
#include
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
int n=4;//kaikki nimet/kpl.
string *nimet=new string[n];//Tässä ovat kaikki nimet
nimet[0]="Paavo Tapani";
nimet[1]="Leena Mirjami";
nimet[2]="Paavo Tapani";
nimet[3]="Leena";

string *nimet2=new string[n];//Tähän luetaan uniikit nimet
bool onpi=false;//Onko listassa nimet2 vertailtava stringi
int i=0;//Päälaskuri - kaikki nimet
int eisama=0;//Jos eri
string xx="";
while(i0)
{
xx=nimet[i];//Uusi nimi kokeiltavaksi
//ShowMessage(xx);//OK
for(int z=0;z

Äänestä

Menin samaan loukkuun,kuin "nob".
Ehkä vielä teen korjatun painoksen.

Äänestä
  • //Tässä jätetään lukematta taulukkoon nimet2[] nimet,jotka esiintyvät
    //taulukossa nimet[] kaksi kertaa;
    //Koodi on C ,mutta ei liene vaikeata soveltaa.
    //Nimien lukumäärä pitää ensin saada tiedostosta.
    //Koska taulukot ovat dynaamisia,niin asiat helpottuvat.
    //Sinun täytyy vain lukea montako(=n)stringiä on tiedostossa

    #include
    #include
    #include
    //---------------------------------------------------------------------------

    int main(int argc, char* argv[])
    {
    int n=4;//Nimien lukumäärä yhteensä [kpl]
    string *nimet=new string[n];//Tässä ovat kaikki nimet

    nimet[0]="Pekka";
    nimet[1]="Lyyli";
    nimet[2]="Pekka";
    nimet[3]="Leena";

    string *nimet2=new string[n];//Tähän luetaan uniikit nimet

    int i=0;//Nimilaskuri - kaikki nimet
    string xx="";//Vertailunimi
    int duppeli;//Montako kertaa stringi(xx) esiintyy taulukossa nimi[]
    int to_nimet2=0;//Nimien lukumäärä taulukkoon nimet2

    while(i

    Äänestä

-En kyllä tiedä miten sitä sanapeliä pelataan,mutta allaolevasta luulisi olevan
"helppoa" improvisoida ja jatkaa..???Ainakin periaatteet ovat näkyvissä.
-Luetaan tiedostosta sanat ja katsotaan onko samoja - jos on,
niin ei lueta taulukkoon uniikit.
-Onko käytetty C:tä tai C :aa ei ymmärtääkseni ole käytännön merkitystä.
Jos ongelman saa ratkaistua on kaikki ok.


#include
#include
#include
#include

using namespace std;
int main()
{
//Luetaan sanat olemassaolevasta tiedostosta tiedot.txt
//********************************************************
string s1;//Lukustringi
int n1=0;//Sanat
//Tiedoston täytyy olla olemassa
ifstream lukufile("tiedot.txt");

//Taulukon tilanvaraus 1000 stringiä
string *kaikki=new string[1000];

if (lukufile.is_open())
{
lukufile >> s1;//Luetaan
kaikki[n1]=s1;//Kirjoitetaan taulukkoon

while(!lukufile.eof())
{
n1 ;
lukufile >> s1;
kaikki[n1]=s1;
}
lukufile.close(); //suljetaan lukutiedosto
}//if

//Aloitetaan sanavertailu
//************************************************************
string *uniikit=new string[n1 1];//Tähän luetaan uniikit sanat
int i=0;//Sanalaskuri
string xx="";//Vertailusana
int duppeli;//Montako kertaa stringi(xx) esiintyy taulukossa kaikki[]
int to_nimet2=0;//Sanojen lukumäärä taulukkoon uniikit

while(i

Äänestä

Kommentoi aloitusta


snow_miia kirjoitti:

Olen yrittänyt tehdä perus C ohjelmoinnilla yksinkertaista ohjelmaa, joka lukee sanoja tiedostosta (sanat.txt) ja poistaa sanat jotka esiintyvät tekstissä monta kertaa, jolloin tulostuu vain ne sanat joita on vain yksi kappale tekstissä. Ohjelman pitäisi tulostaa erillinen taulukko jossa on vain ne sanat jotka esiintyvät tekstisä vain yhden kerran...ja tämä ei vaan onnistu millään :(
Osaan kyllä avata tiedoston ja fgets:lla tallentaa sen taulukkoon, mutta siihen se siten jääkin.En vaan millään keksi miten saisin tehtyä sellaisen vertailun joka poistaisi kahteen kertaan esiintyvät sanat taulukosta. Eli jos jollakin olisi todella yksinkertainen esimerkki tai vinkki niin olisin kiitollinen.


(teksti.txt) sisältö:

one1 g4 j5 kick9 numb4 word.
4k u9 j5 n4 7p.
word peace 4k.
numb4 4k j5.
7p.


........

eli ohjelman pitäisi tulostaa vain sanat:

one1
g4
kick9
u9
n4
peace




miten saan tehtyä laskutoimituksen joka poistaa

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu