【C언어 입문】 좋아하는 사람과 옆자리가 될 확률을 구한다

15196 단어 C초보자알고리즘

소개



봄이라고 하면 만남의 계절.

신학기가 시작되어 첫 자리 교체는 조금 긴장한 기억이 있습니다.
하지만, 신경이 쓰이는 사람이 근처의 자리가 되면 기쁘다.

따라서 신경이 쓰이는 사람들이 가까운 자리에 앉을 확률을 계산하는 프로그램
쓰려고 합니다.

페어워크를 하고 싶다



전제로, 수업에는 N명의 열이 M열이고 M×N명의 학생이 있다고 가정합니다.
또한 어느 좌석도 같은 확률로 맞는 것으로 합니다.

우선 요구하고 싶은 것은 옆의 자리가 될 확률이군요.
다만, 옆의 자리라고 해도 1열째와 2열째, 3열째와 4열째 등으로 옆이 된 쪽이 자리가 가까워지거나, 페어워크가 생기거나 한다.

그래서 이 페어워크가 할 수 있는 옆을 가치 옆이라고 명명해, 좌우를 구별하지 않는 옆과 구별해, 어느 쪽의 확률도 요구하기로 합니다. 이어서 전후 좌우에 어느 것에 인접할 확률도 구합니다.

이중 루프 사용



for문 안에, 한층 더 for문으로 처리를 실시한 것을 이중 루프라고 합니다.
이번에는 외부 루프로 자신의 자리를, 내부 루프에서 신경이 쓰이는 사람의 자리를 돌려갑니다.
for(int i = 1; i <= seats; I++)           //自分を座席番号1から全て試す
    {
        for(int j = 1; j <= seats; j++)   //好きな人を座席番号1から全て試す
        { 
            //ここに処理をかく
        }
     }


if 문 사용



if 문은 조건 분기 처리를 수행하기위한 명령문입니다.

구체적으로는, 「조건 A가 성립하는 경우, 처리 A´를 한다」라고 하는 것을 시키기 위한 수법입니다.

여기에서는 「석끼리의 정해진 관계」가 조건이 되어, 조건이 성립했을 경우는 「성립한 횟수를 세는」라고 하는 처리를 실시합니다.

예를 들어, 조건이 "좌우를 구별하지 않는 옆이 된다"면,,
  //自分と好きな人の座席番号がN(rows)だけ離れているとき、隣の席になる
     if(( i-j == rows) || ( j-i == rows)) 
        {
             trials++; tonari++; rinsetsu++;
           //全体の試行回数、隣が成立する回数、隣接する回数をそれぞれ1ずつ増やす   
        }


좋아하는 사람 옆에 있을 확률은



마지막으로, N(세로 일렬의 인원수)과 M(열수)를 입력하면, 신경이 쓰이는 사람과 진짜 옆이 되는, 옆이 되는, 인접하는 확률을 각각 구하는 프로그램을 썼습니다.

이것은 위에서 설명한 for문과 if문의 지식만으로 거의 쓸 수 있다고 생각합니다.
#include<stdio.h>
#include<stdlib.h>

int main(void)
{
    int columns, rows, seats, trials=0, gachi_tonari=0, tonari=0, rinsetsu=0;


    printf("縦と横の列の数を入力してください。\n");
    printf("\n");

   //columnsに縦列数、rowsに横列数を代入する
    printf("縦列 :"); scanf("%d",&columns);
    printf("横列 :"); scanf("%d",&rows);

    seats = columns * rows;

    for(int i = 1; i <= seats; i++)
    {
        for(int j = 1; j <= seats; j++)
        {  
      //自分と好きな人の座席番号が同じ(現実的にありえない)ときはそれ以降の処理を行わない 
            if(i == j){
                continue;       
            }
      //自分が縦1,3,5...の奇数列目にいるとき、座席番号が好きな人よりNだけ小さいならガチ隣
            if(( (i-1)/rows % 2 == 0) && ( j-i == rows ))             
            {
                trials++; gachi_tonari++; tonari++; rinsetsu++;   
            }
     //自分が縦の2,4,6...の偶数列目にいるとき、座席番号が好きな人よりNだけ大きいならガチ隣
            else if(( (i-1)/rows % 2 == 1) && ( i-j == rows))         
            {
                trials++; gachi_tonari++; tonari++; rinsetsu++;   
            }
    //自分と好きな人の座席番号がNだけ離れているとき、隣の席
            else if(( i-j == rows) || ( j-i == rows))             
            {
                trials++; tonari++; rinsetsu++;                 
            }
    //好きな人と座席番号が1つ違いのとき
            else if(( i-j == 1) || ( j-i == 1))                   
            {
      //かつ自分が一番後ろの席のとき
                if(i % rows == 0)           
                {
            //好きな人の後ろの席ならば隣接できる
                    if(i>j){                
                        trials++; rinsetsu++;
                    }
                    else{
                        trials++;
                    }  
                }
       //かつ自分が一番前の席のとき
                else if(i % rows == 1)      
                {
            //好きな人の前の席ならば隣接できる
                    if(i<j){                
                        trials++; rinsetsu++;
                    }
                    else{
                        trials++;
                    }

                }
        //このとき、先頭でも一番後ろでもなければ必ず隣接できる
                else                        
                {
                    trials++; rinsetsu++;
                }

            }
        //上記のどれにも当てはまらないとき、席は離れている
            else                            
            {
                trials++;
            }
        }
    }

    printf("座席数:%d\n", columns * rows);
    printf("組合せ総数:%d回、 ガチ隣:%d回、 隣:%d回、 隣接:%d回 \n" ,trials, gachi_tonari, tonari, rinsetsu);

    printf("ガチ隣になれる確率: %fパーセント\n", (double)gachi_tonari / trials * 100);
    printf("隣の席になれる確率: %fパーセント\n", (double)tonari / trials * 100);
    printf("席が隣接する可能性: %fパーセント\n", (double)rinsetsu / trials * 100);
}


덧붙여서 세로열이 6열, 가로열이 7열의 교실로서 시험해 보았더니,

좌석 수: 42
조합 총수: 1722회, 가치 옆: 42회, 옆: 70회, 인접: 142회
가치 옆에 있을 확률: 2.439024%
옆자리가 될 확률: 4.065041%
좌석이 인접할 가능성: 8.246225%

라는 결과였습니다.
그렇다고는 해도, 이것을 아는 곳에서 옆이 될 확률이 오르는 것도 아닙니다만…

좋은 웹페이지 즐겨찾기