Du är min fiende tills motsatsen är bevisad, och bevisbördan ligger hos dig.
Ordräkning i C [noob]
Visa signatur
På sid 160 i boken "The C programming Language" av Kernighan och Richie, den svenska upplagan så står det så här:
Antag att vi vill hantera det mera generalla problemet att räkna förekomster av alla ord i en inmatning. Eftersom listan av ord ej är känd i förväg, kan vi inte bekvämt sortera den och använda en binär sökning. Vi kan inte heller göra en linjär sökning för varje ord som det anländer, ... bla bla etc etc
Du kanske hittar en intressant lösning där? Jag antar att du har den boken, då det är C-bibeln. Det är mycket lärorikt att se andra lösningar.
Citera flera
Citera
Hmm, har ingen kompilator så jag kan inte testa min kod men den kan väl i alal fall peka dig i rätt riktning... Orkar inte kommentera hela nu men den sorterar orden medan man matar in dom, alltså är ordlistan alltid sorterad... Den lägger inte heller in dubbletter utan ökar då bara "count" i Word-structen... nåväl fråga gärna om något är konstigt...
struct Word{
char word[100];
int count;
};
void setWord(char* set, char* to){
int n;
for(n = 0; to[n] != '\\0'; n++){
set[n] = to[n];
}
set[n] = '\\0';
}
void addWord(char* theWord, Word* theWords, int* numberOfWords){
int wordCheck = 0;
int letterCheck = 0;
while(1){
if(wordCheck >= numberOfWords){
setWord(theWords[wordCheck].word, theWord);
theWords[wordCheck].count = 1;
numberOfWords++;
break;
}else if((int)theWords[wordCheck].word[letterCheck] < (int)theWord[letterCheck]){
wordCheck++;
letterCheck = 0;
}else if((int)theWords[wordCheck].word[letterCheck] > (int)theWord[letterCheck]){
numberOfWords++;
for(int n = numberOfWords; n > wordCheck; n--){
theWords[n] = theWords[n-1];
}
setWord(theWords[wordCheck].word, theWord);
theWords[wordCheck].count = 1;
break;
}else if(theWords[wordCheck].word[letterCheck] == theWord[letterCheck]){
if(theWord[letterCheck] == '\\0'){
theWords[wordCheck].count++;
break;
}else{
letterCheck++;
}
}
}
}
int main(){
char text[5000] = "In this paper I shall defend a Humean theory of motivation. But first I should like to examine some of the standard criticisms of this theory and some alternative views that are currently in favour. Both in the Treatise and the Enauirv Hume maintains that reason alone never motivates action but always requires the cooperation of some separate, and separately identifiable desire-factor in order to bring about action.";
char currentWord[100];
int currentWordAt = 0;
Word words[1000];
int numberOfWords = 0;
for(int n = 0; text[n] != '\\0'; n++){
if((int)text[n] >= 97 && (int)text[n] <= 122){
currentWord[currentWordAt] = text[n];
currentWordAt++;
}else if((int)text[n] >= 65 && (int)text[n] <= 90){
currentWord[currentWordAt] = (char)((int)text[n]+32);
currentWordAt++;
}else if(currentWordAt > 0){
currentWord[currentWordAt] = '\\0';
addWord(currentWord, words, numberOfWords);
currentWordAt = 0;
}
}
if(currentWordAt > 0){
currentWord[currentWordAt] = '\\0';
addWord(currentWord, words, numberOfWords);
}
for(int n = 0; n < numberOfWords; n++){
cout << "Word: " << words[n].word << ", Occurrence: " << words[n].count << endl;
}
return 0;
}
Senast redigerat
Citera flera
Citera
Om det går bra med c++ så är väl den enklaste lösningen en map, t.ex.
map<string, unsigned int> words;
och sen använder man orden som index i map:en, alltså: ++words[ord].
Skulle ju kunna göra något liknande i ren C, genom att implementera en hashmap eller dylikt. Annars är ju sortering en bra lösning.
Visa signatur
Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410
Citera flera
Citera
Hårdvara
Mjukvara
- Idag Apple förklarar bildbuggen i IOS 17.5 7
- 22 / 5 Se vilka spel som funkar på Windows på ARM 28
- 21 / 5 Grafikprestanda i Senua's Saga: Hellblade II – ett av de tyngsta PC-spelen någonsin 155
- 19 / 5 Ghost of Tsushima kan använda DLSS och FSR 3 samtidigt 11
- 17 / 5 27 år senare – Winamp får öppen källkod 45
Övrigt
Datorkomponenter
Ljud, bild och kommunikation
- Apple förklarar bildbuggen i IOS 17.58
- Helgsnack: Vad är viktigt när du väljer laptop?19
- Generell tråd för Philips Hue594
- Övriga fynd (bara tips, ingen diskussion) — Läs första inlägget först!1142
- Första datorbygget på 20 år, PSU lyser men datorn startar inte21
- Snabbtest: 3DMark Steel Nomad – visuellt avancerat, förvånansvärt lättdrivet68
- Vad är en bra IT-chef?41
- Asus och vpn6
- Hur lägga till bilder och videos ?2
- Dagens fynd — Diskussionstråden49725
- Säljes LG Ultragear 45GR95QE Curved Ultrawide OLED
- Säljes LG 27'' UltraGear 27GL850 QHD Nano IPS 144Hz
- Säljes i9900K CPU
- Säljes Samsung Galaxy Watch5 LTE (44mm) grafit
- Säljes AMD Ryzen 5 5600X
- Säljes 2x8GB SO-DIMM DDR5, (5600 MHz)
- Säljes 10600K/Z490/Apex Pro TKL PBT/ RX580 8GBnitro+/NH-d15/144Hz m.m
- Säljes EK AIO Elite 360 D-RGB oanvänd
- Säljes Geforce + Radeon
- Köpes Noise cancelling hörlurar (skick kvittar) + Baby monitor
- Helgsnack: Vad är viktigt när du väljer laptop?19
- Apple förklarar bildbuggen i IOS 17.57
- G.Skill lanserar primärminnen med extra bling16
- Webbläsaren Edge stoppar skärmdumpar på jobbet46
- Uppgifter: Samsung kräver dina personuppgifter från reparatörer35
- Månadens drop! Kraftfullt nätaggregat hos Webhallen127
- Googles nya AI-sök föreslår klister på pizza44
- 45 år senare – nu är det ursprungliga konsolkriget över25
- Nu kommer familjedelning till Googles lösenordshanterare2
- Geforce RTX 5090 kan få 512-bitars minnesbuss58
Externa nyheter
Spelnyheter från FZ
- Warhammer 40 000: Boltgun får en expansion nästa månad idag
- Respawn kikar på att göra ett multiplayer-fps igår
- Över 10 000 har sparkats från spelbranschen i år igår
- Playstation-chef: branschen kommer "skifta från grafik till starka berättelser" igår
- Spelhelg hela helgen, sägs det – vad spelar du? igår