《C Primer Plus》第13章复习题与编程练习
- 复习题
- 1. 下面的程序有什么问题?
- 2. 下面的程序完成什么任务?(假设在命令行环境中运行)
- 3. 假设程序中有下列语句:
- 4. 编写一个程序,不接受任何命令行参数或接受一个命令行参数。如果有一个参数,将其解释为文件名;如果没有参数,使用标准输入(stdin)作为输入。假设输入完全是浮点数。该程序要计算和报告输入数字的算术平均值。
- 5. 编写一个程序,接受两个命令行参数。第1个参数是字符,第2个参数是文件名。要求该程序只打印文件中包含给定字符的那些行。
复习题
1. 下面的程序有什么问题?
int main(void)
{
int * fp;
int k;
fp = fopen("gelatin");
for (k = 0; k < 30; k++)
fputs(fp, "Nanette eats gelatin.");
fclose("gelatin");
return 0;
}
缺少头文件,fopen()和fclose()函数错误。
修改后的代码如下:
#include <stdio.h>
int main(void)
{
FILE *fp;
int k;
fp = fopen("gelatin", "w");
for (k = 0; k < 30; k++)
fputs("Nanette eats gelatin.\n", fp);
fclose(fp);
return 0;
}
2. 下面的程序完成什么任务?(假设在命令行环境中运行)
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(int argc, char *argv [])
{
int ch;
FILE *fp;
if (argc < 2)
exit(EXIT_FAILURE);
if ((fp = fopen(argv[1], "r")) == NULL)
exit(EXIT_FAILURE);
while ((ch = getc(fp)) != EOF)
if (isdigit(ch))
putchar(ch);
fclose(fp);
return 0;
}
如果有第二个参数,尝试打开一个和该参数名同名的文件,如果该文件可以打开,在屏幕上输出一个其中的所有数字。
运行结果:
3. 假设程序中有下列语句:
#include <stdio.h>
FILE * fp1,* fp2;
char ch;
fp1 = fopen("terky", "r");
fp2 = fopen("jerky", "w");
另外,假设成功打开了两个文件。补全下面函数调用中缺少的参数:
a.ch = getc();
b.fprintf( ,“%c\n”, );
c.putc( , );
d.fclose(); /* 关闭terky文件 */
a. fp1
b. fp2 ch
c. ch fp2
d. fp1
4. 编写一个程序,不接受任何命令行参数或接受一个命令行参数。如果有一个参数,将其解释为文件名;如果没有参数,使用标准输入(stdin)作为输入。假设输入完全是浮点数。该程序要计算和报告输入数字的算术平均值。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
void makeFile()
{
srand((unsigned long)time(0));
FILE *fp;
fp = fopen("file.txt", "w");
//生成100个浮点数,小数点前有3位,小数点后有4位
for (int j = 0; j < 100; ++j)
{
for (int i = 0; i < 7; ++i)
{
if (i == 3)
{
putc('.', fp);
}
putc(rand() % 10 + '0', fp);
}
putc('\n', fp);
}
fclose(fp);
}
int main(int argc, char **argv)
{
makeFile();
FILE *fp;
double n, sum = 0.0;
int num = 0;
if (argc == 1)
{
fp = stdin;
}
else if (argc == 2)
{
if ((fp = fopen(argv[1], "r")) == NULL)
{
fprintf(stderr, "Open %s failed\n", argv[1]);
exit(EXIT_FAILURE);
}
}
else
{
fprintf(stderr, "Usage:%s [filename]\n", argv[0]);
exit(EXIT_FAILURE);
}
while (fscanf(fp, "%lf", &n) == 1)
{
num++;
sum += n;
}
if (num)
{
printf("%lf\n", sum / n);
}
else
{
puts("There is no number");
}
system("pause");
return 0;
}
运行结果:
使用文件输入:
使用键盘输入:
5. 编写一个程序,接受两个命令行参数。第1个参数是字符,第2个参数是文件名。要求该程序只打印文件中包含给定字符的那些行。
注意
C程序根据’\n’识别文件中的行。假设所有行都不超过256个字符,你可能会想到用fgets()。