iOSフェーズ学習6日目ノート(配列)
24867 ワード
iOS学習(C言語)知識点整理
一、整数配列
1)概念:同じタイプで空間的に連続的に分布するデータのセット.
2)int a[10]int型には10個の要素があり,配列の名前はa,aは配列のヘッダアドレスである.
3)配列内の要素a[i]:配列名+下付き、下付きは0から始まる.
4)配列要素の個数が配列長に相当することを完全初期化と呼ぶ.
5)配列の遍歴は配列内のすべての要素にアクセスする.
6)要素のアドレス&a[0]アドレス記号+配列名+下付き
7)入力を遍歴し、アクセスが限界を越えられない、境界を越えたコンパイラが検査できない、大きな安全リスクがある
8)int配列のsizeofは配列長に4を掛ける
9)部分初期化後の省略部分は全て0とする.
10)int a[5]={0} ;int a[5]={}; 部分初期化、全ゼロ補完配列
11)配列の最大下位は配列の長さを1つ減らすことである:int a[]={1,2,3,4,5}len=sizeof(a)/sizeof(int);最大下付きはlen-1です.
12)配列長[]内は定数、符号定数のみ
13)配列の初期化
①. Int list[5]={2,13,58,55,19};//一般的な書き方
②. Int list[5]={6,17};//最初の2つの要素のみに値を割り当てます.
③. Int list[5]={[3]=25,[4]=51};//指定した要素に値を割り当てます.ここでは3番目と4番目です.
④. Int list[]={11,12,13}.//正しく、右側の要素が確定すると、個数はここで3つ省略できます.
⑤. Int list[];//エラー、コンパイラはどれだけのストレージ領域を割り当てるべきか分からない
⑥. Int list[5]; list ={17,18,19,20,21};//エラー、配列の定義時にのみこのように初期化できます
⑦. Int list[‘A’]={1,2,3};//正しく、agesに相当する[65]
⑧. Int count=5;int list[count];//初期化を行わないと、この書き方が正しいので、コンパイラは20バイトの記憶領域を割り当てると誤報することはありません.
list[0]=1; list[1]=2;このように配列の要素に値を割り当てることができるが,2,3,4などの要素の値は不確定である.
⑨.int count=5;int list[count]={1,2,3,4,5};//この書き方は誤りで、配列を定義するときに配列を初期化し、要素の個数は
定数または書かないで、変数ではありません.
14)フィポラチ数列1,1,2,3,5,8,13,21,34...
実装コード:
二、並べ替え
1)ソートの選択:無秩序数列から最小を選択するたびに、整列キューの後ろに配置
例えばint a[]={12,3556,0,9,78}
1. 0]3,556,12,9,78
2. 0,3],556,12,9,78
3. 0,3,9]12,556,78
4. 0,3,9,12]556,78
5. 0,3,9,12,78]556
実装コード:
2)泡立ち順:大数が沈み、小数が浮き上がる
隣接する要素を比較します.1つ目が2つ目より大きい場合は、2つを交換します.
int a[]={12,3,556,0,9,78};
1ラウンドで比較すると、5回かかります
1.1 [3,12],556,0,9,78
1.2 3,[12,556],0,9,78
1.3 3,12,[0,556],9,78
1.4 3,12,0,[9,556],78
1.5 3,12,0,9,[78566]->1ラウンドが終了し,最大数が底部に沈んでソートされる
実装コード:
3)ソートの挿入
int a[]={12,3,556,0,9,78};
初期化12[3556,0,9,78]
1. 3,12[556,0,9,78]
2. 3,12,556[0,9,78]
3. 0,3,12,556[9,78]
4. 0,3,9,12,556,[78]
5. 0,3,9,12,78,556
{12,33,556,0,9,78}
実装コード:
三、文字配列
1)文字配列の有効長をstrlen(配列名)で計算する
2)例:
小文字を大文字に変換する実装コード:
四、二次元配列
1)例:
2 D配列による楊輝三角の印刷
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
実装コード:
五、サードパーティ変数を使用しないでデータ交換を実現する
実装コード:
一、整数配列
1)概念:同じタイプで空間的に連続的に分布するデータのセット.
2)int a[10]int型には10個の要素があり,配列の名前はa,aは配列のヘッダアドレスである.
3)配列内の要素a[i]:配列名+下付き、下付きは0から始まる.
4)配列要素の個数が配列長に相当することを完全初期化と呼ぶ.
5)配列の遍歴は配列内のすべての要素にアクセスする.
6)要素のアドレス&a[0]アドレス記号+配列名+下付き
7)入力を遍歴し、アクセスが限界を越えられない、境界を越えたコンパイラが検査できない、大きな安全リスクがある
8)int配列のsizeofは配列長に4を掛ける
9)部分初期化後の省略部分は全て0とする.
10)int a[5]={0} ;int a[5]={}; 部分初期化、全ゼロ補完配列
11)配列の最大下位は配列の長さを1つ減らすことである:int a[]={1,2,3,4,5}len=sizeof(a)/sizeof(int);最大下付きはlen-1です.
12)配列長[]内は定数、符号定数のみ
13)配列の初期化
①. Int list[5]={2,13,58,55,19};//一般的な書き方
②. Int list[5]={6,17};//最初の2つの要素のみに値を割り当てます.
③. Int list[5]={[3]=25,[4]=51};//指定した要素に値を割り当てます.ここでは3番目と4番目です.
④. Int list[]={11,12,13}.//正しく、右側の要素が確定すると、個数はここで3つ省略できます.
⑤. Int list[];//エラー、コンパイラはどれだけのストレージ領域を割り当てるべきか分からない
⑥. Int list[5]; list ={17,18,19,20,21};//エラー、配列の定義時にのみこのように初期化できます
⑦. Int list[‘A’]={1,2,3};//正しく、agesに相当する[65]
⑧. Int count=5;int list[count];//初期化を行わないと、この書き方が正しいので、コンパイラは20バイトの記憶領域を割り当てると誤報することはありません.
list[0]=1; list[1]=2;このように配列の要素に値を割り当てることができるが,2,3,4などの要素の値は不確定である.
⑨.int count=5;int list[count]={1,2,3,4,5};//この書き方は誤りで、配列を定義するときに配列を初期化し、要素の個数は
定数または書かないで、変数ではありません.
14)フィポラチ数列1,1,2,3,5,8,13,21,34...
実装コード:
1 int main(){
2 int arr[20]={};
3 for (int i=0; i<20; i++) {
4 if(i<=1)
5 arr[i]=1;
6 else
7 arr[i]=arr[i-1]+arr[i-2];
8 }
9 for (int i=0; i<20; i++) {
10 printf("%d ",arr[i]);
11 }
12 return 0;
13 }
二、並べ替え
1)ソートの選択:無秩序数列から最小を選択するたびに、整列キューの後ろに配置
例えばint a[]={12,3556,0,9,78}
1. 0]3,556,12,9,78
2. 0,3],556,12,9,78
3. 0,3,9]12,556,78
4. 0,3,9,12]556,78
5. 0,3,9,12,78]556
実装コード:
1 int main(){
2 int a[]={12,3,556,0,9,78};
3 int len = sizeof(a)/sizeof(int);
4 int k;//
5 int temp;
6 // len-1
7 for(int i=0;i<len-1;i++){
8 // a[i]~a[len-1] , a[i]
9 k=i;
10 for(int j=i+1;j<len;j++){
11 if(a[j]<a[k]){
12 k=j;
13 }
14 }
15
16 //a[k] a[i]
17 if(k!=i){
18 temp = a[k];
19 a[k] = a[i];
20 a[i] = temp;
21 }
22 }
23
24 for(int i=0;i<len;i++){
25 printf("%d ",a[i]);
26 }
27 return 0;
28 }
2)泡立ち順:大数が沈み、小数が浮き上がる
隣接する要素を比較します.1つ目が2つ目より大きい場合は、2つを交換します.
int a[]={12,3,556,0,9,78};
1ラウンドで比較すると、5回かかります
1.1 [3,12],556,0,9,78
1.2 3,[12,556],0,9,78
1.3 3,12,[0,556],9,78
1.4 3,12,0,[9,556],78
1.5 3,12,0,9,[78566]->1ラウンドが終了し,最大数が底部に沈んでソートされる
実装コード:
1 int main()
2 {
3 int a[]={12,3,556,0,9,78};
4 int temp;
5 int len = sizeof(a)/sizeof(int);
6 // len-1
7 for(int i=0;i<len-1;i++){
8 // :a[0]~a[len-1-i],
9 // > ,
10 //i=0, : a[len-2],a[len-1]
11 for(int j=0;j<len-1-i;j++){
12 if(a[j]>a[j+1]){
13 temp = a[j];
14 a[j] = a[j+1];
15 a[j+1] = temp;
16 }
17 }
18 }
19
20 for(int i=0;i<len;i++){
21 printf("%d ",a[i]);
22 }
23 return 0;
24 }
3)ソートの挿入
int a[]={12,3,556,0,9,78};
初期化12[3556,0,9,78]
1. 3,12[556,0,9,78]
2. 3,12,556[0,9,78]
3. 0,3,12,556[9,78]
4. 0,3,9,12,556,[78]
5. 0,3,9,12,78,556
{12,33,556,0,9,78}
実装コード:
1 int main()
2 {
3 int a[]={12,3,556,0,9,78};
4 int len = sizeof(a)/sizeof(int);
5 int insert = 0;
6 // len-1
7 for(int i=0;i<len-1;i++){
8 // a[i+1] a[0]~a[i]
9 insert = a[i+1];
10 for(int j=0;j<=i;j++){
11 if(a[j]>insert){
12 // a[j]
13 // a[j]~a[i]
14 printf("insert %d,pos = %d
",insert,j);
15 for(int k=i;k>=j;k--){
16 a[k+1]=a[k];
17 }
18 // insert
19 a[j]= insert;
20 break;
21 }
22 }
23
24 for(int ii=0;ii<len;ii++){
25 printf("%d ",a[ii]);
26 }
27 printf("
");
28 }
29
30 for(int ii=0;ii<len;ii++){
31 printf("%d ",a[ii]);
32 }
33 return 0;
34 }
三、文字配列
1)文字配列の有効長をstrlen(配列名)で計算する
2)例:
小文字を大文字に変換する実装コード:
1 int main(){
2 char str[10]={'h','e','l','l','o'};
3 int len = (int)strlen(str);
4 //
5 for(int i=0;i<len;i++){
6 if(str[i]>='a'&&str[i]<='z'){
7 str[i] = str[i]- ('a'-'A');
8 }
9 }
10 printf("%s",str);
11
12 return 0;
13 }
四、二次元配列
1)例:
2 D配列による楊輝三角の印刷
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
実装コード:
1 int main(){
2 int a[10][10];
3 for(int i=0;i<10;i++){
4 for(int j=0;j<=i;j++){
5 if(j==0||i==j)
6 a[i][j]=1;
7 else
8 a[i][j]=a[i-1][j]+a[i-1][j-1];
9 }
10 }
11
12 for(int i=0;i<10;i++){
13 for(int j=0;j<=i;j++){
14 printf("%5d",a[i][j]);
15 }
16 printf("
");
17 }
18 return 0;
19 }
五、サードパーティ変数を使用しないでデータ交換を実現する
実装コード:
1 int main(){
2 int a=20,b=30;
3 a=a+b;
4 b=a-b;
5 a=a-b;
6 printf("a=%d;b=%d",a,b);
7
8 return 0;
9 }