Original code:
#include
int main()
{
int a, b, c, d;
float avg;
printf("Please enter the first number: ");
scanf("%d", &a);
printf("Please enter the second number: ");
scanf("%d", &b);
printf("Please enter the third number: ");
scanf("%d", &c);
printf("Please enter the fourth number: ");
scanf("%d", &d);
avg = (float)(a + b + c + d) / 4; // force operation to be considered float, not native (int)
printf("The average is %.2f\n", avg); // format to 2 decimal places with the .2
return(0);
}
With this code typed in, compiled, and ran, you can manually enter the 4 values and should see their average.
Conversely, we can also put our desired input in a file and feed in into our program via I/O redirection:
lab46:~/src/unix$ echo 24 > infile
lab46:~/src/unix$ echo 37 >> infile
lab46:~/src/unix$ echo 16 >> infile
lab46:~/src/unix$ echo 29 >> infile
lab46:~/src/unix$ cat infile
24
37
16
29
lab46:~/src/unix$ ./avgprog < infile
Output may seem a little messy, but that's only because it still expects actual enter keys to be hit. Notice the desired end result IS displayed.
Identical code, minus a lie:
#include
int main()
{
int a, b, c, d;
float avg;
fprintf(stdout, "Please enter the first number: ");
fscanf(stdin, "%d", &a);
fprintf(stdout, "Please enter the second number: ");
fscanf(stdin, "%d", &b);
fprintf(stdout, "Please enter the third number: ");
fscanf(stdin, "%d", &c);
fprintf(stdout, "Please enter the fourth number: ");
fscanf(stdin, "%d", &d);
avg = (float)(a + b + c + d) / 4; // force operation to be considered float, not native (int)
fprintf(stdout, "The average is %.2f\n", avg); // format to 2 decimal places with the .2
return(0);
}
Basically, a regular **printf()** is IDENTICAL to an **fprintf()** to **stdout**. Everything is a file, remember?
Same deal with **scanf()**/**fscanf()** from **stdin**. The lowercase **stdin/stdout/stderr** are file pointers available to us in C.