当前位置: 首页 > article >正文

C语言创意编程:用趣味实例玩转基础语法(2)

文章目录

    • 0. 前言
    • 1. 📊 动态条形图
      • 1.1 程序效果展示
      • 1.2 完整代码解析
      • 1.3 关键技术详解
        • 1.3.1 Unicode字符应用
        • 1.3.2 函数封装思想
        • 1.3.3 输入处理
        • 1.3.4 跨平台考虑
    • 2. 🔤 字母金字塔
      • 2.1 程序效果展示
      • 2.2 完整代码解析
      • 2.3 关键技术详解
        • 2.3.1 嵌套循环结构
        • 2.3.2 字符运算技巧
        • 2.3.3 对称输出算法
        • 2.3.4 格式化输出
    • 3. 🔄 指针魔术:变量交换
      • 3.1 程序效果展示
      • 3.2 完整代码解析
      • 3.3 关键技术详解
        • 3.3.1 指针基础
        • 3.3.2 无临时变量交换算法
        • 3.3.3 潜在问题
        • 3.3.4 指针参数传递
    • 4. 总结

0. 前言

📣按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解及成果,但是内容可能存在不准确的地方。如果发现文中错误,希望批评指正,共同进步。

本文仍然是通过实例学习C语言,避免枯燥无味地学习。

1. 📊 动态条形图

1.1 程序效果展示

动态条形图是一种直观的数据可视化方式,在我们的程序中,使用Unicode字符"█"来构建条形图。用户输入条形长度后,程序会立即生成对应的条形图。

动态条形图演示

1.2 完整代码解析

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>void draw_bar(int length)
{for (int i=0; i < length; i++)printf("\u2588"); // \u2588代表 █
}int main()
{int bar_length;printf("输入条形长度:");scanf("%d", &bar_length);draw_bar(bar_length);return 0;
}

1.3 关键技术详解

1.3.1 Unicode字符应用

程序中使用了\u2588来表示"█"字符,这是Unicode中的全块字符。Unicode为各种符号提供了统一的编码标准,在终端显示中能够呈现完整的方块效果,非常适合用于构建条形图。

1.3.2 函数封装思想

draw_bar()函数将条形图的绘制逻辑封装起来,体现了模块化编程的思想。这种封装使得:

  • 主函数更加简洁清晰
  • 条形图绘制逻辑可以复用
  • 便于后期维护和扩展
1.3.3 输入处理

使用scanf()函数获取用户输入,虽然简单但存在安全隐患。在实际项目中,建议添加输入验证,确保输入的是有效数字。

1.3.4 跨平台考虑

Unicode字符在不同平台上的显示可能有所差异。在开发跨平台应用时,需要测试在各个终端中的显示效果。

2. 🔤 字母金字塔

2.1 程序效果展示

字母金字塔是一个经典的编程练习题,它展示了如何通过嵌套循环控制字符输出,形成美观的对称图案。

字母金字塔演示

2.2 完整代码解析

#define _CRT_SECURE_NO_WARNINGS  
#include <stdio.h>               int main()
{int rows;  printf("输入金字塔层数:");  scanf("%d", &rows);         for (int i = 0; i < rows; i++){for (int j = 0; j < rows - i - 1; j++)printf(" ");for (char c = 'A'; c < 'A' + i; c++)printf("%c", c);for (char c = 'A' + i; c >= 'A'; c--)printf("%c", c);printf("\n"); }return 0;  
}

2.3 关键技术详解

2.3.1 嵌套循环结构

程序使用了三层嵌套循环:

  1. 外层循环控制金字塔的行数
  2. 第一个内层循环控制每行前面的空格数量
  3. 后两个内层循环分别处理字母的升序和降序输出
2.3.2 字符运算技巧

'A' + i利用了ASCII码的特性,通过整数运算得到对应的字母字符。这种技巧在生成序列字符时非常有用。

2.3.3 对称输出算法

字母金字塔的关键在于对称输出:

  1. 先输出从’A’开始的升序字母(不包含顶点)
  2. 然后输出从当前字母开始的降序字母(包含顶点)
    这种算法保证了金字塔的对称性。
2.3.4 格式化输出

通过精确控制空格和字符的输出数量,实现了金字塔的居中对齐效果。这种格式化输出技巧在文本界面编程中非常重要。

3. 🔄 指针魔术:变量交换

3.1 程序效果展示

指针是C语言的精髓所在。这个实例展示了如何通过指针操作实现两个变量的交换,而无需使用临时变量。

