2016-09-06 16 views
0
#include <iostream> 

using namespace std; 

void input_Array(char (&A)[10][10], int x, int y); 
int calc_Collision(char (&A)[10][10]); 
void display(char (&A)[10][10]); 
void init_Array(char (&A)[10][10]); 

int main() 
{ 
    int m,n,test; 
    char A[10][10]; 
    init_Array(A); 
    cin>>test; 
    while (test>0) 
    { 
    cin>>m>>n; 
    input_Array(A,m,n); 
    display(A); 
    cout<<"FLAG"; 
    cout<<calc_Collision(A); 
    test--; 
    } 
} 

//Calculates no. of ways to select two 1's in each column 
int calc_Collision(char (&A)[10][10]) 
{ 
    int count=0; 
    int sum=0; 
    int select(int x, int y); 
    for (int j = 0; j<10; j++) 
    { 
    count=0; 
    for(int i = 0; i<10; i++) 
    { 
     if (A[i][j]=='1') 
     { 
     count++; 
     } 
    } 
    sum=sum + select(count,2); 
    } 
    return sum; 
} 

//Returns no. of ways to select y items from x items 
int select(int x, int y) 
{ 
    int fact(int a); 
    return (fact(x)/(fact(y)*fact(x-y))); 
} 

//Returns a! 
int fact(int a) 
{ 
    if (a==0) 
    { 
    return 1; 
    } 
    else 
    { 
    return (a*fact(a-1)); 
    } 
} 

void display(char (&A)[10][10]) 
{ 
    for (int i=0; i<10; i++) 
    { 
    for (int j=0; j<10; j++) 
    { 
     cout<<A[i][j]<<"\t"; 
    } 
    cout<<"\n"; 
    } 
} 

入力形式:

ありません。トライアルのセグメンテーション違反[2Dアレイ]

いいえ。行数(空白)はありません。列

ROW1(スペースがありません、1または0のみ)

ROW2 ...の

出力:

2D配列

合計がありません。各列に2つの1年代を選択する方法の

問題:

プログラムは罰金十分な配列が表示されます。

しかしcalc_Collision(A)、コード出力を横切って来る時:

セグメンテーション障害(コアダンプ)

"FLAG" が表示されません。

ここでも初心者であれば、どんな助力にも感謝します。

+2

適切なツールは、これはあなたのデバッガで解決するために:あなただけNC2を計算しているので (N 2を選択)、select関数は次のように書き直すことができます。デバッグは不可欠なスキルです。詳細については、[こちら](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。 – Rakete1111

+1

このエラーの原因は何ですか? – Beta

+0

'fact'は12より大きい入力でオーバーフローすることに注意してください。おそらく、階乗に直接関係しない' select'を計算する方法が必要です。 (ヒント:数式を使用して数式を導出する) – molbdnilo

答えて

2
int select(int x, int y){ 
    int fact(int a); 
    return (fact(x)/(fact(y)*fact(x-y))); 
} 


int fact(int a){ 
    if (a==0) { 
    return 1; 
    } 
    else { 
    return (a*fact(a-1)); 
    } 
} 

selectxが2未満であれば、その後、fact(x-y)は無限に自分自身を呼び出すことに注意してください。これは、factの変数aが負の値になるためです。これは、入力配列のサイズが10列未満の場合に発生し、最後の列が空になります。これにより、countの反復はcalc_Collisionで0になります。セグメンテーションフォルトは、入力に10列がある場合は発生しません。

int select(int x){ 
    return (x*(x-1))/2; 
} 
関連する問題