Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2016-09-20, 16:12
  #1
Medlem
Hej

jag vill skriva ett program där jag ber användaren stoppa in 10st nummer i en array men när han/hon skriver 0 så ska den hoppa ut från loopen. Siffrorna inmatade ska inte försvinna.

Kod:
#include <stdio.h>

int main(void)
{  
    int arrayTable[9], min, max, i;
    float avg;
    
    for (i=0; i<10; i++)
    {
        printf("Enter Measurement #%i (or 0): ", i);
        scanf("%d", &arrayTable[i]);
    }  
    return 0;
}

Hur skall man skriva?
Citera
2016-09-20, 16:16
  #2
Medlem
svallerbyttans avatar
Du kan använda break för att hoppa ur en loop.
https://msdn.microsoft.com/en-us/library/37zc9d2w.aspx
__________________
Senast redigerad av svallerbyttan 2016-09-20 kl. 16:20.
Citera
2016-09-20, 19:22
  #3
Medlem
Citat:
Ursprungligen postat av svallerbyttan
Du kan använda break för att hoppa ur en loop.
https://msdn.microsoft.com/en-us/library/37zc9d2w.aspx


tack får det att hoppa ut loopen nu med 0. Men 0:an sparas också i arrayn vilket jag inte vill. Har du tips på hur jag kan lösa det?
Citera
2016-09-20, 20:47
  #4
Medlem
christerys avatar
Citat:
Ursprungligen postat av TenTen
tack får det att hoppa ut loopen nu med 0. Men 0:an sparas också i arrayn vilket jag inte vill. Har du tips på hur jag kan lösa det?
Använd bara fram till i-1
Citera
2016-09-21, 04:05
  #5
Medlem
Citat:
Ursprungligen postat av TenTen
Hej

jag vill skriva ett program där jag ber användaren stoppa in 10st nummer i en array men när han/hon skriver 0 så ska den hoppa ut från loopen. Siffrorna inmatade ska inte försvinna.

Kod:
#include <stdio.h>

int main(void)
{  
    int arrayTable[9], min, max, i;
    float avg;
    
    for (i=0; i<10; i++)
    {
        printf("Enter Measurement #%i (or 0): ", i);
        scanf("%d", &arrayTable[i]);
    }  
    return 0;
}

Hur skall man skriva?

Tex så här:

Kod:
#include <stdio.h>

int main(void)
{  
    int arrayTable[9], min, max, i, result = 0;
    float avg;
    
    for (i=0; i<10; i++)
    {
        printf("Enter Measurement #%i (or 0): ", i);
        scanf("%d", result);
        if (result == 0)
            break; /* Eller typ return 0;, dvs pre-terminating loopen genom att avsluta funktionen */
        arrayTable[i] = result;
    }  
    return 0;
}

Eller tex så här:

Kod:
#include <stdio.h>

int main(void)
{  
    int arrayTable[9], min, max, i, result = 0;
    float avg;
    
    for (i=0; i<10; i++)
    {
        printf("Enter Measurement #%i (or 0): ", i);
        scanf("%d", result);
        if (result == 0)
            i = 10; /* Pre-terminating loopar genom att ändra index så att loopens avbrottsvillkor */     
                       /* uppfylls  - OBS - se nedan fotnot */
        else
            arrayTable[i] = result;
    }  
    return 0;
}


Fotnot. Sådan pre-terminering av loopar genom att ändra index till att ligga på ett värde som medför att avbrottsvillkoret/avbrottsvillkoren uppfylls omedelbart anses vara dålig programmeringsteknik eftersom den metoden gör det svårt att leta buggar som beror på denna metod, det är en dålig vana. Men det var vanligt förr att man gjorde så,

Man bör inte ändra index med index++ inne i loopen utan det är bättre det står sist i for statementet. Anledningen är att det annars är svårt att följa och debugga koden, i synnerhet om det finns fler än ett index osv.

Måste man avbryta loopar prematurt så rekommenderas det bättre att använda flaggor (tex bool) istället, då blir koden lättare att följa.

OBS din arrayTable[9] ska du deklarera som arrayTable[10], du har 10 element,, men deklarerar bara 9

Lycka till !!
Citera
2016-09-21, 10:34
  #6
Medlem
Citat:
Ursprungligen postat av DrSvenne
Tex så här:

Kod:
#include <stdio.h>

int main(void)
{  
    int arrayTable[9], min, max, i, result = 0;
    float avg;
    
    for (i=0; i<10; i++)
    {
        printf("Enter Measurement #%i (or 0): ", i);
        scanf("%d", result);
        if (result == 0)
            break; /* Eller typ return 0;, dvs pre-terminating loopen genom att avsluta funktionen */
        arrayTable[i] = result;
    }  
    return 0;
}

Eller tex så här:

Kod:
#include <stdio.h>

