《明解C语言》示例代码和练习代码[第12章]

第12章 结构体


示例代码:


示例代码12-1
/*
    将5名学生的“身高”按升序排列 
*/

#include <stdio.h>

#define NUMBER 5  // 学生人数

// 交换x和y指向的整数值
void swap(int *x, int *y)
{
    int temp = *x;
    *x = *y;
    *y = temp;     
} 

// 将数组data的前n个元素按升序排列
void sort(int data[], int n)
{
     int k = n - 1;
     while (k >= 0) {
         int i, j;
         for (i = 1, j = -1; i <= k; i++)
             if (data[i - 1] > data[i]) {
                 j = i - 1;
                 swap(&data[i], &data[j]);
             }
         k = j;
     }
} 

int main(void)
{
    int i;
    int height[] = {178, 175, 173, 165, 179};
    
    sort(height, NUMBER);
    
    for (i = 0; i < NUMBER; i++)
        printf("%2d : %4d\n", i + 1, height[i]);
    return (0);    
}

示例代码12-2
/*
    对5名学生的“姓名和身高”按身高进行升序排序 
*/

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

#define NUMBER 5                                   // 学生人数 

// 交换x和y指向的整数值
void swap(int *x, int *y)
{
    int temp = *x;
    *x = *y;
    *y = temp;     
} 

// 将sx和sy指向的字符串进行交换
void swaps(char sx[], char sy[])
{
    char temp[256];
    
    strcpy(temp, sx);
    strcpy(sx, sy);
    strcpy(sy, temp);     
} 

// 对数组data和name的前n个元素进行升序排序
void sort(int data[], char name[][20], int n)
{
     int k = n - 1;
     while (k >= 0) {
         int i, j;
         for (i = 1, j = -1; i <= k; i++)
             if (data[i - 1] > data[i]) {
                 j = i - 1;
                 swap(&data[i], &data[j]);
                 swaps(name[i], name[j]);
             }
         k = j;
     }
} 

int main(void)
{
    int i;
    int height[] = {178, 175, 173, 165, 179};
    char name[][20] = {"Sato", "Sanka", "Takao", "Mike", "Masaki"};
    
    sort(height, name, NUMBER);
    
    for (i = 0; i < NUMBER; i++)
        printf("%2d : %-8s%4d\n", i + 1, name[i], height[i]);
    
    return (0);    
}

示例代码12-3
/*
    用表示学生的结构体来显示佐中的信息 
*/ 

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

struct gstudent {
    char name[20];                    // 姓名
    int  height;                      // 身高
    float weight;                     // 体重
    long school;                      // 奖学金     
};

int main(void)
{
    struct gstudent sanaka;
    
    strcpy(sanaka.name, "Sanaka");    // 姓名
    sanaka.height = 175;              // 身高
    sanaka.weight = 60.5;             // 体重
    sanaka.school = 70000;            // 奖学金
    
    printf("姓  名 = %s\n",  sanaka.name); 
    printf("身  高 = %d\n",  sanaka.height);
    printf("体  重 = %f\n",  sanaka.weight);
    printf("奖学金 = %ld\n", sanaka.school);
    
    return (0);  
}

示例代码12-4
/*
    对表示学生的结构体成员佐中进行初始化 
*/ 

#include <stdio.h>

struct gstudent {
    char name[20];                    // 姓名
    int  height;                      // 身高
    float weight;                     // 体重
    long school;                      // 奖学金     
};

int main(void)
{
    struct gstudent sanaka = {"Sanaka", 175, 60.5, 70000};
    
    printf("姓  名 = %s\n",  sanaka.name); 
    printf("身  高 = %d\n",  sanaka.height);
    printf("体  重 = %f\n",  sanaka.weight);
    printf("奖学金 = %ld\n", sanaka.school);
    
    return (0);  
}

示例代码12-5
/*
    拥有超能力的洋子 
*/ 

#include <stdio.h>

struct gstudent {
    char name[20];                    // 姓名
    int  height;                      // 身高
    float weight;                     // 体重
    long school;                      // 奖学金     
};

void hiroko(struct gstudent *std)
{
    if ((*std).height < 180) (*std).height = 180; 
    if ((*std).weight > 80)  (*std).weight = 80;    
}

int main(void)
{
    struct gstudent sanaka = {"Sanaka", 175, 60.5, 70000};
    
    hiroko(&sanaka);
    
    printf("姓  名 = %s\n",  sanaka.name); 
    printf("身  高 = %d\n",  sanaka.height);
    printf("体  重 = %f\n",  sanaka.weight);
    printf("奖学金 = %ld\n", sanaka.school);
    
    return (0);  
}

示例代码12-6
/*
    拥有超能力的洋子 (其二)
*/ 

#include <stdio.h>

// 表示学生的结构体 
typedef struct {
    char name[20];                    // 姓名
    int  height;                      // 身高
    float weight;                     // 体重
    long school;                      // 奖学金     
} student;

void hiroko(student *std)
{
    if (std->height < 180) std->height = 180; 
    if (std->weight > 80)  std->weight = 80;    
}

int main(void)
{
    student sanaka = {"Sanaka", 175, 60.5, 70000};
    
    hiroko(&sanaka);
    
    printf("姓  名 = %s\n",  sanaka.name); 
    printf("身  高 = %d\n",  sanaka.height);
    printf("体  重 = %f\n",  sanaka.weight);
    printf("奖学金 = %ld\n", sanaka.school);
    
    return (0);  
}

示例代码12-7
/*
    返回结构体的函数 
*/

#include <stdio.h>

struct xyz {
    int mx;
    long my;
    double mz;
};

// 返回结构体xyz
struct xyz set_xyz(int x, long y, double z)
{
    struct xyz temp;
    
