[解题报告]【第16题】给定 n,打印一个直角边为 n 的等边直角三角形

简介: [解题报告]【第16题】给定 n,打印一个直角边为 n 的等边直角三角形

零、写在前面


       这个系列不经常更新,今天这个题目因为英雄哥玩超纲课后题0.0,我们一起看一看,主要知识点在


【第16题】给定 n,打印一个直角边为 n 的等边直角三角形https://blog.csdn.net/WhereIsHeroFrom/article/details/118272189

https://blog.csdn.net/WhereIsHeroFrom/article/details/118272189


一、主要知识点


       1.打印指定的形状的边界判定

#include<stdio.h>
int main() {
    int n, i, j;
    while(scanf("%d", &n) != EOF) {
        for(i = 1; i <= n; ++i) {       // 打印指定行数
            for(j = 1; j <= i; ++j)     // 打印数量与行数相同
                printf("*");            // 打印字符
            printf("\n");               // 换行
        }
    }
    return 0;
}

       2.信号量


首先我们了解下进程互斥需要遵循的四个原则。


1.空闲让进 2.忙则等待 3.有限等待 4.让权等待


其中空闲让进、忙则等待保证了进程的互斥访问。有限等待保证了程序的可执行性质。


让权等待指的是在等待的时候主动休眠放弃cpu的使用权力。


而最常用保证上面的这些的一个机制就是信号量,c语言里面有几个常用的函数帮助我们来实现这些操作。


 

sem_t bar;//创建信号量变量
    sem_init(&(obj->foo),0,1);//初始化 其中第一个参数为信号量地址 第二个是共享范围 0表示在所有进程共享 第三个是初始值 一开始拥有的个数
    sem_wait(&(obj->foo)); //申请信号量 如果能申请到 就减小信号量的个数 往下执行 否则主动睡眠
    sem_post(&(obj->bar)); //释放信号量,给相应的信号量+1,并唤醒相应的进程

二、课后习题


1115. 交替打印FooBar


1115. 交替打印FooBar

https://leetcode-cn.com/problems/print-foobar-alternately/


题目描述


两个不同的线程将会共用一个 FooBar 实例。其中一个线程将会调用 foo() 方法,另一个线程将会调用 bar() 方法。


请设计修改程序,以确保 "foobar" 被输出 n 次。


思路


明显的进程同步问题,也就是foo执行一次 far执行一次。一开始就写了一个不遵循让权等待的简单同步模型,你们应该可以看懂-.-


typedef struct {
    int n;
    int x;    //同步用变量
} FooBar;
FooBar* fooBarCreate(int n) {
    FooBar* obj = (FooBar*) malloc(sizeof(FooBar));
    obj->n = n;
    obj->x = 0;//初始化
    return obj;
}
void foo(FooBar* obj) {
    for (int i = 0; i < obj->n; i++) {
        while(obj->x);        //等待x为0
        // printFoo() outputs "foo". Do not change or remove this line.
        printFoo();
        obj->x=1;        /将x设置为1
    }
}
void bar(FooBar* obj) {
    for (int i = 0; i < obj->n; i++) {
        while(!obj->x);    //等待x为1
        // printBar() outputs "bar". Do not change or remove this line.
        printBar();
        obj->x=0;           //将x设置为0
    }
}
void fooBarFree(FooBar* obj) {
    free(obj);
}


结果


超时!没错 肯定超时 毕竟一直卡在while里


思路2


利用上面说到的给的信号量。


typedef struct {
    int n;
    sem_t foo;//两个信号量
    sem_t bar;
} FooBar;
FooBar* fooBarCreate(int n) {
    FooBar* obj = (FooBar*) malloc(sizeof(FooBar));
    obj->n = n;
    sem_init(&(obj->foo),0,1);//foo先执行所以给1
    sem_init(&(obj->bar),0,0);
    return obj;
}
void foo(FooBar* obj) {
    for (int i = 0; i < obj->n; i++) {
        sem_wait(&(obj->foo));//请求foo
        // printFoo() outputs "foo". Do not change or remove this line.
        printFoo();
        sem_post(&(obj->bar));//释放bar
    }
}
void bar(FooBar* obj) {
    for (int i = 0; i < obj->n; i++) {
        sem_wait(&(obj->bar));//请求bar
        // printBar() outputs "bar". Do not change or remove this line.
        printBar();
        sem_post(&(obj->foo));//释放foo
    }
}
void fooBarFree(FooBar* obj) {
    sem_destroy(&(obj->bar));    
    sem_destroy(&(obj->foo));
    free(obj);
}

写在最后