变量交换演示

3.2 完整代码解析

#include <stdio.h>               void swap(int* a, int* b)
{*a = *a + *b;*b = *a - *b;*a = *a - *b;
}int main()
{int x = 10; int y = 20;printf("交换前x=%d,y=%d\n", x, y);swap(&x, &y);printf("交换后x=%d,y=%d\n", x, y);
}

3.3 关键技术详解

3.3.1 指针基础

指针是存储内存地址的变量。在这个例子中:

  • int* a声明了一个指向整数的指针
  • &x获取变量x的内存地址
  • *a解引用指针,访问指针指向的值
3.3.2 无临时变量交换算法

交换过程分为三步:

  1. *a = *a + *b:将两数之和存入a指向的内存
  2. *b = *a - *b:用和减去原始b值,得到原始a值存入b
  3. *a = *a - *b:用和减去现在的b值(原始a),得到原始b值存入a
3.3.3 潜在问题

虽然这种交换方法很巧妙,但存在两个潜在问题:

  1. 整数溢出:当a和b值很大时,相加可能超出int的范围
  2. 同一地址:如果a和b指向同一内存,会导致错误结果
3.3.4 指针参数传递

函数通过指针参数修改外部变量的值,这是C语言中实现"引用传递"效果的方式。理解这一点对掌握C函数调用机制至关重要。

4. 总结

通过这三个实例,我们学习了C语言的多个核心概念:

  1. 基础语法:变量、循环、条件判断
  2. 核心概念:函数、指针、内存管理
  3. 实用技巧:Unicode字符、格式化输出、算法设计
  4. 编程思想:模块化设计、代码复用、问题分解

相关文章:

C语言创意编程:用趣味实例玩转基础语法(2)

文章目录 0. 前言1. &#x1f4ca; 动态条形图1.1 程序效果展示1.2 完整代码解析1.3 关键技术详解1.3.1 Unicode字符应用1.3.2 函数封装思想1.3.3 输入处理1.3.4 跨平台考虑 2. &#x1f524; 字母金字塔2.1 程序效果展示2.2 完整代码解析2.3 关键技术详解2.3.1 嵌套循环结构2.…...

关于近期中国移动民用家庭网络,新增的UDP网络限制。

在近期中国移动在全国一定范围普及新的打击 “PCDN、P2P、HY/HY2” 等流氓网络应用的技术方案&#xff0c;并接入在 “省/州” 的边界网关路由上。 根据遥测数据的具体研究分析&#xff0c;且本人曾非常生气的详细质询过&#xff0c;移动城域网管理人员&#xff0c;可以确认该技…...

OpenCV CUDA模块图像处理------颜色空间处理之GPU 上对两张带有 Alpha 通道的图像进行合成操作函数alphaComp()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数用于在 GPU 上对两张带有 Alpha 通道的图像进行合成操作。支持多种常见的 Alpha 合成模式&#xff08;Porter-Duff 合成规则&#xff09;&…...

OpenWebUI(1)源码学习构建

1. 前言 通过docker镜像拉取安装就不介绍了&#xff0c;官方的命令很多。本节主要撸一撸源码&#xff0c;所以&#xff0c;本地构建 2. 技术框架和启动环境 后端python&#xff0c;前端svelte 环境要求&#xff1a;python > 3.11 &#xff0c;Node.js > 20.10 3. 源…...

npm error Cannot find module ‘negotiator‘ 的处理

本想运行npm create vuelatest&#xff0c;但提示&#xff1a; npm error code MODULE_NOT_FOUND npm error Cannot find module negotiator npm error Require stack: npm error - C:\Users\Administrator\AppData\Roaming\nvm\v18.16.1\node_modules\npm\node_modules\tuf-j…...

爬虫入门指南-某专利网站的专利数据查询并存储

免责声明 本教程仅用于教育目的&#xff0c;演示如何合法获取公开专利数据。在实际操作前&#xff0c;请务必&#xff1a; 1. 仔细阅读目标网站的robots.txt文件和服务条款 2. 控制请求频率&#xff0c;避免对服务器造成负担 3. 仅获取和使用公开数据 4. 不用于商业用途或…...

SQL(Database Modifications)

目录 Insertion Specifying Attributes in INSERT Adding Default Values&#xff08;缺省值&#xff09; Inserting Many Tuples Creating a Table Using the SELECT INTO Statement Deletion Example: Deletion Semantics of Deletion Updates Example: Update Sev…...

