Gå til innhold

Trenger litt hjelp i basic C programmering.


Anbefalte innlegg

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 av nwinger
Lenke til kommentar
Videoannonse
Annonse

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

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

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

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

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
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

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 av GeirGrusom
Lenke til kommentar
Å 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
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
  • 1 måned senere...

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...