0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

用C語(yǔ)言構(gòu)建高效的嵌入式程序

玩轉(zhuǎn)單片機(jī)與嵌入式 ? 來(lái)源:玩轉(zhuǎn)單片機(jī)與嵌入式 ? 2023-12-21 09:27 ? 次閱讀

1、引言

嵌入式工程師在編寫C語(yǔ)言程序時(shí),需要注重效率和清晰的思路。本文將通過(guò)解析經(jīng)典問(wèn)題“猴子選大王”來(lái)展示如何用C語(yǔ)言思維方式構(gòu)建高效、清晰的程序。

2、問(wèn)題描述

考慮一群猴子,手拉手排成一個(gè)圓,從任意一只猴子開(kāi)始從1開(kāi)始報(bào)數(shù),當(dāng)遇到要排除的數(shù)時(shí)該猴子退出圈,從下一只猴子開(kāi)始繼續(xù)從1報(bào)數(shù),如此反復(fù),最終剩下的猴子為大王。

3、程序構(gòu)架

數(shù)據(jù)獲取

通過(guò)printf和scanf獲取猴子的總數(shù)、起始位置和要排除的數(shù)。注意處理異常情況,確保輸入合法性。

printf("input total num:");
scanf("%d", &n);
printf("from which num begin:");
scanf("%d", &k);
if(k > n || k == 0) {
    printf("please input the right begin num");
    return 1; 
}
printf("input the out num:");
scanf("%d", &m);
if(m > n || m == 0) { 
    printf("please input the right del num");
    return 2; 
}

數(shù)據(jù)運(yùn)算

使用循環(huán)鏈表構(gòu)建“猴子”的圓圈,靈活運(yùn)用C語(yǔ)言指針操作。注意內(nèi)存的動(dòng)態(tài)分配和釋放。

typedef struct node {
    int data;
    struct node *next;
} linklist;


/* 創(chuàng)建循環(huán)鏈表,頭節(jié)點(diǎn)也存信息 */
linklist *head = (linklist*)malloc(sizeof(linklist));
linklist *p = head;
p->data = 1;
p->next = p;


/* 初始化循環(huán)鏈表 */
for (int i = 2; i <= n; i++) {
    linklist *s = (linklist*)malloc(sizeof(linklist));
    s->data = i;
    s->next = p->next;
    p->next = s;
    p = p->next;
}

提高程序運(yùn)行速率

避免過(guò)度使用循環(huán),更多地使用指針操作

/* 找到第 k 個(gè)節(jié)點(diǎn) */
p = head;
for (int i = 1; i <= k; i++) {
    p = p->next;
}

4、邏輯實(shí)現(xiàn)

保存初始“猴子”圓圈參數(shù)

