int n = 13; printf("%x", n);Answer := d.
#include <stdio.h> int main(void) { int i = 4; int j = 5; while (i--) if (i % 2) while (j--) printf("%d\n",j); else j = i; return 0; }Make a table with three columns: step number in while loop, value for i and value for j.
Answer: first we reformat the program with proper intendations :
#include <stdio.h> int main(void) { int i = 4; int j = 5; while (i--) if (i % 2) while (j--) printf("%d\n",j); else j = i; return 0; }Even more explicitly, the program reads like
#include <stdio.h> int main(void) { int i = 4; int j = 5; while (i > 0) { i = i-1; if (i % 2 > 0) while (j > 0) { j = j-1; printf("%d\n",j); } else j = i; } return 0; }Now we understand the program better, we make the table with values for i and j :
----------------------------- | step | i | j | print | ----------------------------- | 0 | 4 | 5 | -- | | 1 | 3 | 4 | 4 | | | | 3 | 3 | | | | 2 | 2 | | | | 1 | 1 | | | | 0 | 0 | | 2 | 2 | 2 | -- | | 3 | 1 | 1 | 1 | | 4 | | 0 | 0 | | 5 | 0 | | | -----------------------------
Answer with a while :
int i = 1; int s = 0; while (i <= n) s += i++;Answer with a do :
int i = 0; /* note the difference, n may be zero */ int s = 0; do { s += i++; } while (i <= n);Answer with a for :
int s = 0; int i; for (i = 1; i < n; i++) s += i++;The for loop is most appropriate because we know in advance how many iterations we will need. A while is most general and a do is useful when we know the loop will be executed at least once and our condition to terminate the loop may depend on those first calculations.
Answer: A break is used to leave a loop, while a continue skips all statements in the remained of the loop and continues to evaluate the stop test. Here is an example we have seen in class to compute sum of positive numbers. Negative numbers are ignored and the program leaves when zero is entered.
int n, sum = 0; for (;;) /* infinite loop */ { printf(" Give a number (0 to stop) : "); if (n < 0) { printf("Will ignore negative number.\n"); continue; } else if (n == 0) { printf("Will exit the loop now.\n"); break; } sum += n; }
f(x) = 0 if x < 0, = 1 if x >= 0 and x < 1, = 2 if x >= 1 and x < 2, = 3 otherwisewhere x and f(x) are of type float. Can you use a switch? Explain why you can or cannot.
Answer :
float f ( float x ) { if (x < 0) return 0; else if (x < 1) return 1; else if (x < 2) return 2; else return 3; }A switch is only appropriate for discrete values, here floats can vary continuously, so we cannot enumerate a list of cases.
[jan@galois]% calc 8.2 3 * 24.6 [jan@galois]%Give first a basic version without any control on input or printing of error messages. Then identify what can go wrong and make the program more robust adding extra checks and more user friendly by printing error messages.
Answer (basic version) :
#include<stdio.h> int main(void) { float x,y,z; char op; scanf("%f\n", &x); scanf("%f\n", &y); scanf("%c", &op); switch(op) { case '+': z = x+y; break; case '-': z = x-y; break; case '*': z = x*y; break; case '/': z = x/y; } printf("%f\n", z); return 0; }
int reward ( int outcome, int bet ) /* returns the tokens gained depending on the values of bet and the outcome; returns 0 if the token used to place the bet can be kept, and -1 in all other cases */Give the main program to implement the project.
Answer : Note that a high level structure diagram can help you to write the code.
#include<stdio.h> #include<stdlib.h> #include<time.h> int reward ( int outcome, int bet ); int main(void) { int bal,val,bet,rew; srand(time(NULL)); printf("Give number of available tokens : "); scanf("%d", &bal); while (bal > 0) { printf("Make a bet (<0 to leave) : "); scanf("%d", &bet); if (bet < 0) break; val = rand() % 65; rew = reward(val,bet); bal += rew; printf("Outcome is %d,", val); if (rew > 0) printf(" gained %d token(s),", rew); else if (rew == 0) printf(" token kept,"); else printf(" token lost,"); printf(" balance is %d.\n", bal); } bal--; printf("Ending balance is %d.", bal); if (bal < 0) printf(" Pay the gambling fee.\n"); else printf(" Please play again.\n"); return 0; }