【android bluetooth 案例分析 04】【Carplay 详解 2】【Carplay 连接之手机主动连车机】

1. 背景 在【android bluetooth 案例分析 04】【Carplay 详解 1】【CarPlay 在车机侧的蓝牙通信原理与角色划分详解】中我们从整理上介绍了车机中 carplay 相关基础概念。 本节 将详细分析 iphone手机主动 连接 车机carplay 这一过程。 先回顾一下 上一节&#xff0c; carpla…...

maven离线将jar包导入到本地仓库中

想将本地的 jnetpcap.jar 包安装到 Maven 的本地仓库中,以便在项目中通过如下依赖方式引用。 <dependency><groupId>org.jnetpcap</groupId><artifactId>jnetpcap...

【仿muduo库实现并发服务器】实现时间轮定时器

实现时间轮定时器 1.时间轮定时器原理2.项目中实现目的3.实现功能3.1构造定时任务类3.2构造时间轮定时器每秒钟往后移动添加定时任务刷新定时任务取消定时任务 4.完整代码 1.时间轮定时器原理 时间轮定时器的原理类似于时钟&#xff0c;比如现在12点&#xff0c;定一个3点的闹…...

Conda更换镜像源教程:加速Python包下载

Conda更换镜像源教程&#xff1a;加速Python包下载 为什么要更换conda镜像源&#xff1f; Conda作为Python的包管理和环境管理工具&#xff0c;默认使用的是国外镜像源&#xff0c;在国内下载速度往往较慢。通过更换为国内镜像源&#xff0c;可以显著提高包下载速度&#xff…...

蓝桥杯 盗墓分赃2

原题目链接 问题描述 在一个探险者的团队中&#xff0c;小明和小红是合作的盗墓贼。 他们成功盗取了一座古墓中的宝藏&#xff0c;包括 n 件不同重量的珍贵文物和黄金&#xff0c;第 i 件宝藏的重量为 ai。 现在&#xff0c;他们希望公平地分配这些宝藏&#xff0c;使得小明…...

深度解读 Qwen3 大语言模型的关键技术

一、模型架构设计 Qwen3 延续了当前主流大型语言模型的 Transformer 架构,并在此基础上进行了多项增强设计,包含特殊的 Transformer 变体、位置编码机制改进、混合专家 (MoE) 技术引入,以及支持多模态和双重思考模式的新特性。 1. Transformer 基础架构与增强 基础架构:…...

使用 mysqldump 获取 MySQL 表的完整创建 DDL

要获取 MySQL 中某个表的完整创建 DDL&#xff08;仅结构&#xff0c;不含数据&#xff09;&#xff0c;可以使用 mysqldump 工具的以下命令&#xff1a; 基本命令格式 bash mysqldump -h [主机名] -u [用户名] -p --no-data --single-transaction --routines --triggers --…...

day15 leetcode-hot100-28(链表7)

2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; 1.模拟 思路 最核心的一点就是将两个链表模拟为等长&#xff0c;不足的假设为0&#xff1b; &#xff08;1&#xff09;设置一个新链表newl来代表相加结果。 &#xff08;2&#xff09;链表1与链表2相加&#xff0c;具…...

阿里云云效对接SDK获取流水线制品

参考文档&#xff1a; API旧版 企业令牌 https://help.aliyun.com/zh/yunxiao/developer-reference/api-reference API新版 个人令牌 https://help.aliyun.com/zh/yunxiao/developer-reference/api-reference-standard-proprietary API 个人令牌 https://www.alibabacloud.com…...

Qt 相关 编译流程及交叉编译 部署所遇到的问题总结-持续更新

准备环境和工具 1、主机环境 ubuntu20 2、交叉编译器 gcc-linaro-6.3.1…arm-linux-gnuebihf 3、QT5源码包qt-5.11.3_sources 下载qt-5.11.3的包&#xff0c;自己想办法下载 网盘啥的 都ok&#xff0c;再访问下载目录就可以显示了。 Index of /archive/qt 4、依赖库安装 sudo …...

前端面经 DNSxieyi1

域名解析协议 域名转为目标IP地址 两种方式 1 递归查询 A请求B B一定会告诉IP 2迭代查询 A请求B 如果B无能 &#xff0c;B会告诉A如何获得改内容&#xff0c;但是B自己不会发出请求1 步骤 1.检查浏览器DNS 2.没有命中继续查询操作系统的DNS缓存 3.查询本地域名服务器&…...

如何通过ES实现SQL风格的查询?