/* 保存節(jié)點(diǎn)總數(shù) */
int total = n;
printf("
the out num:");
linklist *q = head;

猴子查數(shù)

猴子查數(shù)是關(guān)鍵,需要找到開(kāi)始的“猴子”數(shù)、刪除該“猴子”、將刪除的循環(huán)鏈表首尾連接起來(lái)。

/* 只剩一個(gè)節(jié)點(diǎn)時(shí)停止循環(huán) */
while (total != 1) {
    /* 報(bào)數(shù)過(guò)程,p指向要?jiǎng)h除的節(jié)點(diǎn) */
    for (int i = 1; i < m; i++) {
        p = p->next;
    }


    /* 打印要?jiǎng)h除的節(jié)點(diǎn)序號(hào) */
    printf("[%d] ", p->data);


    /* q 指向 p 節(jié)點(diǎn)的前驅(qū) */
    while (q->next != p) {
        q = q->next;
    }


    /* 刪除 p 節(jié)點(diǎn) */
    q->next = p->next;


    /* 保存被刪除節(jié)點(diǎn)指針 */
    linklist *s = p;


    /* p 指向被刪除節(jié)點(diǎn)的后繼 */
    p = p->next;


    /* 釋放被刪除的節(jié)點(diǎn) */
    free(s);


    /* 節(jié)點(diǎn)個(gè)數(shù)減一 */
    total--;
}


/* 打印最后剩下的節(jié)點(diǎn)序號(hào) */
printf("

the last num:[%d] 

", p->data);
free(p);

5、結(jié)論

通過(guò)以上程序?qū)崿F(xiàn),展示了用C語(yǔ)言思維方式構(gòu)建高效、清晰的嵌入式程序的過(guò)程。重點(diǎn)在于數(shù)據(jù)獲取、數(shù)據(jù)運(yùn)算和指針操作的靈活運(yùn)用。這個(gè)例子雖然簡(jiǎn)單,但在實(shí)際嵌入式開(kāi)發(fā)中,這種思維方式將有助于處理更復(fù)雜的問(wèn)題和提高程序的運(yùn)行效率。 希望本文能夠幫助嵌入式工程師更好地理解和運(yùn)用C語(yǔ)言,構(gòu)建出更為優(yōu)秀的嵌入式系統(tǒng)。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5082

    文章

    19123

    瀏覽量

    305143
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7604

    瀏覽量

    136808
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3787

    瀏覽量

    81038

原文標(biāo)題:用C語(yǔ)言構(gòu)建高效、清晰思路的嵌入式程序:猴子選大王問(wèn)題解析

文章出處:【微信號(hào):玩轉(zhuǎn)單片機(jī)與嵌入式,微信公眾號(hào):玩轉(zhuǎn)單片機(jī)與嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    嵌入式c語(yǔ)言編程(由淺入深)

    本內(nèi)容詳細(xì)介紹了嵌入式c語(yǔ)言編程的各項(xiàng)知識(shí),包括嵌入式c語(yǔ)言編程,
    發(fā)表于 11-02 14:37 ?0次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>c</b><b class='flag-5'>語(yǔ)言</b>編程(由淺入深)

    嵌入式CC++語(yǔ)言精華文章集錦

    C/C++語(yǔ)言深層探索,包括嵌入式程序員需要知道的幾個(gè)問(wèn)題,嵌入式系統(tǒng)編程修煉,基ARM的
    發(fā)表于 03-04 15:20 ?13次下載

    嵌入式C的主要特點(diǎn)以及嵌入式C與標(biāo)準(zhǔn)C異同沖區(qū)重用

    嵌入式C發(fā)展迅速, 而且成為最受歡迎的語(yǔ)言之一, 主要因?yàn)樗哂袕?qiáng)大的功能。嵌入式C加上一些匯
    發(fā)表于 05-29 14:24 ?3776次閱讀

    你不知道嵌入式工程師,耍起C語(yǔ)言的萬(wàn)能“三板斧”!

    關(guān)鍵詞:嵌入式C語(yǔ)言 作為嵌入式工程師,寫一個(gè)效率高效,思路清晰的C
    發(fā)表于 04-22 15:59 ?1075次閱讀

    嵌入式系統(tǒng)C語(yǔ)言的特點(diǎn)及程序設(shè)計(jì)中代碼優(yōu)化的技巧

    目前,在嵌入式系統(tǒng)開(kāi)發(fā)中可使用的語(yǔ)言很多,其中 C語(yǔ)言應(yīng)用得最廣泛。雖然 C
    的頭像 發(fā)表于 09-02 09:14 ?2950次閱讀

    嵌入式C語(yǔ)言-文件操

    嵌入式C語(yǔ)言-文件操(嵌入式開(kāi)發(fā)需要什么證書(shū))-嵌入式C
    發(fā)表于 07-30 11:56 ?15次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>-文件操<b class='flag-5'>用</b>

    嵌入式開(kāi)發(fā)語(yǔ)言-C語(yǔ)言編程

    C語(yǔ)言編程概述環(huán)境在Windows上構(gòu)建C語(yǔ)言的環(huán)境安裝在Mac上構(gòu)建
    發(fā)表于 10-20 09:59 ?17次下載
    <b class='flag-5'>嵌入式</b>開(kāi)發(fā)<b class='flag-5'>語(yǔ)言</b>-<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>編程

    標(biāo)準(zhǔn)c語(yǔ)言嵌入式,嵌入式C語(yǔ)言C語(yǔ)言的區(qū)別

    嵌入式C語(yǔ)言C語(yǔ)言的區(qū)別:最常用的系統(tǒng)編程語(yǔ)言C
    發(fā)表于 10-20 14:06 ?6次下載
    標(biāo)準(zhǔn)<b class='flag-5'>c</b><b class='flag-5'>語(yǔ)言</b>與<b class='flag-5'>嵌入式</b>,<b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>與<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>的區(qū)別

    嵌入式linux c語(yǔ)言,嵌入式LinuxC語(yǔ)言開(kāi)發(fā)工具.pdf

    2 章 嵌入式Linux C 語(yǔ)言開(kāi)發(fā)工具本章目標(biāo)任何應(yīng)用程序的開(kāi)發(fā)都離不開(kāi)編輯器、編譯器及調(diào)試器,嵌入式Linux 的
    發(fā)表于 11-01 17:38 ?12次下載
    <b class='flag-5'>嵌入式</b>linux <b class='flag-5'>c</b><b class='flag-5'>語(yǔ)言</b>,<b class='flag-5'>嵌入式</b>LinuxC<b class='flag-5'>語(yǔ)言</b>開(kāi)發(fā)工具.pdf

    什么是嵌入式開(kāi)發(fā)?為什么C語(yǔ)言作為開(kāi)發(fā)語(yǔ)言

    內(nèi)部做開(kāi)發(fā)的,而操作系統(tǒng)所有的內(nèi)核都是C語(yǔ)言所編寫的,所以說(shuō)在嵌入式開(kāi)發(fā)的過(guò)程中也選擇C語(yǔ)言,肯定是具有一定的優(yōu)勢(shì)的。而且
    發(fā)表于 11-02 18:50 ?12次下載
    什么是<b class='flag-5'>嵌入式</b>開(kāi)發(fā)?為什么<b class='flag-5'>用</b><b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>作為開(kāi)發(fā)<b class='flag-5'>語(yǔ)言</b>?

    C語(yǔ)言嵌入式培訓(xùn) 嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)

      學(xué)習(xí)嵌入式的基礎(chǔ)語(yǔ)言C語(yǔ)言,因此先掌握C語(yǔ)言對(duì)于后續(xù)
    發(fā)表于 11-03 21:06 ?32次下載
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b><b class='flag-5'>嵌入式</b>培訓(xùn)  <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b><b class='flag-5'>程序</b>設(shè)計(jì)基礎(chǔ)

    嵌入式C++編程

    編程特性來(lái)構(gòu)建嵌入式系統(tǒng)您將了解如何將您的系統(tǒng)與外部外圍設(shè)備以及使用驅(qū)動(dòng)程序的有效方式集成指導(dǎo)您測(cè)試和優(yōu)化代碼以獲得更好的性能并實(shí)現(xiàn)有用的設(shè)計(jì)模式將了解如何使用 Qt,這是用于構(gòu)建
    發(fā)表于 11-04 10:36 ?10次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b>++編程

    嵌入式C語(yǔ)言知識(shí)總結(jié)

    1 嵌入式C語(yǔ)言總結(jié)從語(yǔ)法上來(lái)說(shuō)C語(yǔ)言并不復(fù)雜, 但編寫優(yōu)質(zhì)可靠的嵌入式
    發(fā)表于 12-20 19:44 ?12次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>知識(shí)總結(jié)

    如何寫出高效嵌入式C語(yǔ)言程序

    作為嵌入式工程師,怎么寫出效率高、思路清晰的C語(yǔ)言程序呢?
    發(fā)表于 08-18 10:42 ?296次閱讀

    嵌入式C語(yǔ)言的結(jié)構(gòu)特點(diǎn)

    過(guò)程中,不論是基于寄存器開(kāi)發(fā)還是基于庫(kù)開(kāi)發(fā),深入理解和掌握嵌入式C語(yǔ)言的函數(shù)、指針、結(jié)構(gòu)體是學(xué)習(xí)STM32的關(guān)鍵。嵌入式C
    的頭像 發(fā)表于 11-24 16:16 ?692次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>的結(jié)構(gòu)特點(diǎn)