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
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
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.
http://cplus.about.com/z/js/o.htm?k=sort algorithm&d=Sort Algorithm
Lajittelet ne ensin ja sitten tarkastelet asiaa uudestaan.
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.
[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
-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???!
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
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
koska kskustelupalstalla ol jotain atk-ongelmia.
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
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.
//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
Menin samaan loukkuun,kuin "nob".
Ehkä vielä teen korjatun painoksen.
//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
-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