Chapter 2
PE 2-1
#include <stdio.h>
int main(void)
{
printf("Anton Bruckner\n");
printf("Anton\nBruckner\n");
printf("Anton ");
printf("Bruckner\n");
return 0;
}
PE 2-3
#include <stdio.h>
int main(void)
{
int ageyears;
int agedays;
ageyears = 44;
agedays = 365 * ageyears;
printf("An age of %d years is %d days.\n", ageyears, agedays);
return 0;
}
PE 2-4
#include <stdio.h>
void jolly(void);
void deny(void);
int main(void)
{
jolly();
jolly();
jolly();
deny();
return 0;
}
void jolly(void)
{
printf("For he's a jolly good fellow!\n");
}
void deny(void)
{
printf("Which nobody can deny!\n");
}
PE 2-5
#include <stdio.h>
int main(void)
{
int toes;
toes = 10;
printf("toes = %d\n", toes);
printf("Twice toes = %d\n", 2 * toes);
printf("toes squared = %d\n", toes * toes);
return 0;
}
PE 2-7
#include <stdio.h>
void one_three(void);
void two(void);
int main(void)
{
printf("starting now:\n");
one_three();
printf("done!\n");
return 0;
}
void one_three(void)
{
printf("one\n");
two();
printf("three\n");
}
void two(void)
{
printf("two\n");
}
Chapter 3
PE 3-2
#include <stdio.h>
int main(void)
{
int ascii;
printf("Enter an ASCII code: ");
scanf("%d", &ascii);
printf("%d is the ASCII code for %c.\n", ascii, ascii);
return 0;
}
PE 3-4
#include <stdio.h>
int main(void)
{
float num;
printf("Enter a floating-point value: ");
scanf("%f", &num);
printf("fixed-point notation: %f\n", num);
printf("exponential notation: %e\n", num);
return 0;
}
PE 3-6
#include <stdio.h>
int main(void)
{
float mass_mol = 3.0e-23;
float mass_qt = 950;
float quarts;
float molecules;
printf("Enter the number of quarts of water: ");
scanf("%f", &quarts);
molecules = quarts * mass_qt / mass_mol;
printf("%f quarts of water contain %e molecules.\n", quarts,
molecules);
return 0;
}
Chapter 4
PE 4-1
#include <stdio.h>
int main(void)
{
char fname[40];
char lname[40];
printf("Enter your first name: ");
scanf("%s", fname);
printf("Enter your last name: ");
scanf("%s", lname);
printf("%s, %s\n", lname, fname);
return 0;
}
PE 4-4
#include <stdio.h>
int main(void)
{
float height;
char name[40];
printf("Enter your height in inches: ");
scanf("%f", &height);
printf("Enter your name: ");
scanf("%s", name);
printf("%s, you are %.3f feet tall\n", name, height / 12.0);
return 0;
}
PE 4-6
#include <stdio.h>
#include <float.h>
int main(void)
{
float ot_f = 1.0 / 3.0;
double ot_d = 1.0 / 3.0;
printf(" float values: ");
printf("%.4f %.12f %.16f\n", ot_f, ot_f, ot_f);
printf("double values: ");
printf("%.4f %.12f %.16f\n", ot_d, ot_d, ot_d);
printf("FLT_DIG: %d\n", FLT_DIG);
printf("DBL_DIG: %d\n", DBL_DIG);
return 0;
}
Chapter 5
PE 5-1
#include <stdio.h>
int main(void)
{
const int minperhour = 60;
int minutes, hours, mins;
printf("Enter the number of minutes to convert: ");
scanf("%d", &minutes);
while (minutes > 0 )
{
hours = minutes / minperhour;
mins = minutes % minperhour;
printf("%d minutes = %d hours, %d minutes\n", minutes, hours, mins);
printf("Enter next minutes value (0 to quit): ");
scanf("%d", &minutes);
}
printf("Bye\n");
return 0;
}
PE 5-3
#include <stdio.h>
int main(void)
{
const int daysperweek = 7;
int days, weeks, day_rem;
printf("Enter the number of days: ");
scanf("%d", &days);
weeks = days / daysperweek;
day_rem = days % daysperweek;
printf("%d days are %d weeks and %d days.\n", days, weeks, day_rem);
return 0;
}
PE 5-5
#include <stdio.h>
int main(void)
{
int count, sum;
int n;
printf("Enter the upper limit: ");
scanf("%d", &n);
count = 0;
sum = 0;
while (count++ < n)
sum = sum + count;
printf("sum = %d\n", sum);
return 0;
}
PE 5-7
#include <stdio.h>
void showCube(double x);
int main(void)
{
double val;
printf("Enter a floating-point value: ");
scanf("%lf", &val);
showCube(val);
return 0;
}
void showCube(double x)
{
printf("The cube of %e is %e.\n", x, x*x*x );
}
Chapter 6
PE 6-1
#include <stdio.h>
#define SIZE 26
int main( void )
{
char lcase[SIZE];
int i;
for (i = 0; i < SIZE; i++)
lcase[i] = 'a' + i;
for (i = 0; i < SIZE; i++)
printf("%c", lcase[i]);
printf("\n");
return 0;
}
PE 6-3
#include <stdio.h>
int main( void )
{
char let = 'F';
char start;
char end;
for (end = let; end >= 'A'; end--)
{
for (start = let; start >= end; start--)
printf("%c", start);
printf("\n");
}
return 0;
}
PE 6-5
#include <stdio.h>
int main( void )
{
int lower, upper, index;
int square, cube;
printf("Enter starting integer: ");
scanf("%d", &lower);
printf("Enter ending integer: ");
scanf("%d", &upper);
printf("%5s s s\n", "num", "square", "cube");
for (index = lower; index <= upper; index++)
{
square = index * index;
cube = index * square;
printf("] d d\n", index, square, cube);
}
return 0;
}
PE 6-7
#include <stdio.h>
int main( void )
{
double n, m;
double res;
printf("Enter a pair of numbers: ");
while (scanf("%lf %lf", &n, &m) == 2)
{
res = (n - m) / (n * m);
printf("(%.3g - %.3g)/(%.3g*%.3g) = %.5g\n", n, m, n, m, res);
printf("Enter next pair (non-numeric to quit): ");
}
return 0;
}
PE 6-10
#include <stdio.h>
#define SIZE 8
int main( void )
{
int vals[SIZE];
int i;
printf("Please enter %d integers.\n", SIZE);
for (i = 0; i < SIZE; i++)
scanf("%d", &vals[i]);
printf("Here, in reverse order, are the values you entered:\n");
for (i = SIZE - 1; i > 0; i--)
printf("%d ", vals[i]);
printf("\n");
return 0;
}
PE 6-12
#include <stdio.h>
#define SIZE 8
int main( void )
{
int twopows[SIZE];
int i;
int value = 1;
for (i = 0; i < SIZE; i++)
{
twopows[i] = value;
value *= 2;
}
i = 0;
do
{
printf("%d ", twopows[i]);
i++;
} while (i < SIZE);
printf("\n");
return 0;
}
PE 6-13
#include <stdio.h>
#define SIZE 8
int main(void)
{
double arr[SIZE];
double arr_cumul[SIZE];
int i;
printf("Enter %d numbers:\n", SIZE);
for (i = 0; i < SIZE; i++)
{
printf("value #%d: ", i + 1);
scanf("%lf", &arr[i]);
}
arr_cumul[0] = arr[0];
for (i = 1; i < SIZE; i++)
arr_cumul[i] = arr_cumul[i-1] + arr[i];
for (i = 0; i < SIZE; i++)
printf("%8g ", arr[i]);
printf("\n");
for (i = 0; i < SIZE; i++)
printf("%8g ", arr_cumul[i]);
printf("\n");
return 0;
}
PE 6-15
#include <stdio.h>
#define RATE_SIMP 0.10
#define RATE_COMP 0.05
#define INIT_AMT 100.0
int main( void )
{
double daphne = INIT_AMT;
double deidre = INIT_AMT;
int years = 0;
while (deidre <= daphne)
{
daphne += RATE_SIMP * INIT_AMT;
deidre += RATE_COMP * deidre;
++years;
}
printf("Investment values after %d years:\n", years);
printf("Daphne: $%.2f\n", daphne);
printf("Deidre: $%.2f\n", deidre);
return 0;
}
Chapter 7
PE 7-1
#include <stdio.h>
int main(void)
{
char ch;
int sp_ct = 0;
int nl_ct = 0;
int other = 0;
while ((ch = getchar()) != '#')
{
if (ch == ' ')
sp_ct++;
else if (ch == '\n')
nl_ct++;
else
other++;
}
printf("spaces: %d, newlines: %d, others: %d\n", sp_ct, nl_ct, other);
return 0;
}
PE 7-3
#include <stdio.h>
int main(void)
{
int n;
double sumeven = 0.0;
int ct_even = 0;
double sumodd = 0.0;
int ct_odd = 0;
while (scanf("%d", &n) == 1 && n != 0)
{
if (n % 2 == 1)
{
sumodd += n;
++ct_odd;
}
else
{
sumeven += n;
++ct_even;
}
}
printf("Number of evens: %d", ct_even);
if (ct_even > 0)
printf(" average: %g", sumeven / ct_even);
putchar('\n');
printf("Number of odds: %d", ct_odd);
if (ct_odd > 0)
printf(" average: %g", sumodd / ct_odd);
putchar('\n');
printf("\ndone\n");
return 0;
}
PE 7-5
#include <stdio.h>
int main(void)
{
char ch;
int ct1 = 0;
int ct2 = 0;
while ((ch = getchar()) != '#')
{
switch(ch)
{
case '.' : putchar('!');
++ct1;
break;
case '!' : putchar('!');
putchar('!');
++ct2;
break;
default :putchar(ch);
}
}
printf("%d replacements of . with !\n", ct1);
printf("%d replacements of ! with !!\n", ct2);
return 0;
}
PE 7-7
#include <stdio.h>
#define BASEPAY 10
#define BASEHRS 40
#define OVERTIME 1.5
#define AMT1 300
#define AMT2 150
#define RATE1 0.15
#define RATE2 0.20
#define RATE3 0.25
int main(void)
{
double hours;
double gross;
double net;
double taxes;
printf("Enter the number of hours worked this week: ");
scanf("%lf", &hours);
if (hours <= BASEHRS)
gross = hours * BASEPAY;
else
gross = BASEHRS * BASEPAY + (hours - BASEHRS) * BASEPAY * OVERTIME;
if (gross <= AMT1)
taxes = gross * RATE1;
else if (gross <= AMT1 + AMT2)
taxes = AMT1 * RATE1 + (gross - AMT1) * RATE2;
else
taxes = AMT1 * RATE1 + AMT2 * RATE2 + (gross - AMT1 - AMT2) * RATE3;
net = gross - taxes;
printf("gross: $%.2f; taxes: $%.2f; net: $%.2f\n", gross, taxes, net);
return 0;
}
PE 7-9
#include <stdio.h>
#define NO 0
#define YES 1
int main(void)
{
long num;
long div;
long lim;
int prime;
printf("Please enter limit to values to be checked; ");
printf("Enter q to quit.\n");
while (scanf("%ld", &lim) == 1 && lim > 0)
{
for (num = 2; num <= lim; num++)
{
for (div = 2, prime = YES; (div * div) <= num; div++)
if (num % div == 0)
prime = NO;
if (prime == YES)
printf("%ld is prime.\n", num);
}
printf("Please enter another limit; ");
printf("Enter q to quit.\n");
}
return 0;
}
PE 7-11
#include <stdio.h>
#include <ctype.h>
int main(void)
{
const double price_artichokes = 1.25;
const double price_beets = 0.65;
const double price_carrots = 0.89;
const double DISCOUNT_RATE = 0.05;
char ch;
double lb_artichokes;
double lb_beets;
double lb_carrots;
double lb_total;
double cost_artichokes;
double cost_beets;
double cost_carrots;
double cost_total;
double final_total;
double discount;
double shipping;
printf("Enter a to buy artichokes, b for beets, ");
printf("c for carrots, q to quit: ");
while ((ch = getchar()) != 'q' && ch != 'Q')
{
if (ch == '\n')
continue;
while (getchar() != '\n')
continue;
ch = tolower(ch);
switch (ch)
{
case 'a' : printf("Enter pounds of artichokes: ");
scanf("%lf", &lb_artichokes);
break;
case 'b' : printf("Enter pounds of beets: ");
scanf("%lf", &lb_beets);
break;
case 'c' : printf("Enter pounds of carrots: ");
scanf("%lf", &lb_carrots);
break;
default : printf("%c is not a valid choice.\n");
}
printf("Enter a to buy artichokes, b for beets, ");
printf("c for carrots, q to quit: ");
}
cost_artichokes = price_artichokes * lb_artichokes;
cost_beets = price_beets * lb_beets;
cost_carrots = price_carrots * lb_carrots;
cost_total = cost_artichokes + cost_beets + cost_carrots;
lb_total = lb_artichokes + lb_beets + lb_carrots;
if (lb_total <= 0)
shipping = 0.0;
else if (lb_total < 5.0)
shipping = 3.50;
else if (lb_total < 20)
shipping = 10.0;
else
shipping = 8.0 + 0.1 * lb_total;
if (cost_total > 100.0)
discount = DISCOUNT_RATE * cost_total;
else
discount = 0.0;
final_total = cost_total + shipping - discount;
printf("Your order:\n");
printf("%.2f lbs of artichokes at $%.2f per pound:$ %.2f\n",
lb_artichokes, price_artichokes, cost_artichokes);
printf("%.2f lbs of beets at $%.2f per pound: $%.2f\n",
lb_beets, price_beets, cost_beets);
printf("%.2f lbs of carrots at $%.2f per pound: $%.2f\n",
lb_carrots, price_carrots, cost_carrots);
printf("Total cost of vegetables: $%.2f\n", cost_total);
if (cost_total > 100)
printf("Volume discount: $%.2f\n", discount);
printf("Shipping: $%.2f\n", shipping);
printf("Total charges: $%.2f\n", final_total);
return 0;
}
Chapter 8
PE 8-1
#include <stdio.h>
int main(void)
{
int ch;
int ct = 0;
while ((ch = getchar()) != EOF)
ct++;
printf("%d characters read\n", ct);
return 0;
}
PE 8-3
#include <stdio.h>
#include <ctype.h>
int main(void)
{
int ch;
int uct = 0;
int lct = 0;
while ((ch = getchar()) != EOF)
if (isupper(ch))
uct++;
else if (islower(ch))
lct++;
printf("%d uppercase characters read\n", uct);
printf("%d lowercase characters read\n", lct);
return 0;
}
PE 8-5
#include <stdio.h>
#include <ctype.h>
int main(void)
{
int high = 100;
int low = 1;
int guess = (high + low) / 2;
char response;
printf("Pick an integer from 1 to 100. I will try to guess ");
printf("it.\nRespond with a y if my guess is right, with");
printf("\na h if it is high, and with an l if it is low.\n");
printf("Uh...is your number %d?\n", guess);
while ((response = getchar()) != 'y')
{
if (response == '\n')
continue;
if (response != 'h' && response != 'l')
{
printf("I don't understand that response. Please enter h for\n");
printf("high, l for low, or y for correct.\n");
continue;
}
if (response == 'h')
high = guess - 1;
else if (response == 'l')
low = guess + 1;
guess = (high + low) / 2;
printf("Well, then, is it %d?\n", guess);
}
printf("I knew I could do it!\n");
return 0;
}
PE 8-7
#include <stdio.h>
#include <ctype.h>
#define BASEPAY1 8.75
#define BASEPAY2 9.33
#define BASEPAY3 10.00
#define BASEPAY4 11.20
#define BASEHRS 40
#define OVERTIME 1.5
#define AMT1 300
#define AMT2 150
#define RATE1 0.15
#define RATE2 0.20
#define RATE3 0.25
int getfirst(void);
void menu(void);
int main(void)
{
double hours;
double gross;
double net;
double taxes;
double pay;
char response;
menu();
while ((response = getfirst()) != 'q')
{
if (response == '\n')
continue;
response = tolower(response);
switch (response)
{
case 'a' : pay = BASEPAY1; break;
case 'b' : pay = BASEPAY2; break;
case 'c' : pay = BASEPAY3; break;
case 'd' : pay = BASEPAY4; break;
default : printf("Please enter a, b, c, d, or q.\n");
menu();
continue;
}
printf("Enter the number of hours worked this week: ");
scanf("%lf", &hours);
if (hours <= BASEHRS)
gross = hours * pay;
else
gross = BASEHRS * pay + (hours - BASEHRS) * pay * OVERTIME;
if (gross <= AMT1)
taxes = gross * RATE1;
else if (gross <= AMT1 + AMT2)
taxes = AMT1 * RATE1 + (gross - AMT1) * RATE2;
else
taxes = AMT1 * RATE1 + AMT2 * RATE2 + (gross - AMT1 - AMT2) *
RATE3;
net = gross - taxes;
printf("gross: $%.2f; taxes: $%.2f; net: $%.2f\n", gross, taxes,
net);
menu();
}
printf("Done.\n");
return 0;
}
void menu(void)
{
printf("********************************************************"
"*********\n");
printf("Enter the number corresponding to the desired pay rate"
" or action:\n");
printf("a) $%4.2f/hr b)$%4.2f/hr\n", BASEPAY1,
BASEPAY2);
printf("c) $%5.2f/hr d) $%5.2f/hr\n", BASEPAY3,
BASEPAY4);
printf("q) quit\n");
printf("********************************************************"
"*********\n");
}
int getfirst(void)
{
int ch;
ch = getchar();
while (isspace(ch))
ch = getchar();
while (getchar() != '\n')
continue;
return ch;
}
Chapter 9
PE 9-1
#include <stdio.h>
double min(double a, double b);
int main(void)
{
double x, y;
printf("Enter two numbers (q to quit): ");
while (scanf("%lf %lf", &x, &y) == 2)
{
printf("The smaller number is %f.\n", min(x,y));
printf("Next two values (q to quit): ");
}
printf("Bye!\n");
return 0;
}
double min(double a, double b)
{
return a < b ? a : b;
}
PE 9-3
#include <stdio.h>
void chLineRow(char ch, int c, int r);
int main(void)
{
char ch;
int col, row;
printf("Enter a character (# to quit): ");
while ( (ch = getchar()) != '#')
{
if (ch == '\n')
continue;
printf("Enter number of columns and number of rows: ");
if (scanf("%d %d", &col, &row) != 2)
break;
chLineRow(ch, col, row);
printf("\nEnter next character (# to quit): ");
}
printf("Bye!\n");
return 0;
}
void chLineRow(char ch, int c, int r)
{
int col, row;
for (row = 0; row < r ; row++)
{
for (col = 0; col < c; col++)
putchar(ch);
putchar('\n');
}
return;
}
PE 9-5
#include <stdio.h>
void larger_of(double *p1, double *p2);
int main(void)
{
double x, y;
printf("Enter two numbers (q to quit): ");
while (scanf("%lf %lf", &x, &y) == 2)
{
larger_of(&x, &y);
printf("The modified values are %f and %f.\n", x, y);
printf("Next two values (q to quit): ");
}
printf("Bye!\n");
return 0;
}
void larger_of(double *p1, double *p2)
{
double temp = *p1 > *p2 ? *p1 : *p2;
*p1= *p2 = temp;
}
PE 9-7
#include <stdio.h>
double power(double a, int b);
int main(void)
{
double x, xpow;
int n;
printf("Enter a number and the integer power");
printf(" to which\nthe number will be raised. Enter q");
printf(" to quit.\n");
while (scanf("%lf%d", &x, &n) == 2)
{
xpow = power(x,n);
printf("%.3g to the power %d is %.5g\n", x, n, xpow);
printf("Enter next pair of numbers or q to quit.\n");
}
printf("Hope you enjoyed this power trip -- bye!\n");
return 0;
}
double power(double a, int b)
{
double pow = 1;
int i;
if (b == 0)
{
if (a == 0)
printf("0 to the 0 undefined; using 1 as the value\n");
pow = 1.0;
}
else if (a == 0)
pow = 0.0;
else if (b > 0)
for(i = 1; i <= b; i++)
pow *= a;
else
pow = 1.0 / power(a, - b);
return pow;
}
PE 9-9
#include <stdio.h>
void to_base_n(int x, int base);
int main(void)
{
int number;
int b;
printf("Enter an integer (q to quit):\n");
while (scanf("%d", &number) == 1)
{
printf("Enter number base (2-10): ");
scanf("%d", &b);
printf("Base %d equivalent: ", b);
to_base_n(number, b);
putchar('\n');
printf("Enter an integer (q to quit):\n");
}
return 0;
}
void to_base_n(int x, int base)
{
int r;
r = x % base;
if (x >= 2)
to_base_n(x / base, base);
putchar('0' + r);
return;
}
Chapter 10
PE 10-1
#include <stdio.h>
#define MONTHS 12
#define YRS 5
int main(void)
{
const float rain[YRS][MONTHS] = {
{10.2, 8.1, 6.8, 4.2, 2.1, 1.8, 0.2, 0.3, 1.1, 2.3, 6.1, 7.4},
{9.2, 9.8, 4.4, 3.3, 2.2, 0.8, 0.4, 0.0, 0.6, 1.7, 4.3, 5.2},
{6.6, 5.5, 3.8, 2.8, 1.6, 0.2, 0.0, 0.0, 0.0, 1.3, 2.6, 4.2},
{4.3, 4.3, 4.3, 3.0, 2.0, 1.0, 0.2, 0.2, 0.4, 2.4, 3.5, 6.6},
{8.5, 8.2, 1.2, 1.6, 2.4, 0.0, 5.2, 0.9, 0.3, 0.9, 1.4, 7.2}
};
int year, month;
float subtot, total;
printf(" YEAR RAINFALL (inches)\n");
for (year = 0, total = 0; year < YRS; year++)
{
for (month = 0, subtot = 0; month < MONTHS; month++)
subtot += *(*(rain + year) + month);
printf("] .1f\n", 1990 + year, subtot);
total += subtot;
}
printf("\nThe yearly average is %.1f inches.\n\n", total/YRS);
printf("MONTHLY AVERAGES:\n\n");
printf(" Jan Feb Mar Apr May Jun Jul AugSep Oct ");
printf(" Nov Dec\n");
for (month = 0; month < MONTHS; month++)
{
for (year = 0, subtot =0; year < YRS; year++)
subtot += *(*(rain + year) + month);
printf("%4.1f ", subtot/YRS);
}
printf("\n");
return 0;
}
PE 10-3
#include <stdio.h>
#define LEN 10
int max_arr(const int ar[], int n);
void show_arr(const int ar[], int n);
int main(void)
{
int orig[LEN] = {1,2,3,4,12,6,7,8,9,10};
int max;
show_arr(orig, LEN);
max = max_arr(orig, LEN);
printf("%d = largest value\n", max);
return 0;
}
int max_arr(const int ar[], int n)
{
int i;
int max = ar[0];
for (i = 1; i < n; i++)
if (max < ar[i])
max = ar[i];
return max;
}
void show_arr(const int ar[], int n)
{
int i;
for (i = 0; i < n; i++)
printf("%d ", ar[i]);
putchar('\n');
}
PE 10-5
#include <stdio.h>
#define LEN 10
float max_diff(const float ar[], int n);
void show_arr(const float ar[], int n);
int main(void)
{
float orig[LEN] = {1.1,2,3,4,12,6,7,8,9,10};
float max;
show_arr(orig, LEN);
max = max_diff(orig, LEN);
printf("%g = maximum difference\n", max);
return 0;
}
float max_diff(const float ar[], int n)
{
int i;
float max = ar[0];
float min = ar[0];
for (i = 1; i < n; i++)
{
if (max < ar[i])
max = ar[i];
else if (min > ar[i])
min = ar[i];
}
return max - min;
}
void show_arr(const float ar[], int n)
{
int i;
for (i = 0; i < n; i++)
printf("%g ", ar[i]);
putchar('\n');
}
PE 10-7
#include <stdio.h>
#define LEN1 7
#define LEN2 3
void copy_arr(int ar1[], const int ar2[], int n);
void show_arr(const int ar[], int n);
int main(void)
{
int orig[LEN1] = {1,2,3,4,5,6,7};
int copy[LEN2];
show_arr(orig, LEN1);
copy_arr(copy, orig + 2, LEN2);
show_arr(copy, LEN2);
return 0;
}
void copy_arr(int ar1[], const int ar2[], int n)
{
int i;
for (i = 0; i < n; i++)
ar1[i] = ar2[i];
}
void show_arr(const int ar[], int n)
{
int i;
for (i = 0; i < n; i++)
printf("%d ", ar[i]);
putchar('\n');
}
PE 10-10
#include <stdio.h>
#define ROWS 3
#define COLS 5
void times2(int ar[][COLS], int r);
void showarr2(int ar[][COLS], int r);
int main(void)
{
int stuff[ROWS][COLS] = { {1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15}
};
showarr2(stuff, ROWS);
putchar('\n');
times2(stuff, ROWS);
showarr2(stuff, ROWS);
return 0;
}
void times2(int ar[][COLS], int r)
{
int row, col;
for (row = 0; row < r; row++)
for (col = 0; col < COLS; col++)
ar[row][col] *= 2;
}
void showarr2(int ar[][COLS], int r)
{
int row, col;
for (row = 0; row < r; row++)
{
for (col = 0; col < COLS; col++)
printf("%d ", ar[row][col]);
putchar('\n');
}
}
PE 10-13
#include <stdio.h>
#define ROWS 3
#define COLS 5
void store(double ar[], int n);
double average2d(int rows, int cols, double ar[rows][cols]);
double max2d(int rows, int cols, double ar[rows][cols]);
void showarr2(int rows, int cols, double ar[rows][cols]);
double average(const double ar[], int n);
int main(void)
{
double stuff[ROWS][COLS];
int row;
for (row = 0; row < ROWS; row++)
{
printf("Enter %d numbers for row %d\n", COLS, row + 1);
store(stuff[row], COLS);
}
printf("array contents:\n");
showarr2(ROWS, COLS, stuff);
for (row = 0; row < ROWS; row++)
printf("average value of row %d = %g\n", row + 1, average(stuff[row], COLS));
printf("average value of all rows = %g\n", average2d(ROWS, COLS, stuff));
printf("largest value = %g\n", max2d(ROWS, COLS, stuff));
printf("Bye!\n");
return 0;
}
void store(double ar[], int n)
{
int i;
for (i = 0; i < n; i++)
{
printf("Enter value #%d: ", i + 1);
scanf("%lf", & ar[i]);
}
}
double average2d(int rows, int cols, double ar[rows][cols])
{
int r, c;
double sum = 0.0;
for (r = 0; r < rows; r++)
for (c = 0; c < cols; c++)
sum += ar[r][c];
if (rows * cols > 0)
return sum / (rows * cols);
else
return 0.0;
}
double max2d(int rows, int cols, double ar[rows][cols])
{
int r, c;
double max = ar[0][0];
for (r = 0; r < rows; r++)
for (c = 0; c < cols; c++)
if (max < ar[r][c])
max = ar[r][c];
return max;
}
void showarr2(int rows, int cols, double ar[rows][cols])
{
int row, col;
for (row = 0; row < rows; row++)
{
for (col = 0; col < cols; col++)
printf("%g ", ar[row][col]);
putchar('\n');
}
}
double average(const double ar[], int n)
{
int i;
double sum = 0.0;
for (i = 0; i < n; i++)
sum += ar[i];
if (n > 0)
return sum / n;
else
return 0.0;
}
Chapter 11
PE 11-1
#include <stdio.h>
#define LEN 10
char * getnchar(char * str, int n);
int main(void)
{
char input[LEN];
char *chk;
chk = getnchar(input, LEN - 1);
if (chk == NULL)
puts("Input failed.");
else
puts(input);
puts("Done.\n");
return 0;
}
char * getnchar(char * str, int n)
{
int i;
int ch;
for (i = 0; i < n; i++)
{
ch = getchar();
if (ch != EOF)
str[i] = ch;
else
break;
}
if (ch == EOF)
return NULL;
else
{
str[i] = '\0';
return str;
}
}
PE 11-3
#include <stdio.h>
#define LEN 80
char * getword(char * str);
int main(void)
{
char input[LEN];
char *chk;
while (getword(input) != NULL)
puts(input);
puts("Done.\n");
return 0;
}
#include <ctype.h>
char * getword(char * str)
{
int i;
int ch;
while ((ch = getchar()) != EOF && !isspace(ch))
*str++ = ch;
*str = '\0';
if (ch == EOF)
return NULL;
else
{
while (ch != '\n')
ch = getchar();
return str;
}
}
PE 11-5
#include <stdio.h>
#define LEN 80
int is_within(const char * str, char c);
int main(void)
{
char input[LEN];
char ch;
int found;;
printf("Enter a string: ");
while (gets(input) && input[0] != '\0')
{
printf("Enter a character: ");
ch = getchar();
while (getchar() != '\n')
continue;
found = is_within(input, ch);
if (found == 0)
printf("%c not found in string.\n", ch);
else
printf("%c found in string %s\n", ch, input);
printf("Next string: ");
}
puts("Done.\n");
return 0;
}
int is_within(const char * str, char ch)
{
while (*str != ch && *str != '\0')
str++;
return *str;
}
PE 11-7
#include <stdio.h>
#define LEN 20
char * string_in(const char * s1, const char * s2);
int main(void)
{
char orig[LEN] = "transportation";
char * find;
puts(orig);
find = string_in(orig, "port");
if (find)
puts(find);
else
puts("Not found");
find = string_in(orig, "part");
if (find)
puts(find);
else
puts("Not found");
return 0;
}
#include <string.h>
char * string_in(const char * s1, const char * s2)
{
int l2 = strlen(s2);
int tries;
int nomatch = 1;
tries = strlen(s1) + 1 - l2;
if (tries > 0)
while (( nomatch = strncmp(s1, s2, l2)) && tries--)
s1++;
if (nomatch)
return NULL;
else
return (char *) s1;
}
PE 11-9
#include <stdio.h>
#define LEN 81
int drop_space(char * s);
int main(void)
{
char orig[LEN];
while (gets(orig) && orig[0] != '\0')
{
drop_space(orig);
puts(orig);
}
puts("Bye!");
return 0;
}
int drop_space(char * s)
{
int ct = 0;
char * pos;
while (*s)
{
if (*s == ' ')
{
pos = s;
do
{
*pos = *(pos + 1);
pos++;
} while (*pos);
}
else
s++;
}
}
PE 11-11
#include <stdio.h>
#include <ctype.h> // for isspace()
#include <stdbool.h> // for bool, true, false
int main(void)
{
char c; // read in character
int low_ct = 0; // number of lowercase characters
int up_ct = 0; // number of uppercase characters
int dig_ct = 0; // number of digits
int n_words = 0; // number of words
int punc_ct = 0; // number of punctuation marks
bool inword = false; // == true if c is in a word
printf("Enter text to be analyzed (EOF to terminate):\n");
while ((c = getchar()) != EOF)
{
if (islower(c))
low_ct++;
else if (isupper(c))
up_ct++;
else if (isdigit(c))
dig_ct++;
else if (ispunct(c))
punc_ct++;
if (!isspace(c) && !inword)
{
inword = true; // starting a new word
n_words++; // count word
}
if (isspace(c) && inword)
inword = false; // reached end of word
}
printf("\nwords = %d, lowercase = %d, uppercase = %d, "
"digits = %d, punctuation = %d\n",
n_words,low_ct,up_ct, dig_ct, punc_ct);
return 0;
}
PE 11-13
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char *argv[])
{
double num, exp;
if (argc != 3)
printf("Usage: %s number exponent\n", argv[0]);
else
{
num = atof(argv[1]);
exp = atof(argv[2]);
printf("%f to the %f power = %g\n", num, exp, pow(num,exp));
}
return 0;
}
PE 11-15
#include <stdio.h>
#include <ctype.h>
int main(int argc, char *argv[])
{
char mode = 'p';
int ok = 1;
int ch;
if (argc > 2)
{
printf("Usage: %s [-p | -u | -l]\n", argv[0]);
ok = 0;
}
else if (argc == 2)
{
if (argv[1][0] != '-')
{
printf("Usage: %s [-p | -u | -l]\n", argv[0]);
ok = 0;
}
else
switch(argv[1][1])
{
case 'p' :
case 'u' :
case 'l' : mode = argv[1][1];
break;
default: printf("%s is an invalid flag; ", argv[1]);
printf("using default flag (-p).\n");
}
}
if (ok)
while ((ch = getchar() ) != EOF)
{
switch(mode)
{
case 'p': putchar(ch);
break;
case 'u': putchar(toupper(ch));
break;
case 'l': putchar(tolower(ch));
}
}
return 0;
}
Chapter 12
PE 12-1
#include <stdio.h>
void critic(int * u);
int main(void)
{
int units;
printf("How many pounds to a firkin of butter?\n");
scanf("%d", &units);
while ( units != 56)
critic(&units);
printf("You must have looked it up!\n");
return 0;
}
void critic(int * u)
{
printf("No luck, chummy. Try again.\n");
scanf("%d", u);
}
// or use a return value:
// units = critic();
// and have critic look like this:
// or have main() collect the next value for units
PE 12-3
//pe12-3a.h
#define METRIC 0
#define US 1
#define USE_RECENT 2
void check_mode(int *pm);
void get_info(int mode, double * pd, double * pf);
void show_info(int mode, double distance, double fuel);
// pe12-3a.c
#include <stdio.h>
#include "pe12-3a.h"
void check_mode(int *pm)
{
if (*pm != METRIC && *pm != US)
{
printf("Invalid mode specified. Mode %d\n", *pm);
printf("Previous mode will be used.\n");
*pm = USE_RECENT;
}
}
void get_info(int mode, double * pd, double * pf)
{
if (mode == METRIC)
printf("Enter distance traveled in kilometers: ");
else
printf("Enter distance traveled in miles: ");
scanf("%lf",pd);
if (mode == METRIC)
printf("Enter fuel consumed in liters: ");
else
printf("Enter fuel consumed in gallons: ");
scanf("%lf", pf);
}
void show_info(int mode, double distance, double fuel)
{
printf("Fuel consumption is ");
if (mode == METRIC)
printf("%.2f liters per 100 km.\n", 100 * fuel / distance);
else
printf("%.1f miles per gallon.\n", distance / fuel);
}
// pe12-3.c
#include <stdio.h>
#include "pe12-3a.h"
int main(void)
{
int mode;
int prev_mode = METRIC;
double distance, fuel;
printf("Enter 0 for metric mode, 1 for US mode: ");
scanf("%d", &mode);
while (mode >= 0)
{
check_mode(&mode);
if (mode == USE_RECENT)
mode = prev_mode;
prev_mode = mode;
get_info(mode, &distance, &fuel);
show_info(mode, distance, fuel);
printf("Enter 0 for metric mode, 1 for US mode");
printf(" (-1 to quit): ");
scanf("%d", &mode);
}
printf("Done.\n");
return 0;
}
PE 12-5
#include <stdio.h>
#include <stdlib.h>
void print(const int array[], int limit);
void sort(int array[], int limit);
#define SIZE 100
int main(void)
{
int i;
int arr[SIZE];
for (i = 0; i < SIZE; i++)
arr[i] = rand() % 10 + 1;
puts("initial array");
print(arr,SIZE);
sort(arr,SIZE);
puts("\nsorted array");
print(arr,SIZE);
return 0;
}
void sort(int array[], int limit)
{
int top, search, temp;
for (top = 0; top < limit -1; top++)
for (search = top + 1; search < limit; search++)
if (array[search] > array[top])
{
temp = array[search];
array[search] = array[top];
array[top] = temp;
}
}
void print(const int array[], int limit)
{
int index;
for (index = 0; index < limit; index++)
{
printf("- ", array[index]);
if (index % 10 == 9)
putchar('\n');
}
if (index % 10 != 0)
putchar('\n');
}
PE 12-7
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int rollem(int);
int main(void)
{
int dice, count, roll;
int sides;
int set, sets;
srand((unsigned int) time(0));
printf("Enter the number of sets; enter q to stop.\n");
while ( scanf("%d", &sets) == 1)
{
printf("How many sides and how many dice?\n");
scanf("%d %d", &sides, &dice);
printf("Here are %d sets of %d %d-sided throws.\n", sets, dice,
sides);
for (set = 0; set < sets; set++)
{
for (roll = 0, count = 0; count < dice; count++)
roll += rollem(sides);
printf("M ", roll);
if (set % 15 == 14)
putchar('\n');
}
if (set % 15 != 0)
putchar('\n');
printf("How many sets? Enter q to stop.\n");
}
printf("GOOD FORTUNE TO YOU!\n");
return 0;
}
int rollem(int sides)
{
int roll;
roll = rand() % sides + 1;
return roll;
}