    temp.mx = x;
    temp.my = y;
    temp.mz = z;
    return (temp);       
} 

int main(void)
{
    struct xyz xyz = {0, 0, 0};
    
    xyz = set_xyz(10, 320, 35.6);
    
    printf("xyz.mx = %d\n", xyz.mx); 
    printf("xyz.my = %ld\n", xyz.my);
    printf("xyz.mz = %f\n", xyz.mz);  
    
    return (0); 
}

示例代码12-8
/*
    将5名学生按身高进行升序排序 
*/

#include <stdio.h>

#define NUMBER 5   // 学生人数

typedef struct {
    char name[20];                    // 姓名
    int  height;                      // 身高
    float weight;                     // 体重
    long school;                      // 奖学金     
} student;

// 对x和y指向的学生进行交换 
void swap(student *x, student *y)
{
    student temp = *x;
    *x = *y;
    *y = temp;     
}

// 对数组data的前n个元素按身高进行升序排列
void sort(student data[], int n)
{
    int k = n - 1;
    while (k >= 0) {
        int i, j;
        for (i = 1, j = -1; i <= k; i++)
            if (data[i - 1].height > data[i].height) {
                j = i - 1;
                swap(&data[i], &data[j]);
            } 
        k = j;   
    }     
} 


int main(void)
{
    int i;
    student std[] = {
        {"Sato", 178, 61.0, 80000},
        {"Sanaka", 175, 60.5, 70000},
        {"Takao", 173, 80.0, 0},
        {"Mike", 165, 72.0, 70000},
        {"Masaki", 179, 77.5, 70000},       
    };
    
    sort(std, NUMBER);
    
    puts("-------------------------");
    for (i = 0; i < NUMBER; i++)
        printf("%-8s %6d%6.1f%7ld\n", 
            std[i].name, std[i].height, std[i].weight, std[i].school);
    puts("-------------------------");
    
    return (0);
        
}

示例代码12-9
/*
    显示当天日期 
*/

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

void put_date(void)
{
    time_t current;
    struct tm *local;
    char wday_name[][7] = {"日", "一", "二", "三", "四", "五", "六"}; 
    
    time(¤t);              // 取得当前时间
    local = localtime(¤t); // 转换为本地时间的结构体
    printf("%4d 年 %02d 月 %02d 日 (%s)", local->tm_year + 1900      // 年
                                        , local->tm_mon + 1          // 月 
                                        , local->tm_mday             // 日 
                                        , wday_name[local->tm_wday]);// 星期
                                         
}

int main(void)
{
    printf("今天是");
    put_date();
    printf("。\n");
    
    return (0);     
}

示例代码12-10
/*
    计算两点之间的距离 
*/

#include <math.h>
#include <stdio.h>

#define sqr(n)  ((n)*(n))   // 计算乘方

typedef struct {            // 点 
    int x;                  // x坐标 
    int y;                  // y坐标 
} point;

// 返回点pa和点pb之间的距离
double distanceof(point pa, point pb)
{
    return (sqrt(sqr(pa.x - pb.x) + sqr(pa.y - pb.y)));       
} 

int main(void)
{
    point p1, p2;
    
    printf("点1的x坐标:");    scanf("%d", &p1.x); 
    printf("     y坐标:");    scanf("%d", &p1.y); 
    printf("点2的x坐标:");    scanf("%d", &p2.x); 
    printf("     y坐标:");    scanf("%d", &p2.y); 
    
    printf("两点之间的距离为%.2f。\n", distanceof(p1, p2));
    
    return (0);   
}

示例代码12-11
/*
    汽车行驶与燃料消耗 
*/

#include <math.h>
#include <stdio.h>

#define sqr(n)  ((n)*(n))   // 计算乘方

typedef struct {            // 点 
    int x;                  // x坐标 
    int y;                  // y坐标 
} point;

typedef struct {            // 汽车 
    double fuel;            // 剩余燃料 
    point pt;               // 当前位置       
} car;

// 显示当前位置和剩余燃料
void put_info(car c)
{
    printf("当前位置:(%d, %d)\n", c.pt.x, c.pt.y); 
    printf("剩余燃料:%.2f升\n", c.fuel);    
} 

// 向x和y方向行驶(dx,dy)距离
int move(car *c, int dx, int dy)
{
    double dist = sqrt(sqr(dx) + sqr(dy)); 
    if (dist > c->fuel)
        return (0);
    c->pt.x += dx;    c->pt.y += dy;    c->fuel -= dist;
    return (1);   
} 

int main(void)
{
    car mycar = {90.0, {0, 0}};
    
    while (1) {
        int slct;
        int dx, dy;            // 行驶距离
        
        put_info(mycar);
        printf("开动汽车吗[Yes...1 / No...0]:");
        scanf("%d", &slct);
        if (slct != 1) break;
        printf("X方向的行驶距离:");    scanf("%d", &dx);
        printf("Y方向的行驶距离:");    scanf("%d", &dy);
        
        if (!move(&mycar, dx, dy))
            puts("\a燃料不足无法行驶。");
    }
    return (0); 
}


练习代码:

练习代码e12-1
/*
    编写如下函数,显示当前时间 
*/

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

void put_time(void)
{
     time_t current;
     struct tm *now;
     
     time(¤t);              // 取得当前时间
     now = localtime(¤t); // 转换为本地时间的结构体
     
     printf("%02d:%02d:%02d", now->tm_hour    // 时 
                                , now->tm_min           // 分 
                                , now->tm_sec);         // 秒    
}

int main(void)
{
    printf(" 现在是");
    put_time();
    printf("。\n");
    return (0);     
} 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值