大一プログラミングノート(C言語入門)

134722 ワード

第一章緒論
1.1プログラム、プログラム設計及びプログラム設計言語
1.1.1プログラムとプログラム設計
プログラム:特定の機能を実現できる命令シーケンスの集合であり、これらの命令シーケンスはコンピュータがある問題を解く作業ステップ命令を記述している:コンピュータが識別できる命令プログラム設計:特定の問題を解決するプログラムを与える過程は、ソフトウェア構造活動の重要な構成部分である.プログラム設計は往々にしてあるプログラム設計言語をツールとし、このような言語で書かれたプログラムを与える.プログラマー:プロフェッショナルプログラマー
1.1.2プログラミング言語
  • 1 G L------機械言語
  • 2 GL------アセンブリ言語
  • 3 GL------上級言語:
  •          :C
              :Java、C++、C#.....
    
  • 4 GL------非プロセス言語
  • 5 GL------知識型言語
  • 1.2プログラムの基本構成
    良いプログラミングスタイルはプログラム学習にとってこの半分の効果を発揮し、プログラム言語を学ぶときに必ず意識してほしい.
    #include 
    int main()
    {
     	printf("Hello World!
    "
    ); return 0; }
    #include 
    int Add(int x,int y);
    int main()
    {
    	int x,y,z;
        scanf("%d%d",&x,&y);
        z=Add(x,y);
        printf("%d",z);
        return 0;
    }
    int Add(int x,int y)
    {
        return x+y;
    }
    

    1.2.2基本文字セット(C言語)
    英数字空白文字特殊文字
    1.2.3文法単位
    単語:プログラミング言語の文法単位
  • 1.キーワード:プログラム設計言語が予め宣言した単語で、特殊な意味と役割を持っています.例えばint
  • 2.識別子:プログラマが宣言する単語で、各種プログラムオブジェクト(変数、タイプ、関数、ファイルなど)の名前
  • を表す.
    C言語における識別子の構成規則:アルファベットまたは下線で_開始文字、アンダースコア_または数字は大文字と小文字を構成し、異なる識別子を表します.
  • 3.演算子
  • 4.区切り記号
  • 1.2.4構文単位
    1.式2.文3.関数:ライブラリ関数、カスタム関数
    1.2.5プログラム
    1.プログラムの構成2.前処理命令:#で始まる命令前処理:プログラムを機械命令に翻訳する前に、注釈のフィルタリング、ファイルの含むなど、プログラムに対するいくつかの編集処理を行います.#include:ライブラリファイルをプログラムに含め、ライブラリファイルを含めると、そのファイルのすべてのライブラリ関数を直接呼び出すことができます.3.コメント4.main関数5.入出力操作
    scanf("%d",&x);
    printf("%d",x);
    

    1.3プログラムのアップロードプロセス
    1.3.1プログラミング環境:プログラム設計言語によるプログラム開発を行うプログラム設計環境
                   (Integrated Design Environment ,IDE)
    

    1.3.2プログラム編集
    1.3.3プログラムコンパイル
    C言語は,まずコンパイラ(コンパイラとも呼ばれる)がソースプログラムをターゲットプログラムに翻訳し,その後コンピュータがターゲットプログラムを実行するコンパイラ方式を採用している.
    1.3.4プログラム接続
    1.3.5デバッグの実行
    デバッグ:プログラム内でエラーを検索し、エラーを修正するプロセス
    1.4プログラムスタイル
    1.4.1識別子の命名規則(アルパカの書き方)
    符号定数:PI変数:num、studentName関数:Max、PrintTriカスタムデータ型:StudentType DateTypeグローバル変数:Gnum、Gsecret
    1.4.2コメント
    //
    /**/
    

    1.4.3インデント
    1.4.4文書形式
    int main(){
       return 0;
    }
    
    int main()
    {
       return 0;
    }
    

    1.5.3
    /*      ——      */
    #include 
    int main()
    {
        int M,N;
        int chicken,rabbit;
        scanf("%d%d",&M,&N);
        for(chicken=0;chicken<=M;chicken++)
        {
            rabbit=M-chicken;
            if(2*chicken+4*rabbit==N)break; 
       }
       if(chicken<=M)
       printf("%d %d",chicken,rabbit);
       else
       printf("NO ANSWER");
       return 0;
    }
    

    第二章データの保存と表示
    #include 
    #define PI 3.14
    int main()
    {
        int radius; double area;
        radius=10;
        area=PI*radius*radius;
        printf("%6.2f
    "
    ,area); return 0; }

    2.1データの保存
    2.1.1バイナリ
    2.1.2メモリ
    ビットバイト:8ビットバイナリ各メモリセルの番号をメモリアドレス(アドレスと略称)と呼ぶ
    2.2基本データ型
    2.2.1整形
    (int)4バイトnビットバイナリで表すことができる整数範囲-2(n-1)~(2(n-1)-1)オーバーフロー:演算結果がシステムで表すことができる整数範囲を超えた場合、演算は誤った結果を得る.
    2.2.2実型
    (float)    4             10^(-38)~10^(38)
                      
    (double)   8            10^(-308)~10^(308)
    

    2.2.3文字型(char)1バイト
    char ch='a';
    ch-32='A';
    char ch='5';
    ch-'0'=      
    

    2.2.4論理型(ブール型)(bool)
    2.3定数
    2.3.1字面定数
         1.       1.1       eg:123
                       1.2       eg:3.14
          2.       1.1       eg:'a'
                      1.2       eg:"abc"
    

    エスケープ文字:反斜線で始まり、反斜線の後ろの文字を別の意味に変換することを意味します.
    2.3.2符号定数:字面定数を識別子で表す(実際には字面定数に名前を付ける)
    1.#defineで符号定数を定義する
    #define PI 3.14
    

    2.constで符号定数を定義する
    const double PI=3.14

    2.4変数
    2.4.1変数
    アドレス:変数が存在するメモリセルのアドレス変数名:変数が存在するメモリセルのアシスト変数値:対応するメモリセルに格納されているデータ、すなわちその変数が持つ値タイプ:変数が属するデータタイプ
    2.4.2変数の定義と初期化
    int a;
    a=1;
    

    2.4.3変数の割り当て
    int a=1;
    a=a+10;
    

    第三章データの演算処理
    3.1算術演算
    #include 
    int main()
    {
        int x=3,y=5,z=8;
        int sum;
        sum=x+y+z;
        printf("%6.2f
    "
    ,(double)sum/3); return 0; }

    3.1.1算術演算:算術演算子、演算対象及び括弧からなる式を算術式と呼ぶ.
    3.1.2演算子の優先度と結合性
    3.2論理演算
    #include
    int main()
    {
        int year=2014;
        if((year%4==0&&year%100=0)||(year%400==0))
        printf("yes");
        else
        printf("no");
        return 0;
    }
    

    3.2.1関係演算:比較演算、つまり2つの値を比較する.
                 、                    。
    

    3.2.2論理演算
                 、                    。
    

    3.3割付演算
    3.3.1賦値演算

    3.3.2自増/自減演算
    3.4その他の演算
    3.4.1カンマ演算
    3.4.2長さ演算sizeof(タイプまたは式)をとる
    3.4.3条件演算
    int i=2,j=3,k;
    k=i>j?i:j;
    

    3.5演算オブジェクトのタイプ変換
    3.5.1自動変換
    char->short->int->long->float->double
    

    3.5.2強制変換:プログラマはあるデータのタイプを強制的に変更する.(明示的なタイプ変換とも呼ばれます)
    (     )  (   )
    ():       
    double x=3.6,y=3.8;
    int a;
    a=x+y;
    a=(int)(x+y);
    a=(int)x+y;//  x        floa ,  x     3.6
    

    tips:自動変換でも強制変換でも、今回の演算を実行するためにデータのタイプを一時的に変換するだけで、あるデータの値を1つの中間量に変換し、元のデータのタイプを変更しません.
    第四章プログラムの基本制御構造
    4.1シーケンス構造
    #include//      
    int main()
    {
        int num,x,y,numDevo;
        scanf("%d",&num);
        x=num%10;
        y=num/10;
        numDevo=x*10+y;
        printf("%d",numDevo);
        return 0;
    }
    
        printf("%d %d %5.2f
    "
    ,x,y,(double)x/y);

    複合文:カッコで囲まれた複数の文のペアから構成されます.
        {   temp=x;x=y;y=temp;  }
    

    4.2構造の選択
    #include//    
    int main()
    {
        int x,x1,x2,x3,y;
        scanf("%d",&x);
        x1=x%10;y=x/10;
        x2=y%10;x3=y/10;
        if(x1*x1*x1+x2*x2*x2+x3*x3*x3==x)
        printf("yes");
        else
        printf("no");
        return 0;
    }
    

    4.2.1論理値制御の選択構造
    1.単一ブランチの選択構造(if文)
    max=x;
    if(max<y)
    max=y;
    

    2.二重ブランチの選択構造(if-else文)
    if(x>=y)
    max=x;
    else
    max=y;
    

    tips:判定演算子=:付与演算子=:文if(i=0)...変数iに0を割り当ててから、付与式の結果が0であるかどうかをテストします.この場合,式の演算結果は必ず偽である.
    3.分岐構造のネスト
    if(x>y)
    {
        if(y>z) x=0;
    }
    else
    x=1;
    

    4.2.2算術値制御の選択構造
    switch文(スイッチ文または選択文)
    switch((int)score/10)
    {
        case 10 :
        case  9 : grade='A';break;
        case  8 : grade='B';break;
        case  7 : grade='C';break;
        case  6 : grade='D';break;
        default : grade='E';break;
    }  
    

    4.3循環構造
    循環条件循環体循環変数
    #inlcude//      ,      
    int mian()
    {
        int m,n,r;
        scanf("%d%d",&m,&n);
        r=m%n;
        while(r!=0)
        {
            m=n;n=r;r=m%n;
        }
        printf("%d
    "
    ,n); return 0; }

    4.3.1型循環
    while (   )
    
    /*   n!*/
    result=1;i=1;
    while(i<=n)
    {
        result=result*i;
        i++;
    }
    

    4.3.2型サイクルまで(do-whileサイクル)
    do
    {}while(   )/*    n!*/
    result=1;i=1;
    do
    {
        result=result*i;
        i++;
    }while(i<=n);
    

    4.3.3計数型サイクル
    for(   123)
                         
    {}
    
    /*    n!  */
    for(result=1,i=1;i<=n;i++)
    result=result*i;
    
    
    i=0;
    for(;i<n;i++)
    .......
    
    
    for(i=0;;i++)
    {
        if(i>=n) break;
    }
    
    
    for(i=0;i<n;)
    {
        i++;
    }
    

    4.3.4循環構造の比較
    /*     */
    #include
    int main()
    {
        int x,y=0,unit;
        scanf("%d",&x);
        while(x!=0)
        {
            unit=x%10;
            y=y*10+unit;
            x=x/10;
        }
        printf("%d
    "
    ,y); return 0; } /* */ #include int main() { int x,digits=0; scanf("%d",&x); do { digits++; x=x/10; }while(x!=0); printf("%d
    "
    ,digits); return 0; } /* 2+4+6+...+100 */ #include int mian() { int sum=0,i; for(i=2;i<=100;i=i+2) { sum=sum+i; } printf("%d
    "
    ,sum); return 0; } 4.3.5 /* */ for(i=1;i<=9;i++) { for(j=1;j<=i;j++) printf("%d*%d=%2d",j,i,i*j); printf("
    "
    ); }

    4.4その他の制御文
    /*    */
    #include 
    int main()
    {
        int x,i;
        scanf("%d",&x);
        for(i=2;i<x;i++)
        {
            if(x%i==0)
            break;
        }
        if(i<x)
        printf("yes");
        else
        printf("no");
        return 0;
    }
    
    

    4.4.1 break文
    /*      10   ,        */
    for(flag=0,i=1;i<=10;i++)
    {
        scanf("%d",&x);
        if(x<0)
        {
            flag=1;break;
        }
    }
    if(flag==1)
    printf("yes");
    else
    printf("no");
    

    4.4.2 continue文
    /*      10   ,       */
    for(count=0,i=1;i<=10;i++)
    {
        scanf("%d",&x);
        if(x>=0)continue;
        printf("%4d",x);
        count++;
    }
    printf("
    %d
    "
    ,count);

    4.5プログラム設計例
    /*           */
    #include
    int main()
    {
        int x,y,z,temp;
        scanf("%d%d%d",&x,&y,&z);
        if(x>y)
        {
            temp=x;x=y;y=temp;
       }
       if(z<x)
       {
           temp=z;z=y;y=x;x=temp;
       }
       else if(z<y)
       {
           temp=y;y=z;z=temp;
       }
       printf("%3d%3d%3d
    "
    ,x,y,z); return 0; } /* */ #include int main() { int yy,mm,dd; int i,days,sumDay=0; scanf("%d%d%d",&yy,&mm,&dd); for(i=1;i<mm;i++) { switch(i) { case 1:case 3:case 5:case 7:case 8:case 10:case 12: days=31;break; case 4:case 6:case 9:case 11: days=30;break; case 2: days=28; if((yy%4==0&&yy%100!=0)||(yy%400==0)) days++; break; } sumDay=sumDay+days; } printf("%d
    "
    ,sumDay); return 0; } /* */ #include int main() { int x,y,z; int count=0; for(x=0;x<=20;x++) { for(y=0;y<=33;y++) { z=100-x-y; if((z%3==0)&&(5*x+3*y+z/3==100)) { count++; printf("%d %d %d",x,y,z); } } } if(count==0) printf("this problem have not answer"); return 0; } /* */ #include int main() { int n,n1,n2,i; scanf("%d",&n);// for(n1=2;n1<=n/2;n1++) { n2=n-n1; for(i=2;i<n1;i++) { if(n1%i==0) break; } if(i<n1) continue; for(i=2;i<n2;i++) { if(n2%i==0) break; } if(i>=n2) break; } printf("%d=%d+%d",n,n1,n2); return 0; }

    第五章同型データを一括する組織――配列
    5.1一次元配列
    /*  5.1     */
    #include
    #define N 5
    int main()
    {
        double a[N];
        double sum=0,max=0,min=10;
        int i;
        for(i=0;i<N;i++)
        {
            scanf("%lf",&a[i]);
            sum=sum+a[i];
            if(max<a[i]) max=a[i];
            if(min>a[i]) min=a[i];//           ,            ,    
        }
        printf("%4.lf
    "
    ,(sum-max-min)/(N-2)); return 0; }

    5.1.1一次元配列の定義と初期化
    1.配列の定義:
                                 【       】;
                                       
        //         
        int a[10];
        double b[5];
        char c[80];//         
        
        const int N=10;
        int a[N];//N     ,   int a[10]
    

    2.次元配列要素の参照:
                       【     】
                                 
    

    3.一次元配列の初期化
              【       】={   }int a[10]={0,1,2,3,4,5,6,7,8,9};
    int a[10]={0,1,2,3,4};//   int a[10]={0,1,2,3,4,0,0,0,0,0};
    int a[10]={0};
    int a[]={0,1,2,3,4};//      
    
    

    5.1.2一次元配列の操作
    1.入出力操作
    int a[10],i;
    for(i=0;i<10;i++)
    scanf("%d",&a[i]);
    
    int i,a[10]={1,2,3,4,5,6,7,8,9,10};
    for(i=0;i<10;i++)
    printf("%d",a[i]);
    

    2.賦課操作
    // C   ,                  ,              
    //     memcpy,
    //memcpy(a,b,sizeof(b))     b     a
    int a[10],i;
    for(i=0;i<10;i++)
      a[i]=2*i;                   //                   (                )
    

    3.その他の操作
       ,           ,  ,                        
    int a[10];
    a[0]=1;a[1]=2;
    a[2]=a[0]+a[1]*5;
    
    
    /* 5.1*/
    #include
    #define n 5
    
    int main()
    {
        int r[n]={2,4,8,5,6},i,x;
        scanf("%d",&x);
        for(i=0;i<n;i++)
        if(r[i]==x) break;
        if(i<n)
        printf("yes");
        else
        printf("no");
        return 0;
    }
    

    5.2 2 D配列
    /*  5.2         */
    #include 
    int main()
    {
        int mat[4][4]={{0,1,2,2},{1,0,1,1},{2,1,0,0},{2,1,0,0}};
        int i,j,count=0,degree;
        for(i=0;i<4;i++)
        {
            degree=0;
            for(j=0;j<4;j++)
            {
                degree=degree+mat[i][j];
            }
            if(degree%2!=0)
            count++;
        }
        if(count==0)
        printf("it have a way");
        else
        printf("no way");
        return 0;
    }
    

    5.2.1 2 D配列の定義と初期化
    1.2 D配列の定義
                                   【       】【       】;
                                                      
    int a[10][5];
    double b[5][10];
    char ch[5][80];
    

    2.2 D配列要素の参照3.2 D配列の初期化
    int a[2][3]={1,2,3,4,5,6};
    int b[2][3]={1,2};
    int c[2][3]={{1},{2}};
    int d[2][3]={0};
    

    5.2.2二次元配列の操作
    1.入出力操作2.割り当て操作3.その他の操作
    /* 5.2*/
    #include
    int main()
    {
        int a[10][10],max,i,j,m,n;
        scanf("%d%d",&m,&n);
        printf("%d",m*n);
        for(i=0;i<m;i++)
        for(j=0;j<n;j++)
        scanf("%d",&a[i][j]);
        max=a[0][0];
        for(i=0;i<m;i++)
        for(j=0;j<n;j++)
        if(max<a[i][j])
        max=a[i][j];
        printf("%d",max);
        return 0;
    }
    

    5.3プログラム設計例
    /*  1——    */
    #include
    #define N 5
    int main()
    {
        int r[N],k,i;
        int low=0,high=N-1,mid;
        for(i=0;i<N;i++)
        scanf("%d",&r[i]);
        scanf("%d",&k);
        while(low<=high)
        {
            mid=(low+high)/2;
            if(k<r[mid]) high=mid-1;
            else if(k>r[mid]) low=mid+1;
            else break;
        }
        if(low>high)
        printf("the answer is wrong");
        else
        printf("%d",mid+1);//    +1
    }
    
    
    /*  2——      */
    #include
    #define M 5
    #define N 6
    int main()
    {
        int A[M]={1,3,5,6,8},B[N]={1,2,5,7,8,9},C[M+N];
        int i=0,j=0,k=0;
        while(i<M&&j<N)
        if(A[i]<B[j]) C[k++]=A[i++];
        else C[k++]=B[j++];
        while(i<M)
        C[k++]=A[i++];
        while(j<N)
        C[k++]=B[j++];
        for(k=0;k<M+N;K++)
        printf("%3d",C[k]);
        return 0;
    }
    
    
    /*  3——       */
    #include
    int main()
    {
        int a[10][10],i,j,n,sum=0;
        scanf("%d",&n);
        for(i=0;i<n;i++)
        for(j=0;j<n;j++)
        scanf("%d",&a[i][j]);
        for(i=0;i<n;i++)
        sum=sum+a[i][i];
        for(i=0;i<n;i++)
        sum=sum+a[i][9-i];
        printf("%d",sum);
        return 0;
    }
    

    第六章プログラムの組立ユニット――関数
    6.1ユーザー定義の関数——カスタム関数
    /*   6.1        */
    #include 
    int ComFactor(int m,int n);
    int main()
    {
        int x,y,factor;
        scanf("%d%d",&x,&y);
        factor=ComFactor(x,y);
        printf("the max gcd is %d
    "
    ,factor); return 0; } int ComFactor(int m,int n) { int r; r=m%n; while(r!=0) { m=n; n=r; r=m%n; } return 0; }

    6.1.1関数定義
             (   )         (   )
    {
                            ,    ,        
    }
    
  • には戻り値関数
  • がある.
                              ,        。
    int Fun(int x,int y)
    {
        int z;
        z=x*x+2*x*y+y*y;
        return z;
    }
    
    
    Tips:            ,               ,
            int Fun(int x,int y)    int Fun(int x,y)
                 ,              void ,           。 int Fun(void)
    

    2.戻り値関数なし
                      ,                 。
                            void(   ),     returnvoid Table99(void)
    {
        int i,j;
        for(i=1;i<=9;i++)
        {
            for(j=1;j<=i;j++)
            {
                for(j=1;j<=i;j++)
                printf("%d×%d=%2d",j,i,i*j);
                printf("
    "
    ); } } return; } , , 。 void Table99(void) { }

    Tips:空の関数は、大規模なプログラムの作成、デバッグ、拡張に役立ちます.大きなプログラムではすべての関数を書き出してデバッグできない場合、まだ具体的な内容がない関数では空の関数だけを書くことができ、関数機能を拡張する必要がある場合や、対応する関数のデバッグが終わった後に具体的な内容を補うことができます.
    6.1.2関数呼び出し
    通常、他の関数を呼び出す関数を主調関数、呼び出される関数を被呼び出し関数と呼ぶ.実際のパラメータテーブルの関数名(実パラメータテーブル)——>かっこは省略できません
    /*  6.3 */
    #include 
    int Fun(int x)
    {
        int y;
        y=x*x+2*x+1;
        return y;
    }
    int main()
    {
        int a=10,b;
        b=Fun(5);
        printf("%d",b);
        b=Fun(a);
        printf("%d",b);
        b=Fun(a+8.5);
        printf("b");
        return 0;
    }
    

    6.1.3関数宣言
    C    :          。
    Tips:               ,               ,                  ;
                        ,                  。
    #include
    int Fun(int x);
    int main()
    {
        int a=10,b;
        b=Fun(a);
        printf("%d",b);
        return 0;
    }
    int Fun(int x)
    {
        int y;
        y=x*x+2*x+1;
        return y;
    }
    

    Tips:コンパイラは関数プロトタイプのパラメータの名前に関心を持っていませんが、関数宣言時にパラメータの名前を無視しないほうがいいです.パラメータの名前は各パラメータの目的を注釈し、プログラミング者に関数呼び出し時に実パラメータの順序をどのように手配するかを注意することができます.
    6.2システム定義の関数——ライブラリ関数
    /*    6.2      */
    #include 
    #include 
    int Prime(int x);
    
    int main()
    {
        int a;
        scanf("%d",&a);
        if(Prime(a)==1)
        printf("%d   
    "
    ,a); else printf("%d
    "
    ,a); return 0; } int Prime(int x) { int i,n; n=sqrt(x); for(i=2;i<=n;i++) { if(x%i==0) return 0; } return 1; }

    6.2.1ヘッダファイルとファイルの内容
    C言語のコンパイルシステムでは、ライブラリ関数は、一般に、数学関数、文字列処理関数などの機能別に対応するヘッダファイルに整理されます.ライブラリ関数を使用する場合は、そのライブラリ関数が存在するヘッダファイルをプログラムに含める必要があります.C言語では、#includeファイルに前処理命令が含まれ、ソースプログラムファイルにヘッダファイルが含まれます.
    6.2.2標準入出力関数
    1.文字データの入出力関数
    int getchar(void)
    
    eg:
    char ch;
    ch=getchar();
    

    Tips:キーボードからデータを入力するのは、文字を入力してキーボードバッファに送るのではなく、Enter(リターン)キーを押してからキーボードバッファに送るのです
                      ,     getchar            。
        C              fflush(stdin),         stdio.h 。
    
    int putchar(   )
    
    char ch='A';
    putchar(ch);
    putchar(ch+1);
    putchar('
    '
    );

    2.入出力関数のフォーマット
    int scanf("    ")
    
    int a; scanf("%d",&a);
    int a; scanf("%x",&a);
    int a; scanf("%o",&a);
    float x; scanf("%f",&x);
    double x; scanf("%lf",&x);
    
    int printf("    ")
    

    Tips:コンパイラは通常、関数printfとscanfのフォーマットの個数とリスト内の項目の個数が一致しているかどうかをチェックしたり、フォーマットがリスト内の各項目のデータ型に適しているかどうかをチェックしたりしません.そのため、不正なフォーマットを使用すると、プログラムを実行してわけのわからない結果を得る可能性があります.
    6.2.3ランダム関数
    int rand(void) :void srand(unsigned int seed):     rand        
    unsigned int time(NULL):NULL     stdio.h        , ASC11   0