我还能肝,肝死。。。。大家要加油,无论你们希望成为什么样的人,都需要不焦虑的一步一步靠近它!


相关文章
|
网络协议 前端开发 JavaScript
CentOS 环境下部署 vsftpd
CentOS 环境下部署 vsftpd
513 0
|
机器学习/深度学习 监控 Web App开发
SLS机器学习最佳实战:根因分析(一)
通过算法,快速定位到某个宏观异常在微观粒度的具体表现形式,能够更好的帮助运营同学和运维同学分析大量异常,降低问题定位的时间。
13446 0
|
4月前
|
人工智能 文字识别 自然语言处理
智能体来了:行政文员如何应用 AI 进行批量公文处理深度指南
本文深入解析AI智能体在批量公文处理中的核心架构与企业落地路径,涵盖智能解析、合规审查、自动排版分发等全流程。结合LLM语义理解与RPA自动化,实现效率提升超85%,合规检出率达98%。适用于政府、企业数字化转型实践,提供可复用的技术方案与实施指南。(238字)
800 6
|
域名解析 网络协议 测试技术
性能测试-弱网测试参数选择标准
在当今移动互联网盛行的时代,网络的形态除了有线连接,还有2G/3G/Edge/4G/Wifi等多种手机网络连接方式。不同的协议、不同的制式、不同的速率,使移动应用运行的场景更加丰富。
13782 0
性能测试-弱网测试参数选择标准
|
4月前
|
存储 人工智能 自然语言处理
从真实项目出发,西南智能体实践中AI智能体运营工程师是如何被训练的
随着AI智能体加速落地,西南地区成为应用新热土。本文揭秘“AI智能体运营工程师就业班”实战培养模式:以真实场景驱动,通过金加德等专家指导,系统训练需求拆解、Prompt工程、Coze工作流搭建与RAG调优,助力学员掌握从复刻到原创的全链路能力,打造懂业务、懂技术的复合型人才,抢占智能体时代职业先机。(
215 2
|
9月前
|
弹性计算 运维 负载均衡
阿里云轻量应用服务器产品介绍、收费标准以及搭建个人博客教程参考
本文为大家介绍阿里云轻量应用服务器的产品优势、应用场景、使用须知、地域与网络连通性、与云服务器ECS的区别以及使用轻量应用服务器搭建WordPress个人博客的图文教程,以供大家了解和使用轻量应用服务器。
|
10月前
|
敏捷开发 运维 数据可视化
提升协作效率的秘密武器:2025年DevOps任务可视化工具全解析
开发、测试、运维团队协作常因流程不透明导致效率低下,DevOps任务可视化工具成为解决这一痛点的关键方案。这类工具通过图形化呈现任务流程、状态追踪和CI/CD监控,实现跨团队协作透明化。核心功能包括看板管理、流水线可视化、自动告警等,能显著降低沟通成本,提升交付效率。市场主流工具如Jenkins、GitLab、板栗看板等各有优势,企业需根据规模、集成需求选择合适方案。随着AI和ChatOps发展,未来可视化工具将更智能化,助力企业构建高效DevOps闭环。
324 1
|
12月前
|
存储 安全 物联网
RFID工具柜上的应用
RFID工具柜通过为每个工具粘贴RFID标签,结合智能锁具与管理系统,实现工具的高效、精准和智能化管理。它能自动识别工具信息,记录出入库、借用归还等数据,减少人工操作误差。广泛适用于工厂、实验室、职业院校等场景,提升生产效率与安全性。智能权限管理保障工具安全,软件支持快速盘点与数据分析,优化采购与维护决策。RFID技术的应用显著提高了工具管理效率与准确性。
|
存储 人工智能 安全
《深度解密:AI与元宇宙如何打造数字身份的安全堡垒》
在元宇宙中,数字身份是用户的“虚拟通行证”,关联社交、资产和活动。随着AI与区块链技术的发展,确保其唯一性和安全性成为关键。AI通过生物识别、行为分析等提升验证精度,区块链则以去中心化、加密算法保障数据安全,二者协同构建了高效的数字身份管理体系,为元宇宙的繁荣奠定基础。
371 1
|
人工智能 5G Windows
十分钟私有化部署DeepSeek R1
DeepSeek本地化部署支持下载1.5b、7b、8b、14b、32b等不同参数规模的大模型,适合逻辑推理和计算类问题。普通电脑建议选择1.5b模型以避免AI幻觉。部署需使用Ollama工具下载模型,并通过Chatbox AI等客户端进行配置,确保Ollama运行状态。显卡内存为主要资源占用,各模型占用情况不同,请确保硬盘空间充足。
1936 11