陣列
陣列是啥?
陣列是干嘛的?
陣列怎么用?
不管咋樣,先看百科了解億下:
C++ 陣列 —— 菜鳥教程
C++ 支持陣列資料結構,它可以存盤一個固定大小的相同型別元素的順序集合,陣列是用來存盤一系列資料,但它往往被認為是一系列相同型別的變數,
陣列的宣告并不是宣告一個個單獨的變數,比如 number0、number1、...、number99,而是宣告一個陣列變數,比如 numbers,然后使用 numbers[0]、numbers[1]、...、numbers[99] 來代表一個個單獨的變數,陣列中的特定元素可以通過索引訪問,
所有的陣列都是由連續的記憶體位置組成,最低的地址對應第一個元素,最高的地址對應最后一個元素,
這都是啥跟啥啊?!
陣列 array是C++等編程語言里重要的資料結構,后期我們將學 堆疊stack、佇列queue等,
同時,C++里面的vector與Python里面的list差不多,array、list的下標都是從0開始的,為了方便我們后期可能會使用 \(STL\) 大法!
別的先別說了,開搞吧!
陣列也有資料型別,比如有整數型的、長整數型的、浮點型的等等,其中的字符陣列就是字串的一種,
定義方法:
資料型別 陣列名[陣列長度]={陣列內容};
我建議大家在定義陣列時定義在main函式外面,這樣一是方便其他函式使用,二是這樣寫可以給陣列的每個元素賦值為0(變數的值也是0),
在主函式內定義,這種陣列就成為了區域變數,而且用不到的元素C++默認為亂數,有可能你找半天bug也找不到……
要是給一個陣列的每一個元素快速賦值,可以使用memset函式,就像這樣:
// Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int main(){
int a[101];
// 初始化
memset(a,-1,sizeof(a));
// 等同于 int a[101]={};
// 輸出
for(int i=0;i<101;i++){
cout<<a[i]<<" ";
}
return 0;
}
那么,給你出一道題:
請你輸出正整數 \(n\) 各個數位上的數,
輸入:1234
輸出:1 2 3 4
哈哈,可惜你沒學過字串,不然輕輕松松就給秒了,
我們可以使用陣列儲存每一位的數字,然后再輸出,
// Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int n,m,a[101],k;
int main(){
cin>>n;
while(n) a[k++]=n%10,n/=10;
// 倒著輸出
for(int i=k-1;i>=0;i--){
cout<<a[i]<<" ";
}
return 0;
}
你要是再厲害一點兒呢,可以這么寫:
// Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int n,m,a[101],k;
int main(){
cin>>n;
while(n) a[k++]=n%10,n/=10; // 獲取每一位上的數字
// 先把每一位的數字變成正確的順序
for(int i=0;i<k/2;i++){
// 交換兩個變數的值
// swap(a[i],a[k-i-1]);
// swap可以交換兩個變數的值
// 臨時變數法
m=a[i],a[i]=a[k-i-1],a[k-i-1]=m;
}
for(int i=0;i<k;i++){
cout<<a[i]<<" ";
}
return 0;
}
這是個數學原理,要獲取 \(a\) 每一位上的數字,可以這么干:
\[a\ mod\ 10( 獲取最后一位的數字)\Longrightarrow \left \lfloor a{\div} 10 \right \rfloor (a縮小到原來的\frac{1}{10}) \]總之,任何強大的成績,都建立在海量的刷題之上,
來做個倆題兒吧:


第一題不難,你應該已經有思路了吧?!
很簡單,用上剛剛的陣列知識,解個這種題嘎嘎簡單!
//Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,a[101],k=0;
while(cin>>n){
a[k++]=n;
}
for(int i=k-1;i>=0;i--){
if(a[i]==0) continue;
cout<<a[i]<<" ";
}
return 0;
}
后面這個也不難,掌握方法就行,
// Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,a[101],b[101],k=0;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=n-1;i>=0;i--){
int x=0;
for(int j=i;j>=0;j--){
if(a[j]<a[i]) x++;
}
b[k++]=x;
}
for(int i=k-1;i>=0;i--){
cout<<b[i]<<" ";
}
return 0;
}
以下內容為作死,慎重使用
P1427 這個題官方給出的演算法標簽是遞回和堆疊??,倒也不是不行,不過很有趣,
拓展:考試的時候,測題機會在末尾加上
ctrl+z退出,所以我們可以利用這一特性來做題,因為這個鍵(^Z=ctrl+z)能終止死回圈,所以我們只需要在輸入時判斷是否為這個鍵就行了;而這個鍵的bool值為假,所以輸入時就會自動判斷了,
模擬法:// Author:PanDaoxi #include <bits/stdc++.h> using namespace std; int main(){ int a[101]={},k=0; while(cin>>a[k++]); // 輸入資料 // 如果不是0就輸出 for(int i=k-2;i>=0;i--) if(a[i]!=0) cout<<a[i]<<" "; return 0; }
遞回法:
// Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int x;
void f(int k){
if(k==0) return;
cin>>x;
f(x);
cout<<k<<" ";
}
int main(){
cin>>x;
f(x);
return 0;
}
堆疊法:
// Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int main(){
stack<int> st;
int n,m;
while(cin>>n){
st.push(n);
}
while(!st.empty()){
m=st.top();
if(m!=0) cout<<m<<" ";
st.pop();
}
return 0;
}
寶劍鋒從磨礪出,梅花香自苦寒來!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/500671.html
標籤:C++

