Avatar billede mborik Nybegynder
21. oktober 2004 - 13:03 Der er 20 kommentarer

Arrays, omforme en int til array med cifre

Jeg kan ikke finde en fiks metode til at få en int kopieret over i et array.  Jeg har erklæret et int’ array og vil nu have det mest betydende ciffer (talet 2) i 2000001 flyttet til tal[0], derefter det næst-mest betydende ciffer til index [1] osv.

Jeg benytter mig af Visual Studio 7.1 og får således ”hjælp” ved kodeskrivningen af Intellisense.  Når jeg taster nummer. (prik) fremkommer en liste over metoder man kan bruge på denne integer.  Men intet af det er ’lige det jeg har brug for’. 

Det er let af finde online hjælp til kopiering mellem to arrays, men ikke til at bryde en integer ned i delelementer.  Jeg var så småt ved at overveje at konvertere ’nummer’ til en string temp, og så bruge en temp.CopyTo(…, …, …, …); for derefter at typecaste tilbage til int…  Men det er jo en tosset måde at gribe det an på. 

Mock-up kode:

private int[] tal = new int[7];
private int nummer = 2000001;

public void Convert()
{
  for(int i=0; i<7; i++)
  {
    tal[i] = nummer.? // hvad gør jeg her?
  }
}

Der må da være en "GetXXX(i, nummer)" metode ?!
Avatar billede sovsekoder Nybegynder
21. oktober 2004 - 13:07 #1
kunne gøres på denne måde :
    int i=563722;

    while(i>0) {
        printf("%d", i%10);
        i = i/10;
    }
Avatar billede sovsekoder Nybegynder
21. oktober 2004 - 13:08 #2
...som svarer til at tage det bagerste tal (i%10) og derefter flytte alle tal en tak til højre (i=i/10). i%10 vil altid være det mindst betydende ciffer
Avatar billede soreno Praktikant
21. oktober 2004 - 13:10 #3
En lidt mere utraditionel måde at løse problemet på kunne være at konvertere tallet til en streng og så bruge en charAt lignende metode for at få fat i relevante cifre.
Avatar billede sovsekoder Nybegynder
21. oktober 2004 - 13:10 #4
så hvis man skulle bruge dit eksempel ville det være:

private int[] tal = new int[7];
private int nummer = 2000001;

public void Convert()
{
  int temp = nummer;

  for(int i=0; i<7; i++)
  {
    tal[i] = temp%10
    temp = temp/10;
  }
}

hvilket giver de 7 bagerste tal
Avatar billede arne_v Ekspert
21. oktober 2004 - 13:54 #5
Hvis man ikke kender antal cifre og vil have dem vendt rigtigt:

        int val = 47658353;
        int[] ia = new int[Digits(val)];
        int tmp = val;
        for (int i = 0; i < ia.Length; i++) {
            ia[ia.Length - i - 1] = tmp % 10;
            tmp = tmp / 10;
        }

hvor:

    private static int Digits(int v) {
        if (v < 10000) {
            if (v < 100) {
                if (v < 10) {
                    return 1;
                } else {
                    return 2;
                }
            } else {
                if (v < 1000) {
                    return 3;
                } else {
                    return 4;
                }
            }
        } else {
            if (v < 1000000) {
                if (v < 100000) {
                    return 5;
                } else {
                    return 6;
                }
            } else {
                if (v < 10000000) {
                    return 7;
                } else {
                    return 8;
                }
            }
        }
    }
Avatar billede dna Nybegynder
21. oktober 2004 - 15:16 #6
Altså.. ville det ikke være lettere at erstatte Digits() metoden med:

private static int Digits(int v) {
  string s = v.ToString();
  return s.Length;
}

dna
Avatar billede sovsekoder Nybegynder
21. oktober 2004 - 15:17 #7
:-)
Avatar billede arne_v Ekspert
21. oktober 2004 - 15:18 #8
Nemmere jo.

Men ikke hurtigere.
Avatar billede arne_v Ekspert
21. oktober 2004 - 15:19 #9
Hvis hastighed ikke betydre noget kan man også:

private static int Digits(int v) {
  return Math.Log10(v)+1;
}
Avatar billede arne_v Ekspert
21. oktober 2004 - 15:20 #10
Ja

private static int Digits(int v) {
  return (int)(Math.Log10(v)+1);
}
Avatar billede dna Nybegynder
21. oktober 2004 - 15:20 #11
arne_v:
Muligvis ikke... er ikke klar over hvad et oprettet string objekt, kald til ToString() og et kald til .Length giver af compileret kode! Men, ved bare at overskueligheden er lidt bedre (Hvis man spørger mig). Men, måske du kan fortælle os det, jeg ville i hvert fald gerne lære lidt om forskellen ved de 2 måder at gøre det på.

Det var slet ikke for at sætte spørgsmålstegn ved din kode jo!

dna
Avatar billede mborik Nybegynder
21. oktober 2004 - 15:31 #12
Tak, jeg afprøver noget af det her.  Jeg koder i C#, så jeg ved ikke om den gode gamle C printf kan anvendes. 

Men jeg kan forstå på jeres svar, at der ikke rigtigt er noget smart i C#, som modsvarer charAt() ?! Jeg finder det mærkeligt...

Mvh Mads
Avatar billede arne_v Ekspert
21. oktober 2004 - 15:31 #13
v.ToString().Length er langt mere overskueligt.

(int)(Math.Log10(v)+1) er også mere overskuelig hvis folk kan lidt matematik

men de er noget dyrere.

Logaritmer er en ret dyr funktion.

Og ToString gør det at den finder alle cifrene og ligger '0' til hver.

Og det er en lille smule bagvendt at finde alle cifrene for at finde alle cifrene.
Også selvom det ene er Microsoft kode og det andet ens egen kode.
Avatar billede arne_v Ekspert
21. oktober 2004 - 15:32 #14
charAt ? Du kan det ikke bruge charAt i Java til det her !
Avatar billede dna Nybegynder
21. oktober 2004 - 15:33 #15
mborik: myString[x] giver dig en char på et bestemt sted.

dna
Avatar billede arne_v Ekspert
21. oktober 2004 - 15:33 #16
Fortsættelse af 15:31:47>

Hvis man endelig vil bruge ToString kan man formentlig lige så godt fiske
cifrene ud af strengen
Avatar billede mborik Nybegynder
21. oktober 2004 - 15:49 #17
Sovsekoders ide virkede fint. 
Den er ikke særlig kompleks og gør arbejdet.  Dog skal for-loopet vendes, så det tæller ned.  Ellers vendes hele tallet (som du skriver, tages tallet fra det mindst betydende ciffer "LSD"):

public void Convert()
{
  int temp = nummer;
  // tæller ned så tallet vender rigtigt i array'et
  for(int i=7; i<0; i--)
  {
    tal[i] = temp%10
    temp = temp/10;
  }
}

Skidesmart ;-)
Avatar billede dna Nybegynder
21. oktober 2004 - 15:54 #18
Ja - hvis antallet altid er 7 cifre!

dna
Avatar billede petersteph Nybegynder
23. oktober 2004 - 01:08 #19
int nummer = 2000001;
char[] cnum = Convert.ToString(nummer).ToCharArray();
int[] inum = new int[cnum.Length];
for(int i=0;i<inum.Length;i++) inum[i] = Convert.ToInt32(Convert.ToString(cnum[i]));
Avatar billede arne_v Ekspert
06. november 2004 - 17:57 #20
mborik ?
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

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



Seneste spørgsmål Seneste aktivitet
I går 20:46 opkaldside Af hagbartm i Mobiltelefoner
I går 16:05 win 10 vil ikke boote Af bb69 i Windows
I går 11:20 Lenovo x390 Af tobberjas i PC
I går 10:14 Alder i Excel Af Nanarsi i Excel
I går 09:00 Flere linier på faneblad Af Peder Lund Nielsen i Excel