int main(void)
{  
    int arrayTable[9], min, max, i, result = 0;
    float avg;
    
    for (i=0; i<10; i++)
    {
        printf("Enter Measurement #%i (or 0): ", i);
        scanf("%d", result);
        if (result == 0)
            i = 10; /* Pre-terminating loopar genom att ändra index så att loopens avbrottsvillkor */     
                       /* uppfylls  - OBS - se nedan fotnot */
        else
            arrayTable[i] = result;
    }  
    return 0;
}


Fotnot. Sådan pre-terminering av loopar genom att ändra index till att ligga på ett värde som medför att avbrottsvillkoret/avbrottsvillkoren uppfylls omedelbart anses vara dålig programmeringsteknik eftersom den metoden gör det svårt att leta buggar som beror på denna metod, det är en dålig vana. Men det var vanligt förr att man gjorde så,

Man bör inte ändra index med index++ inne i loopen utan det är bättre det står sist i for statementet. Anledningen är att det annars är svårt att följa och debugga koden, i synnerhet om det finns fler än ett index osv.

Måste man avbryta loopar prematurt så rekommenderas det bättre att använda flaggor (tex bool) istället, då blir koden lättare att följa.

OBS din arrayTable[9] ska du deklarera som arrayTable[10], du har 10 element,, men deklarerar bara 9

Lycka till !!


tack!

Jag gjorde något i stil med detta

Kod:
    

#include <stdio.h>
int main(void)
{

int arrayTable[10] = {0}; // turn this into function
    int iValue = 0;
    int i = 0;
    
    while(i < 10)
    {
        printf("Enter Measurement #%i (or 0): ", i+1);
        scanf("%d", &iValue); // input iValue
        
        if (!iValue) // if iValue is zero then exit loop without affecting array with this value
            break;
        else
        {
            arrayTable[i] = iValue; // if the value is non-zero store it in array and continue
            i++;
        }
    }
    return 0;
}


Jag vill göra om hela arrayn till en function så jag kan anropa den flera gånger. Hur gör man det? Är det void eller int man ska deklarera den?
Citera
2016-09-21, 12:02
  #7
Moderator
Protons avatar
Citat:
Ursprungligen postat av TenTen
tack!

Jag gjorde något i stil med detta

Kod:
    

#include <stdio.h>
int main(void)
{

int arrayTable[10] = {0}; // turn this into function
    int iValue = 0;
    int i = 0;
    
    while(i < 10)
    {
        printf("Enter Measurement #%i (or 0): ", i+1);
        scanf("%d", &iValue); // input iValue
        
        if (!iValue) // if iValue is zero then exit loop without affecting array with this value
            break;
        else
        {
            arrayTable[i] = iValue; // if the value is non-zero store it in array and continue
            i++;
        }
    }
    return 0;
}


Jag vill göra om hela arrayn till en function så jag kan anropa den flera gånger. Hur gör man det? Är det void eller int man ska deklarera den?
Ska du returnera något från funktionen? Om nej ska void användas. Om ja måste du avgöra vad som ska returneras från funktionen och sedan deklarera den att returnera detta något.

Dessutom undrar jag varför du inte använder en while, eller för den delen lägger in ett till villkor i ditt termineringsvillkor i loopen? Är inte det snyggare än att använda break?
Citera
2016-09-21, 14:28
  #8
Medlem
christerys avatar
Lite fånigt av mig, men skall man nu ha med ett sätt till för att hoppa ur en loop så funkar goto.
Aldrig använt det men det skall tydligen finnas.

Från MSDN
Kod:
// goto.c
#include <stdio.h>

int main()
{
    
int ij;

    for ( 
010i++ )
    {
        
printf_s"Outer loop executing. i = %d\n");
        for ( 
03j++ )
        {
            
printf_s" Inner loop executing. j = %d\n");
            if ( 
== )
                goto 
stop;
        }
    }

    
/* This message does not print: */
    
printf_s"Loop exited. i = %d\n");

    
stopprintf_s"Jumped to stop. i = %d\n");


Normalt sett anvädns for om man vet antalet reps och while om man inte gör det.
Citera
2016-09-22, 09:29
  #9
Medlem
enowens avatar
Citat:
Ursprungligen postat av christery
Lite fånigt av mig, men skall man nu ha med ett sätt till för att hoppa ur en loop så funkar goto.
Aldrig använt det men det skall tydligen finnas.

Från MSDN
Kod:
// goto.c
#include <stdio.h>

int main()
{
    
int ij;

    for ( 
010i++ )
    {
        
printf_s"Outer loop executing. i = %d\n");
        for ( 
03j++ )
        {
            
printf_s" Inner loop executing. j = %d\n");
            if ( 
== )
                goto 
stop;
        }
    }

    
/* This message does not print: */
    
printf_s"Loop exited. i = %d\n");

    
stopprintf_s"Jumped to stop. i = %d\n");


Normalt sett anvädns for om man vet antalet reps och while om man inte gör det.

