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 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 }