《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()。



















