【C 语言经典100例 | 菜鸟教程】C 语言练习实例8

解题思路

数字版的太没意思了。改成“使用C语言打印中文九九乘法表”。

L8.h

//
// Created by crazy_pig on 2022/8/31.
// References from : https://www.runoob.com/cprogramming/c-100-examples.html
//

#ifndef CTEST100_L8_H
#define CTEST100_L8_H

#endif //CTEST100_L8_H

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

#define CHN_CHAR_LEN 4
#define RESULT_CHAR_LEN 10

void getChnDesc(char *chn_num_char, int num);

void getSingleCnChar(char *chnNum, const char charArray[][CHN_CHAR_LEN], int index);

void copyArray(char *dstArray, const char *srcArray, int dst_offset);

/**
 * 题目:输出9*9口诀。
 * 程序分析:分行与列考虑,共 9 行 9 列,i 控制行,j 控制列。
 */
void L8();

L8.c

//
// Created by crazy_pig on 2022/8/31.
// References from : https://www.runoob.com/cprogramming/c-100-examples.html
//

#include <string.h>
#include "../include/L8.h"

/**
 * 题目:输出9*9口诀。
 * 程序分析:分行与列考虑,共 9 行 9 列,i 控制行,j 控制列。
 */
void L8() {
    int row, column, product;
    char *clnChar = (char *) malloc(CHN_CHAR_LEN);
    char *rowChar = (char *) malloc(CHN_CHAR_LEN);
    char *productChar = (char *) malloc(RESULT_CHAR_LEN);

    // 行:1-9
    for (row = 1; row <= 9; row++) {
        // 列:1-行数
        for (column = 1; column <= row; column++) {
            product = row * column;
            getChnDesc(clnChar, column);
            getChnDesc(rowChar, row);
            getChnDesc(productChar, product);

            printf("%s%s%s%s\t",
                   clnChar,
                   rowChar,
                   product >= 10 ? "" : "得",
                   productChar);

        }
        printf("\n");
    }
}

/**
 * 取得数字对应的中文
 * @param num 数字
 * @return 数字中文
 */
void getChnDesc(char *chn_num_char, int num) {
    char num_char_array[10][4] = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
    char unit_ten[1][4] = {"拾"};
    int last = 0, head = 0;
    if (num >= 10) {
        last = num % 10;
        head = num / 10;
    } else {
        last = num;
    }
    if (head != 0) {
        // 拼接十位和个位
        char *ten = (char *) malloc(CHN_CHAR_LEN);
        char *one = (char *) malloc(CHN_CHAR_LEN);
        getSingleCnChar(ten, num_char_array, head);
        copyArray(chn_num_char, ten, 0);
        copyArray(chn_num_char, unit_ten[0], 3);

        if (last > 0) {
            getSingleCnChar(one, num_char_array, last);
            copyArray(chn_num_char, one, 6);
            chn_num_char[9] = '\0';
        } else {
            // 中文发音习惯,零在最后不读
            chn_num_char[6] = '\0';
        }
    } else {
        // 直接返回
        getSingleCnChar(chn_num_char, num_char_array, last);
    }
}

void copyArray(char *dstArray, const char *srcArray, int dst_offset) {
    for (int i = 0; i < CHN_CHAR_LEN; ++i) {
        dstArray[i + dst_offset] = srcArray[i];
    }
}

void getSingleCnChar(char *chnNum, const char charArray[][CHN_CHAR_LEN], int index) {
    for (int i = 0; i < CHN_CHAR_LEN; ++i) {
        chnNum[i] = charArray[index][i];
    }
}

Result

在这里插入图片描述

第一篇 基础知识篇 实例1 数据类型转换 实例2 转义字符 实例3 关系和逻辑运算 实例4 自增自减 实例5 普通位运算 实例6 位移运算 实例7 字符译码 实例8 指针操作符 实例9 if判断语句 实例10 else-if语句 实例11 嵌套if语句 实例12 switch语句 实例13 for语句 实例14 while语句 实例15 do-while语句 实例16 break和continue语句 // 实例17 exit()语句 // 实例18 综合实例 实例19 一维数组 实例20 二维数组 实例21 字符数组 // 实例22 数组初始化 // 实例23 数组应用 实例24 函数的值调用 实例25 函数的引用调用 //swap 实例26 数组函数的调用 // 实例27 命令行变元 // 实例28 函数的返回值 实例29 函数的嵌套调用 实例30 函数的递归调用 实例31 局部和全局变量 实例32 变量的存储类别 实例33 内部和外部函数 实例34 综合实例1 实例35 综合实例2 实例36 变量的指针 实例37 一维数组指针 实例38 二维数组指针 实例39 字符串指针 实例40 函数指针 实例41 指针数组 实例42 二维指针 实例43 指针的初始化 实例44 综合实例 第二篇 深入提高篇 实例45 结构体变量 实例46 结构体数组 实例47 结构体指针变量 实例48 结构体指针数组 实例49 共用体变量 实例50 枚举类型 实例51 读写字符 实例52 读写字符串 实例53 格式化输出函数 实例54 格式化输入函数 实例55 打开和关闭文件 实例56 fputc()和fgetc() 实例57 函数rewind() 实例58 fread()和fwrite() 实例59 fprintf()和fscanf() 实例60 随机存取 实例61 错误处理 实例62 综合实例 实例63 动态分配函数 实例64 常用时间函数 实例65 转换函数 实例66 查找函数 实例67 跳转函数 实例68 排序函数 实例69 伪随机数生成 实例70 可变数目变元 第三篇 常用算法实例71 链表的建立 实例72 链表的基本操作 实例73 队列的应用 实例74 堆栈的应用 实例75 串的应用 实例76 树的基本操作 实例77 冒泡排序法 实例78 堆排序 实例79 归并排序 实例80 磁盘文件排序 实例81 顺序查找 实例82 二分法查找 实例83 树的动态查找 实例84 二分法求解方程 实例85 牛顿迭代法求解方程 实例86 弦截法求解方程 实例87 拉格朗日插值 // 实例88 最小二乘法拟合 ?? 实例89 辛普生数值积分 实例90 改进欧拉法 实例91 龙格-库塔法 实例92 高斯消去法 实例93 正定矩阵求逆 第四篇 综合应用篇 实例94 用C语言实现遗传算法 实例95 人工神经网络的C语言实现 实例96 K_均值算法 实例97 ISODATA算法 实例98 快速傅立叶变换 实例99 求解野人与传教士问题 实例100 简单专家系统
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值