一、Spring项目集成方案 添加依赖(pom.xml)&#xff1a; <dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>8.12.0</version> </dependency> <dependency><…...

​​知识图谱:重构认知的智能革命​

在数字经济的浪潮中&#xff0c;知识图谱正悄然掀起一场认知革命。它不仅是技术的迭代&#xff0c;更是人类从“数据依赖”迈向“知识驱动”的里程碑。当谷歌用知识图谱优化搜索引擎、银行用它穿透复杂的金融欺诈网络、医院用它辅助癌症诊疗时&#xff0c;这项技术已悄然渗透到…...

【计算机网络】4网络层①

这篇笔记讲IPv4和IPv6。 为了解决“IP地址耗尽”问题,有三种措施: ①CIDR(延长IPv4使用寿命) ②NAT(延长IPv4使用寿命) ③IPv6(从根本上解决IP地址耗尽问题) IPv6 在考研中考查频率较低,但需掌握基础概念以防冷门考点,重点结合数据报格式和与 IPv4 的对比记忆。…...

MATLAB中的table数据类型:高效数据管理的利器

MATLAB中的table数据类型&#xff1a;高效数据管理的利器 什么是table数据类型&#xff1f; MATLAB中的table是一种用于存储列向数据的数据类型&#xff0c;它将不同类型的数据组织在一个表格结构中&#xff0c;类似于电子表格或数据库表。自R2013b版本引入以来&#xff0c;t…...

Dropout 在大语言模型中的应用:以 GPT 和 BERT 为例

引言 大型语言模型&#xff08;LLMs&#xff09;如 GPT&#xff08;生成式预训练 Transformer&#xff09;和 BERT&#xff08;双向编码器表示 Transformer&#xff09;通过其强大的语言理解和生成能力&#xff0c;彻底改变了自然语言处理&#xff08;NLP&#xff09;领域。然…...

CentOS 7 如何安装libsndfile?

CentOS 7 如何安装libsndfile? # 配置编译环境 yum install -y gcc gcc-c make# 下载libsndfile压缩软件包 wget http://www.mega-nerd.com/libsndfile/files/libsndfile-1.0.25.tar.gztar -xf libsndfile-1.0.25.tar.gz cd libsndfile-1.0.25./configure --prefix/home/libs…...

基于深度学习的语音识别系统设计与实现

以下是为您准备的《基于深度学习的语音识别系统》技术文档,内容包含完整实现方案和详细代码解析: 基于深度学习的语音识别系统设计与实现 目录 语音识别技术概述系统架构设计语音信号预处理深度神经网络模型构建端到端语音识别实现模型训练与优化策略部署与性能优化完整代码…...

gitLab 切换中文模式

点击【头像】--选择settings 选择【language】,选择中文&#xff0c;点击【保存】即可。...

133.在 Vue3 中使用 OpenLayers 实现画多边形、任意编辑、遮罩与剪切处理功能

&#x1f3ac; 效果演示截图&#xff08;先睹为快&#xff09; ✨ 功能概览&#xff1a; ✅ 鼠标画任意形状多边形&#xff1b; ✏️ 点击“修改边界”可拖动顶点&#xff1b; &#x1f7e5; 点击“遮罩”后地图除多边形区域外变红&#xff1b; ✂️ 点击“剪切”后仅显示选…...

4.8.4 利用Spark SQL实现分组排行榜

在本次实战中&#xff0c;我们的目标是利用Spark SQL实现分组排行榜&#xff0c;特别是计算每个学生分数最高的前3个成绩。任务的原始数据由一组学生成绩组成&#xff0c;每个学生可能有多个成绩记录。我们首先将这些数据读入Spark DataFrame&#xff0c;然后按学生姓名分组&am…...

40. 自动化异步测试开发之编写异步业务函数、测试函数和测试类(类写法)

40. 自动化异步测试开发之编写异步业务函数、测试函数和测试类&#xff08;类写法&#xff09; 一、类结构设计解析 1.1 基类设计 class Base:async_driver None # &#x1f697; 存储浏览器驱动实例async def get(self, url: str http://secure.smartbearsoftware.com/.…...

【五子棋在线对战】一.前置知识的了解

前置知识的了解 前言1.Websocketpp1.1 使用Websocketpp的原因1.2 Websocket常用接口1.3 Websocket搭建服务器流程 2.JsonCpp2.1 Json 数据对象类的表示2.2序列化和反序列化的接口2.3 演示代码 3.Mysql![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/93305f423b544fc1…...