明解C语言入门练习13

练习13-3

#include <stdio.h>
#include <string.h>

#define NUMBER 6           // 人物数量
#define NAME_LEN 128       // 人物姓名最大长度

// 定义人物结构体
typedef struct {
    char name[NAME_LEN];  // 姓名
    double height;        // 身高
    double weight;        // 体重
} Renwu;

// 交换两个人物信息的函数
void swap(Renwu* num1, Renwu* num2)
{
    Renwu temp = *num1;   // 保存num1的值
    *num1 = *num2;        // 将num2的值赋给num1
    *num2 = temp;         // 将temp的值赋给num2
}

// 冒泡排序函数,按身高从小到大排序
void paixu(Renwu s[], int n) {
    for (int i = 0; i < n; i++) {         // 外层循环,控制排序轮数
        for (int j = n - 1; j > i; j--) {   // 内层循环,控制每轮比较次数
            if (s[j - 1].height > s[j].height)
                swap(&s[j - 1], &s[j]);   // 交换位置
        }
    }
}

int main()
{
    FILE* fp;                // 文件指针
    if ((fp = fopen("hw.dat", "r")) == NULL) {    // 打开文件
        printf("文件打开失败。");  // 文件打开失败提示
        return 1;               // 返回1,程序结束
    }

    int ninzu = 0;            // 人数计数器
    char name[100];           // 人物姓名
    double height, weight;    // 人物身高体重
    double hsum = 0.0;        // 总身高
    double wsum = 0.0;        // 总体重
    Renwu ren[NUMBER];        // 定义人物结构体数组

    // 读取文件中的人物信息
    while (fscanf(fp, "%s%lf%lf", name, &height, &weight) == 3)
    {
        printf("%-10s %5.1f %5.1f\n", name, height, weight);   // 输出读取到的人物信息
        strcpy(ren[ninzu].name, name);     // 复制人物姓名
        ren[ninzu].height = height;        // 保存人物身高
        ren[ninzu].weight = weight;        // 保存人物体重
        ninzu++;                           // 人数计数器加1
        hsum += height;                    // 累加身高总和
        wsum += weight;                    // 累加体重总和
    }

    printf("-----------------------\n");
    printf("平均       %5.1f %5.1f\n", hsum / ninzu, wsum / ninzu);  // 输出平均身高体重
    fclose(fp);             // 关闭文件

    puts("排序后。");        // 输出排序后提示
    paixu(ren, NUMBER);// 调用排序函数
	for (int i=0;i<NUMBER;i++) //显示排序后的所有内容
		printf("%-10s %5.1f %5.1f\n", ren[i].name, ren[i].height, ren[i].weight);
	return 0;
}

练习13-5

#include <stdio.h>
#include <time.h>

#define xinq printf("当前心情:");

char date_file[] = "datetime.dat"; // 存储日期时间的文件名
char xq[20] = "无"; // 上次心情

void put_data() {
    FILE* fp = fopen(date_file, "w"); // 以写入方式打开文件
    if (fp != NULL) {
        time_t current = time(NULL); // 获取当前时间
        struct tm* timer = localtime(&current); // 转换为本地时间
        // 将日期时间和上次心情写入文件
        fprintf(fp, "%d %d %d %d %d %d %s",
                timer->tm_year + 1900, timer->tm_mon + 1, timer->tm_mday,
                timer->tm_hour, timer->tm_min, timer->tm_sec, xq);
        fclose(fp);
    }
}

void put_xq() {
    FILE* fp = fopen(date_file, "a"); // 以追加方式打开文件
    scanf("%s", xq); // 读入当前心情
    fprintf(fp, "%s", xq); // 将当前心情写入文件
    fclose(fp);
}

void get_data() {
    FILE* fp;
    if ((fp = fopen(date_file, "r")) == NULL) { // 如果文件不存在
        printf("本程序第一次运行,");
        xinq; // 提示输入当前心情
    }
    else {
        int year, month, day, h, m, s;
        char scx[128];
        fscanf(fp, "%d%d%d%d%d%d%s", &year, &month, &day, &h, &m, &s, &scx); // 读取日期时间和上次心情
        // 显示上次运行时间和上次心情,并提示输入当前心情
        printf("上一次运行时间是:%d年%d月%d日%d时%d分%d秒。上次心情:%s:当前心情:",
                year, month, day, h, m, s, scx);
    }
}

int main() {
    get_data(); // 获取上次运行时间和上次心情
    put_xq(); // 读入当前心情
    put_data(); // 将当前时间和当前心情写入文件
    return 0;
}

13-12

#include <stdio.h>
#include <time.h>

void datatime() {
    FILE* fp = fopen("1.txt", "wb"); // 以二进制方式打开文件
    time_t current = time(NULL); // 获取当前时间
    struct tm* timer = localtime(&current); // 将当前时间转换为本地时间
    fwrite(timer, sizeof(struct tm), 1, fp); // 将本地时间写入文件
    fclose(fp); // 关闭文件
}

void gettime() {
    FILE* fp = fopen("1.txt", "rb"); // 以二进制方式打开文件
    struct tm timer;//tm是结构体
    fread(&timer, sizeof(struct tm), 1, fp); // 从文件读取本地时间
    printf("%d-%02d-%02d %02d:%02d:%02d\n", timer.tm_year + 1900, timer.tm_mon + 1, timer.tm_mday, timer.tm_hour, timer.tm_min, timer.tm_sec); // 打印本地时间
    fclose(fp); // 关闭文件
}

int main()
{
    datatime(); // 写入本地时间到文件
    gettime(); // 从文件中读取本地时间并打印
    return 0;
}

练习13-13

#include <stdio.h>
int main()
{
    int ch;            // 存储每次读取的字符
    FILE* sfp;         // 原文件指针
    FILE* dfp;         // 目标文件指针
    char sname[FILENAME_MAX];  // 存储原文件名
    char dname[FILENAME_MAX];  // 存储目标文件名
    int i;             // 存储每次读取的字符的地址

    printf("打开原文件:"); scanf("%s", sname);
    printf("目标原文件:"); scanf("%s", dname);

    if ((sfp = fopen(sname, "rb")) == NULL) {    // 以二进制方式打开原文件
        printf("打开原文件失败!\n");
    }
    else {
        if ((dfp = fopen(dname, "wb")) == NULL) {    // 以二进制方式打开目标文件
            printf("打开目标文件失败!");
        }
        else {
            while ((ch = fread(&i, sizeof(char), 1, sfp)) != EOF) {  // 读取原文件中的字符,直到文件末尾
                fwrite(&i, sizeof(char), 1, dfp);  // 将读取的字符写入目标文件
            }
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值