Sluta föreslå sånt här skit.
Citera
2016-09-22, 09:56
  #10
Medlem
christerys avatar
Citat:
Ursprungligen postat av enowen
Sluta föreslå sånt här skit.
Föreslog det inte, påpekade att det finns. Break använder jag i switch/case men inte i loopar heller.

Fan vad du var snarstucken, tror goto har funnits med sen K&R så det är inte jag som hittat på det.
Citera
2016-09-23, 07:18
  #11
Medlem
Citat:
Ursprungligen postat av christery
Föreslog det inte, påpekade att det finns. Break använder jag i switch/case men inte i loopar heller.

Fan vad du var snarstucken, tror goto har funnits med sen K&R så det är inte jag som hittat på det.

Ja, och man bör alltid komma ihåg att sätta break efter varje case statement i en switch, Switch har annars som default (förutbestämt) beteende att exekveras på fall-through sättet.

Ja, jo goto hör till en äldre programmeringsteknik, som tex i Algol, FORTRAN 77 mfl,
syntaxen är goto <label>; Med hjälp av goto kan man konstruera vedervärdiga styggelser till programkod som ingen kan förstå. Jag kan nog påstå att de flesta kompilatorer för C klarar ej av att varna om möjliga oändliga loopar ifall man använder goto.

goto togs antagligen med i C för att man skulle kunna översätta gammal kod i något äldre språk till C utan att behöva göra många ändringar. goto användes innan måsvingarna (engelska curly brackets) fanns, eller tex i Simula där blocken inneslutes mellan BEGIN och END,

Här är ett exempel på en oändlig loop i C:

Kod:
int i = 0;

label: i++;
goto label;

goto i loopar liksom break eller continue eller return kan i vissa fall medföra att man sparar några CPU-cykler jämfört med att skriva en traditionell loop. goto svarar i assembler mot jmp instruktionen och om man använder gotos i C så blir koden mer snarlik den assembler kod som genererats

goto i C har faktiskt använts på assembler studiekurser för att skriva program i C som sen har kompilerats till assemblerkod, man har sedan studerat hur man gör ändringar i koden och vad som då händer. Mycket lärorikt faktiskt.

Break bör bara användas inne i typ loopar eller i switchar annars har det ibland ingen effekt alls, tex i följande kod har break ingen verkan alls, (ska inte ha iallafall):

Kod:
int main(void)
{  
        printf("Hello World !! ");
        break;
        printf("Hello World !! ");
        break;
        printf("Hello World !! ");
        break;
        return 0;
}

Detta på grund av att vi redan är på den högsta nivåen av curly-brackets, måsvingarna, break kan alltså inte medföra ett hopp ur main.

Det finns en del olika skolor om break och debugging, de flesta menar att break statementet ska stå på en egen rad för att underlätta för debuggern, att man verkligen ser återhoppet.

enowen är i sin fulla rätt att känna sig snarstucken när gotos förs på tal,
---goto är väl det största tabuet sedan kunskapens träd i Edens lustgård, skulle jag tro ?

Man menar att goto är tabu, a very big NO-NO, aja-baja eftersom sådana program blir svåra att ändra i och att det inte uppmuntrar tilll att skriva mera strukturerad kod. Goto finns dock kvar utav den anledningen att C ska vara bakåtkompatibelt mot äldre kod.

Felstavade labels var en annan anledning till att goto avskyddes, om en label stavas fel i koden så varnar i regel inte kompilatorn för detta, utan den som ska testköra koden sen ser inte anledningen till att hoppet inte genomförs, och det kan då bli otroligt svårfunna buggar om det är många labels och gotos.
Citera
2016-09-23, 09:09
  #12
Medlem
christerys avatar
Trodde vi var mer inne på hur man kan avbryta en loop än vad som är vettigt då svaret redan var givet, och det finns flera sätt att göra det på. Vissa är inte så snygga, men bryter inte mot C däremot vad man (jag) förväntar mig i koden.

Min mening var inte att argumentera för nånting mer att påtala vad som finns. Samma med mitt förslag om i-1 som fungerar om den breakar ur men går den färdigt så tappar man ett värde i alla fall.

Man skall väl tänka lite själv åxå kan jag tycka. Antar att frågan kommer ifrån en som försöker lära sig språket och då är det väl inte mer än vettigt att göra misstagen nu.

Ingen som reagerade på att nån påtalade att [9] tydligen var för lite, jag anser att 0.1.2.3.... 9 blir 10 värden men det var det ingen som högg på.

Har som sagt inte använt goto alls i C men i basic så var det välanvänt och skapade spaghettikod av oanade proportioner, globala variabler likaså.

Så hugga på att jag påtalar en annan lösning istället för att använda en while och sen hoppa ur den på nåt märkligt sätt som andra åxå beskrivit blir ju bara märkligt. Den möjligheten finns.
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback