nwinger Skrevet 12. mai 2009 Del Skrevet 12. mai 2009 (endret) Hei, Holder på med en grei C tutorial jeg kom over på nettet. I den forbindelse har jeg fått min første oppgave, som lyder slik: "Assignment: Write a program that repeatedly accepts user input and then prints the numbers between 0 and the entered number. If the user enters a number less than or equal to zero, the program will exit. You now have enough information to figure out all the basic building blocks to make this program happen. You'll have to steal scanf() and printf() usage from previous examples, but the rest of the parts correspond to various statements you've seen in the previous section." Så langt har jeg satt sammen følgende: #include<stdio.h> int main(void) { int num, result = 0; scanf("%d", &num); // Read the number from the keyboard return 0; } Men, trenger å vite hvordan jeg skal gå videre herifra. Regner med jeg trenger en variabel for å hente inputen, eller kan jeg bruke num? Og burde jeg bruke en while-loop for utregningen? Kom gjerne med forslag til kode! Jeg er helt ny på dette. Takk for hjelpen Endret 12. mai 2009 av nwinger Lenke til kommentar
[kami] Skrevet 12. mai 2009 Del Skrevet 12. mai 2009 num inneholder tastetrykket. %d gjør så den leses som et nummer (som er hva du vil) du bor ha en løkke som gjøre noe så lenge inputten er større eller lik 0. do { printf("Skriv et tall: "); scanf("%d", &num); // Read the number from the keyboard } while (num >= 0); det går også an å bruke while, men det blir litt mer knotete: printf("Skriv et tall: "); scanf("%d", &num); // Read the number from the keyboard while (num >= 0) { printf("Skriv et tall: "); scanf("%d", &num); // Read the number from the keyboard } Lenke til kommentar
nwinger Skrevet 12. mai 2009 Forfatter Del Skrevet 12. mai 2009 Takker for rask tilbakemelding! Er jeg inne på noe her? #include<stdio.h> int main(void) { int num, result = 0; printf("Skriv et tall: "); scanf("%d", &num); // Read the number from the keyboard while (num > 0) { printf("%d\n", num); i--; } return 0; } Lenke til kommentar
LostOblivion Skrevet 12. mai 2009 Del Skrevet 12. mai 2009 (endret) Noe galt skjedde her... :S Endret 12. mai 2009 av LostOblivion Lenke til kommentar
LostOblivion Skrevet 12. mai 2009 Del Skrevet 12. mai 2009 Nå vil du skrive inn tallet én gang, og så skrive ut det tallet n ganger. Du må plassere scanf inni loopen, slik at den spør det om et tall i hver loop. #include int main() { int num; do { printf("Enter a number: "); scanf("%d", &num); } while (num > 0); return 0; } Lenke til kommentar
nwinger Skrevet 12. mai 2009 Forfatter Del Skrevet 12. mai 2009 Takk igjen for svar og hjelp Falt på denne løsningen: int main() { int printnum, usernum = 1; while (usernum > 0) { printf(">"); scanf("%d", &usernum); // Read usernum from the keyboard printnum = usernum - 1; // Reset printnum while (printnum > 0) { printf("%d\n", printnum); printnum--; } } return 0; } Lenke til kommentar
[kami] Skrevet 13. mai 2009 Del Skrevet 13. mai 2009 om du vil at løkka skal gå minst èn gang, så er det mest oversiktelig å bruke do {} while(), fordi denne løkka alltid går minst èn gang. En ren while løkke trenger ikke kjøre i det hele tatt. feks: int number; printf("Skriv et tall mellom 1 og 10: "); scanf("%d", &number); while (number > 10 || number <1) { prinf("ugyldig input! Tallet må være mellom 1 og 10"); scanf("%d", &number); } Her vil den altså ikke gå inn i løkka om man skriver rikgit første gangen. Og man kan bruke den som en slags "evig if" helt til inputten blir det man vil. Lenke til kommentar
GeirGrusom Skrevet 13. mai 2009 Del Skrevet 13. mai 2009 int main() { int readnum, counter; scanf("%d", &readnum); if(readnum > 0) for(counter = 1; counter <= readnum; counter++) printf("%d\n", counter); else printf("The number entered must be greater than zero."); return 0; } Trenger det være vanskeligere? Lenke til kommentar
[kami] Skrevet 13. mai 2009 Del Skrevet 13. mai 2009 Write a program that repeatedly accepts user input and then prints the numbers between 0 and the entered number. If the user enters a number less than or equal to zero, the program will exit. http://www.dlevel.com/blogs/alex/29/images...development.jpg Lenke til kommentar
GeirGrusom Skrevet 13. mai 2009 Del Skrevet 13. mai 2009 Ah skjønner. int ReadNumber() { int num; scanf("%d", &num); return num; } int main() { int readnum, counter; while(0 < (readnum = ReadNumber())) for(counter = 1; counter <= readnum; counter++) printf("%d\n", counter); return 0; } Så ikke repeatedly. Lenke til kommentar
kernel Skrevet 18. mai 2009 Del Skrevet 18. mai 2009 Advarsel: scanf() er ikke anbefalt å bruke for nybegynnere, i det minste må man sjekke returverdi. Lenke til kommentar
GeirGrusom Skrevet 18. mai 2009 Del Skrevet 18. mai 2009 (endret) Hvor mye valg har en egentlig i C? Og det eneste den krever, er at en forstår pekere. Endret 18. mai 2009 av GeirGrusom Lenke til kommentar
kernel Skrevet 18. mai 2009 Del Skrevet 18. mai 2009 Hvor mye valg har en egentlig i C? Og det eneste den krever, er at en forstår pekere. Skjønner du hva denne koden gjør: n = scanf("%10[^\n]%*[^\n]", s); ? Det er mange input funksjoner i C, hvor scanf() er en av de mest kompliserte funksjonene i standard biblioteket, og brukes dermed ofte feil. Det enkleste måten å lese inn et tall riktig og robust på, er via funksjonene fgets() og strtol(). Lenke til kommentar
GeirGrusom Skrevet 18. mai 2009 Del Skrevet 18. mai 2009 Det enkleste måten å lese inn et tall riktig og robust på, er via funksjonene fgets() og strtol(). Noe som er akkurat det scanf gjør i praksis. Eneste som er viktig er å ha datatypestørrelsene i hodet, og ikke gå vill i pekere. Lenke til kommentar
kernel Skrevet 19. mai 2009 Del Skrevet 19. mai 2009 Det enkleste måten å lese inn et tall riktig og robust på, er via funksjonene fgets() og strtol(). Noe som er akkurat det scanf gjør i praksis. Eneste som er viktig er å ha datatypestørrelsene i hodet, og ikke gå vill i pekere. Nei og nei, dette er FAQ, se C FAQ 12.20: http://www.it.usyd.edu.au/~dasymond/mirror...scanfprobs.html Lenke til kommentar
GeirGrusom Skrevet 19. mai 2009 Del Skrevet 19. mai 2009 (endret) http://msdn.microsoft.com/en-us/library/w40768et(VS.80).aspx I Visual C++ er det en egen funksjon som skal rette på dette. Dessuten så er det ikke noe reelt problem for de fleste. Scanf fungerer fint så lenge du vet hva du driver med. Du vil få samme problemer med fgets og strtol, hvis ikke bufferet er stort nok, kan du fortsatt få buffer overflow. Å foreslå at nybegynnere skal bruke fgets og lignende når scanf er mye enklere å bruke er idiotisk. scanf er en funksjon nesten bare har en nytte innenfor C tutorials. Hvor ofte brukes slike funksjoner i virkelige programmer? aldri til nesten aldri? Endret 19. mai 2009 av GeirGrusom Lenke til kommentar
kernel Skrevet 19. mai 2009 Del Skrevet 19. mai 2009 Å foreslå at nybegynnere skal bruke fgets og lignende når scanf er mye enklere å bruke er idiotisk. C FAQ'en holder høyt faglig nivå til din informasjon. Når det gjelder scanf_s(), så er ikke dette en standard C funksjon, men finnes kun spesifisert i TR 24731. Kanskje blir dette en del av neste C standarden C1X, men det er ikke sikkert. Microsoft har ennå ikke implementert C99, og hvor godt de har implementert TR 24731 vet jeg ikke, bl.a, hadde jeg kritikk til utkastet fra Microsoft som Plauger sa seg enig i, og som kom med i TR 24731. Dvs. Microsoft's TR forslag ble ikke godtatt uten endringer, og etter det jeg husker så har scanf_s() familien av funksjoner, det samme problemet med "%d" overflow (ref. Keith's post i comp.std.c tråden Undefined behavior for *scanf with "%d" ): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1146.pdf så hvis scanf_s() kommer med i C1X, må ytterligere endringer påregnes. Buffer overflow problematikk gjelder scanf() med "%s", og dette har ingenting med problemene jeg tenker på. Løsningen er altså å bruke C89 funksjonene fgets() og strtol(), og kun benytte scanf() i bruk-og-kast programmer, Lenke til kommentar
GeirGrusom Skrevet 21. mai 2009 Del Skrevet 21. mai 2009 Hehe dette kan du skjønner jeg ^^ Vel, for meg er scanf funksjonen temmelig unyttig i et virkelig program allikevel For nybegynnere synes jeg ikke at dette er noe en burde trenge å tenke på. Lenke til kommentar
kernel Skrevet 26. mai 2009 Del Skrevet 26. mai 2009 For nybegynnere synes jeg ikke at dette er noe en burde trenge å tenke på. Det finnes smarte nybegynnere, og hvis de ikke lærer seg å skrive korrekt og robust kode tidlig, så er sannsynligheten høy for at ett jobb intervju med undertegnede i det minste, kan bli svært ubehagelig. Det er helt utrolig hvordan enkelte skryter i CV'en, og tror de kan slippe unna med under faglig utsjekking på jobb intervju. Lenke til kommentar
AMajor Skrevet 3. juli 2009 Del Skrevet 3. juli 2009 ingen som har foreslått _getch()? kanskje det er sikrere for en nybegynner: http://msdn.microsoft.com/en-us/library/078sfkak(VS.80).aspx Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå