1

私は主にPython/MIT Schemeプログラマーですが、次の学期にCのクラスを受講する予定であり、準備ができているので、Cを学びたいと思っています。私はPythonとスキームがかなり得意なので、プログラミング全般の初心者ではありません。それは私の趣味です:)。

そこで、パスカルの三角形を計算するCプログラムを書いてみましたが、出力が正しくありません。エラーなしでコンパイルします。コードは次のとおりです。

/*
  This code is just to see exactly how much faster C is than python                                                                          
  at doing numerically stuff. It should calculate the nth row of                                                                             
  pascals triangle.                                                                                                                          
  The way you use it is by calling the executable with the row                                                                               
  you wish to compute as the only argument. For example if you                                                                               
  are on an *nix system:                                                                                                                     
  ./pascal 6                                                                                                                                 

  Or in a windows command prompt:                                                                                                            
  pascal.exe 6                                                                                                                               
*/

#include <stdlib.h>
#include <stdio.h>
#include <assert.h>

/*
  I decided to use a struct here because I thought it was ugly                                                                               
  to have to pass around the length of my arrays in function                                                                                 
  calls.                                                                                             
*/
typedef struct{
  int length;
  unsigned long int* vals;
} CoolArray;

//initArray allocates memory for the CoolArray.                                                                                              
void initArray(CoolArray* array, int length);

//destroyArray frees allocated memory in the struct.                                                                                         
void destroyArray(CoolArray* array);

//printArray prints the contents of the array.                                                                                               
void printArray(CoolArray* array);

//pascal computes the nth row of pascal's                                                                                                    
//triangle, with n being array->length,                                                                                                      
//and stores the values in the array.                                                                                                        
void pascal(CoolArray* array);

//setArray takes two CoolArrays of the same length                                                                                           
//and sets the values in the first to the values                                                                                             
//in the second.                                                                                                                             
void setArray(CoolArray* array1, CoolArray* array2);

int main(int argc, char** argv){
  int length = atoi(argv[1]);
  CoolArray array1;
  initArray(&array1, length);
  printf("Calculating the %dth row of pascals triangle...\n", length);
  pascal(&array1);
  printArray(&array1);
  destroyArray(&array1);
  return 0;
}

void initArray(CoolArray* array, int length){
  assert(length>=1); //don't make arrays with a length <=0!!!                                                                                
  array->length = length;
  array->vals = (unsigned long int*) calloc(length, sizeof(unsigned long int));
  return;
}

void destroyArray(CoolArray* array){
  free(array->vals);
  return;
}

void pascal(CoolArray* array){
  assert(array->length >= 1);//making sure the length wasn't fiddled with...                                                                 
  if(array->length == 1){
    array->vals[0] = 1;
    return;
  }
  int row;
  int index;
  array->vals[0]=1; //if we aren't looking for the first row                                                                                 
  array->vals[1]=1;//then i'll start with the second row                                                                                     
  CoolArray current;
  initArray(&current, array->length);
  for(row = 2; row < array->length; ++row){
    current.vals[0]=1;
    for(index = 1; index < row; ++index){
      current.vals[index]=array->vals[index]+array->vals[index-1];
    }
    current.vals[row]=1;
    printArray(&current);
    setArray(array, &current);
  }
  destroyArray(&current);
  return;
}

void setArray(CoolArray* array1, CoolArray* array2){
  assert(array1->length==array2->length);//making sure they are the same length                                                              
  int i=0;
  for(; i < array2->length; ++i){
    array1->vals[i]=array2->vals[i];
  }
  return;
}

void printArray(CoolArray* array){
  int i=0;
  printf("[");
  for(; i < array->length; ++i){
    if (i = array->length - 1) printf("%d]\n", array->vals[i]);
    else printf("%d, ", array->vals[i]);
  }
  return;
}

誰かが私がどこで間違っているのか見ることができますか?現在、出力は次のようになっています。

./パスカル6

パスカルの三角形の6行目を計算しています...

[1]

4

1 に答える 1

3

あなたのエラーはこの行にあります:

if(array->length = 1){

単一の等号のために1を割り当てています。array->length同等性テストに使用==し、コンパイラで警告をオンにします(-Wall)。

(行に同様のエラーがあり、if (i = array->length - 1)出力の形式が正しくありません)。

于 2012-10-25T04:33:45.913 に答える