20201022-成信大-C语言程序设计-20201学期《C语言程序设计B》C-trainingExercises28

20201022-成信大-C语言程序设计-20201学期《C语言程序设计B》C-trainingExercises28

P330

测试文件内容,文件名:Test.txt

/*      stdlib.h
        Definitions for common types, variables, and functions.
        Copyright (c) Borland International 1987,1988
        All Rights Reserved.
*/
char   *_Cdecl ltoa     (long vaLue, char *string, int radix);
int     _Cdecl putenv   (const char *name);
unsigned _Cdecl _rotl   (unsigned value, int count);
unsigned _Cdecl _rotr   (unsigned value, int count);
void    _Cdecl swab     (char *from, char *to, int nbytes);
char   *_Cdecl ultoa    (unsigned long kvAluE, char *string, int radix);

题目要求:

在这里插入图片描述

解答程序:

/* 
从键盘输入一个文本文件的文件名(约定:字符数≤127字节,可含路径),再在屏幕上显示该文件的内容。注意,对于文件中的字符*,在屏幕上改为显示字符@。
  单击此处下载程序运行时测试用的文件Test.txt。
编程可用素材:
printf("input the file's name: ");
printf("\nfile open error!");
printf("------------------------File Begin:----------------------\n");
printf("\n------------------------ File End. ----------------------\n");
 */

#include <stdio.h>
#include <stdlib.h>

#define N 128

int main(void)
{
    
    
    FILE *fp;
    char myPath[N];
    char ch;

    printf("input the file's name: ");
    gets(myPath);

    fp = fopen(myPath, "r");
    if (fp == NULL)
    {
    
    
        printf("\nfile open error!");
        goto ERROR;
    }
    printf("------------------------File Begin:----------------------\n");
    // read file char by char
    ch = fgetc(fp);
    while(!feof(fp))
    {
    
    
        if (ch == '*')
        {
    
    
            ch = '@';
        }
        putchar(ch);
        ch = fgetc(fp);
    }
    printf("\n------------------------ File End. ----------------------\n");
    

ERROR:
    if (fp != NULL)
    {
    
    
        fclose(fp);
    }

    return 0;
}

P796

题目要求:

在这里插入图片描述

解答程序:

/* 
编写一程序P796.C实现以下功能
  在磁盘上新建一个文件Test.txt,将从键盘读入的多个字符存储到该文件中,要求如下:
  (1)若输入的字符中有小写字母,则应先将其转换为大写后再存入。
  (2)输入!表示输入结束且!不存入文件中。
  (3)当文件创建失败或向文件写入字符时出错,应显示指定的出错信息并终止程序的执行。
  (4)程序的返回值(即由main函数return的值和程序使用exit终止运行时返回的值,也称退出代码)规定为:
    ①运行正常返回0 ②文件创建失败返回1 ③向文件写入字符时出错返回2
  编程可用素材:
printf("\nCreate file error!\n");
printf("Input chars: ");
printf("\nWriting file error!\n");
  程序的运行效果应类似地如图1所示,文件Test.txt的内容应类似地如图2所示。图1中的“Input chars: ”后面的内容系从键盘输入。

Input chars: ok?
It is easy?

6789235*()*&@#you
hi!
 */
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    
    
    FILE *fp = NULL;    // 首先置空,防止野指针
    char ch;

    fp = fopen("Test.txt", "w");
    if (fp == NULL)
    {
    
    
        printf("\nCreate file error!\n");
        exit(1);
    }

    printf("Input chars: ");
    // while ((ch = getchar()) != '!')
    while (scanf("%c",&ch)!=EOF) // 从控制台读入字符
    {
    
    
        if (ch =='!')
        {
    
    
            break;
        }        
        if (ch>='a' && ch<='z')
        {
    
    
            ch = ch - 32;
        }
        // if (fputc(ch,fp) == EOF)
        if (fprintf(fp,"%c",ch) == EOF) // 在文本文件中输出
        {
    
    
            printf("\nWriting file error!\n");
            if (fp!= NULL)
            {
    
    
                fclose(fp); // 防止意外出错时,忘了关闭文件资源
                fp = NULL;  // 防止关闭时出意外,置空,防止野指针
            }
            exit(2);
        }
    }
    

    fclose(fp);
    fp = NULL;      //最后置空,防止野指针

    return 0;
}

运行后的产生test.txt文件内容参考如下:

OK?
IT IS EASY?

6789235*()*&@#YOU
HI

P314

参考测试文件的内容sp.txt

xuebi da 6.00 345
nongfuSQxianchengduo zhongxingA 4.392 57398
xuebi xiao 2.004 4567
xuebi da 6.003 456

题目要求:

在这里插入图片描述

解答程序:

/* 
编写一程序P314.C实现以下功能
  有一存储很多商品数据(每件商品的属性先后包括:品名、规格、单价(有小数位)、数量,数据的最长长度分别为20、10、6、5,在文件中以空格为分隔,
每个商品的数据占一行)的文本文件,从键盘输入某种商品的品名,要求在文件中查找有无相应品名商品(可能有多条记录或没有),若有则在屏幕上显示出相应
的商品的品名、规格、数量、单价(显示时,品名、规格、数量、单价之间使用逗号(,)作分隔,单价显示时只显示2位小数),若无则显示没有相应品名的商品。
  单击此处下载程序运行时测试用的商品数据文件sp.txt并保存到程序P314.C所在的文件夹且文件名保持不变。
编程可用素材:
printf("Please input shang pin pin ming:");
printf("\ncha zhao qing kuang:\n");
printf("mei you shang pin :%s",inputName);
  程序的运行效果应类似地如图1和图2所示,
图1中的Please input shang pin pin ming:xuebi中的xuebi和
图2中的Please input shang pin pin ming:kele中的kele是从键盘输入的内容。
 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>



int main(void)
{
    
    
    // 品名、规格、单价(有小数位 单价显示时只显示2位小数)、数量,数据的最长长度分别为20、10、6、5
    char name[21];
    char inputName[21];
    char size[11];
    float price;
    int count;
    FILE *fp;
    int flag = 0;

    if ((fp=fopen("sp.txt","r"))==NULL)
    {
    
    
        printf("read file error! \n");
        exit(1);
    }
    printf("Please input shang pin pin ming:");
    gets(inputName);

    // 边读文件边查找输出
    printf("\ncha zhao qing kuang:\n");
    // while(!feof(fp))     // 教训:如果用这个判断,则会最后的结束符再读一次,循环会多做一次,就出错了
    while(fscanf(fp, "%s%s%f%d", name,size,&price,&count) != EOF)
    {
    
    
        // fscanf(fp, "%s%s%f%d", name,size,&price,&count);
        if (strcmp(name,inputName)==0)
        {
    
    
            flag = 1;
            printf("%s,%s,%d,%.2f\n", name, size, count, price);
        }       
    }
    if (flag==0)
    {
    
    
        printf("mei you shang pin :%s",inputName);
    }
    

    fclose(fp);
    fp = NULL;

    return 0;
}

P338

测试文件内容xscj.txt

2007033964 杨志刚毅 男 计算机文化基础 53
2007021867 唐露希 女 微积分I 63
2007033964 杨志刚毅 男 微积分I 26
2007072283 李田 男 C语言程序设计 22
2007051538 王坤焱 女 微积分I 0
2007073425 明庆波 男 C语言程序设计 72
2007021536 何亚东 男 C语言程序设计 93
2007033964 杨志刚毅 男 C语言程序设计 90
2007021867 唐露希 女 计算机文化基础 62
2007052372 段卢兵 男 微积分I 51
2007021867 唐露希 女 C语言程序设计 89
2007021536 何亚东 男 微积分I 0
2007073425 明庆波 男 微积分I 50
2007021536 何亚东 男 计算机文化基础 61


题目要求:

在这里插入图片描述

解答程序:

/* 
编写一程序P338.C实现以下功能
  有一存储很多学生成绩的文本文件(学生与课程数不限),每个学生的数据包括学号(10个数字)、姓名(最多4个汉字)、性别、课程名称(最多7个汉字)、成绩(整数)。
从键盘输入某门课程的名称,要求在文件中查找有无相应的课程(可能有多条记录或没有),有则计算并输出该课程的选课人数与平均成绩,无则报告没有。
  单击此处下载程序运行时测试用的学生成绩文件xscj.txt并保存到程序P338.C所在的文件夹且文件名保持不变。
编程可用素材:
printf("请输入要计算平均成绩的课程名称:");
printf("文件打开失败,请检查文件名及路径是否正确、文件是否存在!");
printf("\n计算结果为:\n");
printf("文件中没有名称为“…”的课程\n"…);
printf("课程“…”有 … 人选学,平均成绩为…);
  程序的运行效果应严格地如图1、图2所示,图中的红色部分是从键盘输入的内容。
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    
    
    FILE *fp;
    // 学号(10个数字)、姓名(最多4个汉字)、性别、课程名称(最多7个汉字)、成绩(整数)
    char num[11];
    char name[9];
    char sex[3];
    char inputName[15];
    char className[15];
    int score;

    int sum = 0;
    int count = 0;
    float aver;
    int flag = 0;

    fp = fopen("xscj.txt", "r");
    if (fp==NULL)
    {
    
    
        printf("文件打开失败,请检查文件名及路径是否正确、文件是否存在!");
        exit(1);
    }

    printf("请输入要计算平均成绩的课程名称:");
    gets(inputName);

    printf("\n计算结果为:\n");

    /* 
        教训:
            1. 这里使用格式化读文件
            2. 用什么方式读,就用什么方式判断文件结尾
            3. 一般就用读或是写函数的返回值来进行判断
            4. 读写有异常或出错时,也可以捕获后来处理,但一般不会有这样的要求。
        本题:
            一定要使用fscanf的返回值来判断是否读到了文件末尾,如果用feof(fp),会多读一次,就会把最后一条记录多处理一次,结果就不对了
     */
    while (fscanf(fp, "%10s%s%s%s%d", num, name, sex, className, &score) != EOF )
    {
    
    
        // fscanf(fp, "%10s%s%s%s%d", num, name, sex, className, &score);
        // printf("%s,%s,%s,%s,%d\n", num, name, sex, className, score);
        if (strcmp(className,inputName) == 0)
        {
    
    
            flag = 1;
            count++;
            sum += score;
        }
    }
    if (flag)
    {
    
    
        aver = (float)sum / count;
        printf("课程“%s”有 %d 人选学,平均成绩为 %.1f", inputName, count, aver);
    }
    else
    {
    
    
        printf("文件中没有名称为“%s”的课程\n",inputName);
    }

    fclose(fp);
    fp = NULL;

    return 0;
}

P339

测试文件同上一题

题目要求:

在这里插入图片描述

解答程序:

/* 
编写一程序P339.C实现以下功能
  有一存储很多学生成绩的文本文件(学生与课程数不限),每个学生的数据包括学号(10个数字)、姓名(最多4个汉字)、性别、课程名称(最多7个汉字)、成绩(整数)。
从键盘输入某门课程的名称,要求在文件中查找有无相应的课程(可能有多条记录或没有),有则计算并输出该课程的选课人数、及格人数与及格率,无则报告没有。
  单击此处下载程序运行时测试用的学生成绩文件xscj.txt并保存到程序P339.C所在的文件夹且文件名保持不变。
编程可用素材:
printf("请输入要计算及格率的课程名称:");
printf("文件打开失败,请检查文件名及路径是否正确、文件是否存在!");
printf("\n计算结果为:\n");
printf("文件中没有名称为“…”的课程\n"…);
printf("课程“…”有 … 人选学,其中及格 … 人,及格率为…);
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    
    
    // 学号(10个数字)、姓名(最多4个汉字)、性别、课程名称(最多7个汉字)、成绩(整数)
    char num[11];
    char name[9];
    char sex[3];
    char className[15];
    char inClsName[15];
    int score;

    int count = 0;  // 及格人数
    int total = 0;  // 选课人数
    float rate;   // 及格率

    int flag = 0;

    FILE *fp;

    fp = fopen("xscj.txt", "r");
    if (fp == NULL)
    {
    
    
        printf("文件打开失败,请检查文件名及路径是否正确、文件是否存在!");
        exit(1);
    }

    printf("请输入要计算及格率的课程名称:");
    gets(inClsName);

    printf("\n计算结果为:\n");
    
    /* 
        教训:
            1. 这里使用格式化读文件
            2. 用什么方式读,就用什么方式判断文件结尾
            3. 一般就用读或是写函数的返回值来进行判断
            4. 读写有异常或出错时,也可以捕获后来处理,但一般不会有这样的要求。
        本题:
            一定要使用fscanf的返回值来判断是否读到了文件末尾,如果用feof(fp),会多读一次,就会把最后一条记录多处理一次,结果就不对了
    */
    // while (!feof(fp))        // 这样操作,会将最后一次读取的内容,多用一次,就会出错
    while (fscanf(fp, "%10s %s %s %s %d", num, name, sex, className, &score) != EOF)
    {
    
    
        // fscanf(fp, "%10s %s %s %s %d", num, name, sex, className, &score);
        // printf("%10s %s %s %s %d\n", num, name, sex, className, score);
        if (strcmp(className,inClsName)==0)
        {
    
    
            flag = 1;
            total++;
            if (score>=60)
            {
    
    
                count++;
            }
        }
    }

    if (flag)
    {
    
    
        rate = (float)count / total;
        printf("课程“%s”有 %d 人选学,其中及格 %d 人,及格率为 %.1f", inClsName, total, count, rate);
    }
    else
    {
    
    
        printf("文件中没有名称为“%s”的课程\n", inClsName);
    }
    

    fclose(fp);
    fp = NULL;

    return 0;
}

P340

测试文件jtwz.txt

川B20525 2015.01.03 超速
川A63602 2013.12.01 无照驾驶
渝B31222 2015.01.03 酒驾
渝B31221 2014.12.31 闯红灯
川B20525 2013.02.27 超速
川X81900 2014.05.09 逆向行驶
川A34221 2014.12.31 闯红灯
渝B31202 2014.12.08 闯红灯
川X22701 2014.08.12 逆向行驶
川T10565 2013.08.17 闯红灯
川T10565 2013.08.17 超速
川A63602 2013.12.01 闯红灯


题目要求:

在这里插入图片描述

解答程序:

/* 
编写一程序P340.C实现以下功能
  有一存储很多交通违章记录的文本文件,每条记录包括车牌号(1个汉字+6个字符)、发生日期、违章类型(最多4个汉字)。从键盘输入违章类型的名称,
要求在文件中查找并显示相应的记录(可能有多条记录或没有)。
  单击此处下载程序运行时测试用的违章记录文件jtwz.txt并保存到程序P340.C所在的文件夹且文件名保持不变。
编程可用素材:
printf("请输入要查找的违章类型:");
printf("文件打开失败,请检查文件名及路径是否正确、文件是否存在!");
printf("\n查找结果为:\n");
printf("文件中没有找到“%s”的记录\n",inputType);
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    
    
    FILE *fp;
    // 牌号(1个汉字+6个字符)、发生日期、违章类型(最多4个汉字)
    char sign[9];
    int year;
    int month;
    int day;
    char type[9];
    char inputType[9];
    int flag = 0;
    int count = 0;

    fp = fopen("jtwz.txt", "r");
    if (fp == NULL)
    {
    
    
        printf("文件打开失败,请检查文件名及路径是否正确、文件是否存在!");
        exit(1);
    }
    printf("请输入要查找的违章类型:");
    gets(inputType);
    printf("\n查找结果为:\n");
    while (!feof(fp))
    {
    
    
        fscanf(fp, "%8s %4d.%2d.%2d %s", sign, &year, &month, &day, type);
        // printf("%8s %d.%02d.%02d %s\n", sign, year, month, day, type);
        if (strcmp(inputType,type)==0)
        {
    
    
            flag = 1;
            count++;
            printf("%d %8s, %d.%02d.%02d, %s\n",count,sign, year, month, day, type);
        }
    }
    
    if (flag==0)
    {
    
    
        printf("文件中没有找到“%s”的记录\n",inputType);
    }
    

    fclose(fp);
    fp = NULL;
    return 0;
}


猜你喜欢

转载自blog.csdn.net/matrixbbs/article/details/110915254