Avatar billede lordsaxo Nybegynder
21. april 2006 - 08:54 Der er 10 kommentarer og
1 løsning

Bruge en variabel som "nævner" i et array

Hej eksperter.

Jeg skal lave et program, der går en tekst igennem, og går en tekst igennem, og tæller hvor mange af hvert bogstav/tegn der findes i teksten, og efter skriver resultatet ud til brugeren.

Jeg havde tænkt mig at lave det som et array, som bogstaver[a][x] hvor x er antal tegn. Jeg har en del kendskab til php, hvor jeg ved at man kan tilgå et array med en variabel, f.eks. $array[$b]++;
Er det muligt at lave noget lignende i C#?

Derudover vil jeg gerne vide om det er muligt at køre et array igennem, og udskrive alle værdierne på skærmen, så de kommet til at stå med Bogstav: tal, f.eks. A: 22.
Er der nogen der kan fortælle mig hvordan man gør dette?

På forhånd tak.
Avatar billede dr_chaos Nybegynder
21. april 2006 - 09:06 #1
Er det noget i denne stil ?

String[] sArr = new String[5];

for(int i=0;i<sArr.Count;i++)
{
Console.WriteLine(sArr[i]);
}
Avatar billede lordsaxo Nybegynder
21. april 2006 - 09:14 #2
Jamen, problemet er at jeg vil have et array der ligner dette:
sArr[A] = 22;
sArr[B] = 14;
...

Osv. med alle alfabetets bogstaver. På den måde ville jeg hver gang jeg støder på f.eks. et A, bare skrive sArr[A]++;

Men det virker på mig som om C# kun vil have tal værdier i arrayets nævner? Altså, den vil ikke modtage sArr[A], men godt sArr[1]? :S
Avatar billede dr_chaos Nybegynder
21. april 2006 - 09:20 #3
Det tror jeg ikke at du kan.
måske kan du lave din egen list som kan klare det.
Avatar billede lordsaxo Nybegynder
21. april 2006 - 09:22 #4
Kan du ikke komme med et eksempel på hvordan man gør det? Jeg er lidt lost her. Er nybegynder til C#, men et sted skal man jo starte. ;)

Anyways, hvad er det lige sådan en "list" er? Har du evt. et link til hvor jeg kan læse mere om det? :S
Avatar billede dr_chaos Nybegynder
21. april 2006 - 09:30 #5
hmm det ikke noget jeg har prøvet at lave og jeg kan ikke umiddelbart finde nogen som har lavet.
Er formålet kun at finde ud af hvor mange af hvert bogstav der findes i en tekst ?
Avatar billede tuxic Nybegynder
21. april 2006 - 09:58 #6
Det smarteste er at bruge et generisk Dictionary:

Dictionary <char, int> hyppigheder = new Dictionary<char,int> ();

og når du så støder på et A:
hyppigheder ['A']++;

eller med en char variabel: hyppigheder [variabel]++;

Arrays i C# kan kun indekseres med ints.

Nu kan en char castes til int så du kunne principielt lave et array af længde svarende til alle mulige chars (og så skrive noget ala sArr [(int) A]++), men det er dumt af to grunde:
* Hvis der kun optræder Xer i din tekst har du fylder array ligeså meget som hvis alle  bogstaver optræder lige hyppigt.
* I min verden er det lidt skummelt at lave char -> cast, men på den anden side understøtter platformen det.

Der er dog en enkelt fordel ved at bruge array'et fremfor Dictionary og det er at det går lidt hurtigere. Men jeg tvivler på at det kan lade sig gøre. Og i alle tilfælde er det bedre at starte med den pæneste løsning og så hvis der viser sig perf problemer hacke sig igennem.
Avatar billede tuxic Nybegynder
21. april 2006 - 09:59 #7
Korrektion Arrays i C# kan indekseres med integertyper. (ikke _kun_ Int32)
Avatar billede tuxic Nybegynder
21. april 2006 - 10:03 #8
Oh. Vedrørende udskrivningen af indholdet:
Fx noget ala

foreach (char c in hyppigheder.Keys)
  Console.WriteLine (string.Format ("{0}: {1}", c, hyppigheder [c]));
Avatar billede innercitydk Nybegynder
21. april 2006 - 22:38 #9
Jeg har bikset en lille consol applikation sammen hvor du kan se hvordan du kan gøre:

using System;
using System.Collections.Generic;
using System.Text;

namespace Forekomst
{
    class Program
    {
        static void Main(string[] args)
        {
            //Tæller bruges til at holde styr på indekseringen ved gennemløb af arrayet.
            int taeller = 0;

            char[] letters = new char[28]; // 28 er antallet af pladser i arrayet

            //Her er alfabetet den tester ud fra. Du kan også putte , og . osv ind i strengen
            //men husk at rette letters array i størrelsen så der er plads!
            string alfabet = "ABCDEFGHIJKLMNOPQRSTUVXYZÆØÅ";

            foreach (char karakter in alfabet)
            {
                letters[taeller] = karakter;
                taeller += 1;
            }
           
            //Vi skal bruge taeller igen så vi nulstiller den lige
            taeller = 0;

            int[] forekomster = new int[28];

            string text1 = "Hej med dig hvordan går det så. Det her er blot en test tekst.";
            string textFormateret = text1.ToUpper();
           
            foreach (char c in textFormateret)
            {
                foreach (char c2 in letters)
                {
                    if (c == c2)
                    {
                        forekomster[taeller] += 1;
                    }
                    taeller += 1;
                }
                taeller = 0;
            }

            for (int j = 0; j < letters.Length; j++)
            {
                Console.WriteLine("Bogstav, antal forekomster: {0}, {1}", letters[j], forekomster[j]);
            }
        }
    }
}

Vh Nicki
Avatar billede lordsaxo Nybegynder
22. april 2006 - 20:07 #10
TAk for alle svarene. Takket være Tuxic's forklaring omkring Dictionary's fandt jeg en brugbar løsning. Jeg kan uploade programmet og sourcen hvis nogle ønsker at se det færdige resultat.

Smid et svar Tuxic, så du kan få dine point. ;)
Avatar billede tuxic Nybegynder
22. april 2006 - 20:20 #11
Det er altid en fornøjelse af hjælpe. Najs at du fik det til at virke!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester