Hjälp med programmering

Diskussion i 'Off Topic' startad av Robr, 20 maj 2010.

  1. Robr

    Robr Kid Droid Medlem

    Blev medlem:
    23 feb 2010
    Inlägg:
    38
    Mottagna gillanden:
    0

    MINA ENHETER

    Hej har fastnat lite i en uppgift jag gör. Spårket är C men det ska nog inte vara någr svårigheter att lista ut om man kan något annat språk.

    Jag har en lista som ett antal nummer och namn såhär:

    1 Robr
    2 Lars
    3 Karin
    osv..

    när den har listat 15 namn så får man ett val:
    Skriv N För att lägga till ett namn, X för att avsluta och numret som står innan namnet för att redigera denne.

    Hur ska jag göra man ska kunna välja en person med hjälp av en siffra på lättaste sätt?

    PHP:
            cVal getchar();

            if(
    cVal =='n')
            {
            }
            else if(
    cVal =='q')
            {
                return 
    0;
            }

            for(
    i=0;i<26;i++)
            {
                if(
    cVal ==i)
                {
                    
    printf("\n\n%c\n\n",cVal);
                }
            }
    Så tänkte jag först fast det går inte eftersom cVal är en char. Man skulle ju kunna göra massor med if-satser, fast det känns som att det borde finnas något smidigare sätt.
     
  2. dekadans

    dekadans Adult Droid Medlem

    Blev medlem:
    6 jan 2010
    Inlägg:
    986
    Mottagna gillanden:
    6

    MINA ENHETER

    Jag vet inte om jag fattat rätt, men du vill kunna mata in en siffra i en char och sedan jämföra med en integer så finns det en funtion som heter atoi() ("ascii to integer"). Den läser in din ascii-siffra och översätter till en binärkodad int.
    Däremot fungerar den bara med strängar, alltså vektorer av char.

    PHP:
    char sVal[3];

    // Matar in ditt val  i sVal
    scanf("%s",sVal);
    fflush(stdin);

    // If-satser

    if (strcmp(sVal,"n") == 0)
    {
       
    // Valde n
    }

    else if (
    strcmp("q",sVal) == 0)
    {
       
    // Valde q
    }

    // Om inte n eller q valdes så utgår vi ifrån att det är en siffra.
    else
    {
       
    // Sparar siffran som int
       
    int iVal atoi(sVal);
       
       
    // Om det inte var en siffra blir iVal == NULL.
       
    if (iVal != NULL)
       {
         
    printf("iVal är en siffra, nu är det bara att koda resten av programmet!\n");
       }
    }

    Typ något sånt.^^
     
    Last edited: 20 maj 2010
  3. Robr

    Robr Kid Droid Medlem

    Blev medlem:
    23 feb 2010
    Inlägg:
    38
    Mottagna gillanden:
    0

    MINA ENHETER

    Tack!
     
    Last edited: 20 maj 2010
  4. dekadans

    dekadans Adult Droid Medlem

    Blev medlem:
    6 jan 2010
    Inlägg:
    986
    Mottagna gillanden:
    6

    MINA ENHETER

    Inga problem :)

    Eftersom du redigerade bort din andra fråga utgår jag ifrån att du listade ut att structs fixar detta:

    teststruct[1] = teststruct[2];

    Även om de har flera subvärden, inklusive strängar.
     
  5. Robr

    Robr Kid Droid Medlem

    Blev medlem:
    23 feb 2010
    Inlägg:
    38
    Mottagna gillanden:
    0

    MINA ENHETER

    Var tyvärr inte så jag gjorde..
    Men tack för svaret det du skrev var mycket bättre, hehe :P
     
  6. dekadans

    dekadans Adult Droid Medlem

    Blev medlem:
    6 jan 2010
    Inlägg:
    986
    Mottagna gillanden:
    6

    MINA ENHETER

    Haha, jag är glad att C-kunskaperna kommer till användning ibland : D
     
  7. Robr

    Robr Kid Droid Medlem

    Blev medlem:
    23 feb 2010
    Inlägg:
    38
    Mottagna gillanden:
    0

    MINA ENHETER

    Här kommer ännu en fråga.
    Om jag gör en sökning och söker efter lars så funkar detta:
    PHP:
    if(strcmp(sSok,arrMedlemIn[i].sFnamn)==|| strcmp(sSok,arrMedlemIn[i].sEnamn)==0)
    Men hur kan jag göra så att La* hittar både lars och lasse? :P
     
  8. dekadans

    dekadans Adult Droid Medlem

    Blev medlem:
    6 jan 2010
    Inlägg:
    986
    Mottagna gillanden:
    6

    MINA ENHETER

    strcmp(srt1,str2) returnerar 0 om str1 och str2 är identiska. (och 1 resp -1 om den ligger över eller under i alfabetisk ordning)

    Om man istället använder strstr(str1,str2) så söker den efter str2 i str1.
    Om det hittas returneras en pekare till första förekomsten, annars NULL.

    Alltså borde följande bli bättre:

    PHP:
    if (strstr(arrMedlemIn[i].sFnamnsSok) != NULL || strstr(arrMedlemIn[i].sEnamnsSok) != NULL)
    Om sSok då är La så kommer både Lars och Lasse att hittas.
     
  9. Robr

    Robr Kid Droid Medlem

    Blev medlem:
    23 feb 2010
    Inlägg:
    38
    Mottagna gillanden:
    0

    MINA ENHETER

    Tack så mycket.
    Borde inte detta fungera?
    PHP:
    iLangd strlen(sSok);

        if(
    sSok[iLangd-1]=='*')
        {
            
    sSok[iLangd-1]="";
            for(
    i=0;i<iHogstanummer;i++)
            {
                 if (
    strstr(arrMedlemIn[i].sFnamnsSok) != NULL || strstr(arrMedlemIn[i].sEnamnsSok) != NULL)
                 {
                    
    puts(arrMedlemIn[i].sFnamn);
                    
    puts(arrMedlemIn[i].sEnamn);
                 }
            }
        }

        else
        {
            for(
    i=0;i<iHogstanummer;i++)
            {
                if(
    strcmp(sSok,arrMedlemIn[i].sFnamn)==|| strcmp(sSok,arrMedlemIn[i].sEnamn)==0)
                {
                    
    puts(arrMedlemIn[i].sFnamn);
                    
    puts(arrMedlemIn[i].sEnamn);
                }
            }
        }
    Den hittar inget vid sökning av La* men Lars fungerar.
     
  10. henca

    henca Senior Droid Medlem

    Blev medlem:
    30 dec 2009
    Inlägg:
    1 335
    Mottagna gillanden:
    211

    MINA ENHETER

    sSok är en array av char, d v s sSok[iLangd-1] är en char.

    "" är en textsträng, d v s en pekare till en nollterminerad array av char. Din tilldelning

    sSok[iLangd -1] = ""

    borde i de flesta vettiga kompilatorer generera en varning, du sparar en (32-bitars?) pekare i en 8-bitars char vilket sannolikt kommer ge en overflow.

    I specialfallet att du vill ta bort det sista tecknet i en nollterminerad sträng är det väldigt enkelt:

    sSok[iLangd -1] = 0;

    Om du hade velat ta bort något annat tecken i en sträng skulle du fått lösa det med någon loop eller ett anrop till någon funktion som memmove.

    m v h Henrik
     
  11. Robr

    Robr Kid Droid Medlem

    Blev medlem:
    23 feb 2010
    Inlägg:
    38
    Mottagna gillanden:
    0

    MINA ENHETER

    Tack så mycket, det fungerade nu efter att jag hade ändrat till sSok[iLangd-1:(0;.
    Felet var att filen som lagrar värderna för arrMedlemIn hade blivit korrupt och därav hittade den inga resultat.

    EDIT:Verkar som att filen sparas helt fel ibland, men vad det beror på för jag felsöka imorn, tack för all hjälp.
     
    Last edited: 21 maj 2010
  12. Robr

    Robr Kid Droid Medlem

    Blev medlem:
    23 feb 2010
    Inlägg:
    38
    Mottagna gillanden:
    0

    MINA ENHETER

    Godmorgon!

    Jag har en till fråga. Kan man räkna hur hur lång en variabel är?
    Tänkte mig nått sånt här, med det fungerade icke!
    PHP:
    #include <stdio.h>
    #include <stdlib.h>

    int main()
    {
        
    char test[10];
        
    int i;

        
    test[0]='a';
        
    test[1]='a';
        
    test[2]='a';
        
    test[3]='a';
        
    test[4]='a';
        
    test[5]='a';

        for(
    i=0;test[i]!=NULL;i++)
        {
            
    printf("%i",i);
        }


        return 
    0;
    }
    Då blir outputen:
    0123456789
    hade tänkt att den borde stannat på 6 där..
     
  13. henca

    henca Senior Droid Medlem

    Blev medlem:
    30 dec 2009
    Inlägg:
    1 335
    Mottagna gillanden:
    211

    MINA ENHETER

    Det närmaste jag kommer att tänka på är sizeof.


    Varför skulle den stanna på 6? Det var mer tur än skicklighet att den råkade stanna på 9...

    Du har deklarerat en variabel i form av en array som tar upp 10 byte. Av dessa 10 byte har du initierat de 6 första byten. Övriga delar av din array är helt oinitierade och du har ingen aning om vad som ligger där. Du kan inte heller säga vad som ligger före eller efter dessa 10 byte, det är helt kompilatorberoende vad som råkar hamna där i minnet, kanske ligger det andra variabler där, kanske är det minnesareor som ditt program inte har rätt att läsa.

    test[6] är en char med ett okänt värde, d v s 8 bitar som kan ha värden mellan -128 och 127. Observera att även test[10] är att betrakta som ett okänt värde eller kanske rentav förbjuden mark. Det finns ingenting i din for-loop som garanterat förhindrar ditt program att krasha på grund av otillåten minnesåtkomst.

    NULL brukar användas för ogiltiga pekare, d v s beroende på din miljö kan det vara ett 32-bitars tal med värden 0 - 2^32-1.

    Om du initierat test[6] till 0 skulle kanske din jämförelse med NULL falla in, det är ungefär så som nollterminerade strängar fungerar vilket är hur man brukar representera textsträngar i C.

    Vad kör du för kompilator? Då din kod kompileras med gcc får man följande varning:

    test.c: In function `main':
    test.c:16: warning: comparison between pointer and integer

    Beroende på vad man vill skriva för kod kan det vara bra att slå på så mycket varningar som möjligt redan från början, med gcc är
    -ansi -pedantic -Wall
    lämpliga flaggor. Ovanstående varning får man dock även utan dessa flaggor.

    m v h Henrik
     
  14. dekadans

    dekadans Adult Droid Medlem

    Blev medlem:
    6 jan 2010
    Inlägg:
    986
    Mottagna gillanden:
    6

    MINA ENHETER

    Om du, som ovan, har en array med char så hanterar du ju i själva verket en sträng, alltså funkar strlen(). Men tänk på att du måste tilldela ett null-tecken i slutet för att den ska se det som en sträng.
    Ex:
    PHP:
    char test[10];

    test[0]='a';
    test[1]='a';
    test[2]='a';
    test[3]='a';
    test[4]='\0'// Finns inte detta med vet inte strlen() när den ska sluta. Denna post räknas inte med.

    // Skriver ut: 4
    printf("%i"strlen(test));
    Man kan också visa arraylängder med sizeof(). Detta funkar även om arrayen inte är av typen char.

    sizeof() kommer däremot att returnera storleken av hela arrayen, inte bara de positioner som är tilldelade.

    PHP:
    int test[10];

    test[0]=1;
    test[1]=2;
    test[2]=3;
    test[3]=4;

    int len sizeof(test) / sizeof(int);

    // Skriver ut: 10
    printf("%i"len);
    Sen går det ju alltid att lösa det på andra sätt, loopar till exempel.