fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6. FILE *fp;
  7. char *fname ="test.txt";
  8. // 変数名にa,b,c,dとか意味のないものを使用しない。3日後にはワケワカメ。
  9. // 但し[c]は[char]のcなのでおk。
  10. // 型はintだけどfgetcで入力されるのは文字=characterなので一般的にはおk。
  11. // でも、ループカウンタはi,j,k辺りを使うのが慣例っぽい。
  12. // int c,a,b,d;
  13. int c;
  14.  
  15. // doubleではなくint(charでもおkだけど)。
  16. // double** matrix;
  17. int **matrix;
  18. int candidates_x, votes_y; /* size_x 行 size_y 列 */
  19. int i,j,count=0;
  20.  
  21. printf("候補者数と投票者数を入力 >");
  22. scanf("%d%d", &candidates_x, &votes_y);
  23. fp = fopen( fname, "r" );
  24. if( fp == NULL ){
  25. printf( "%sファイルが開けません\n", fname );
  26. return -1;
  27. }
  28. // intに修正
  29. matrix = (int**)malloc(sizeof(int*)*candidates_x);
  30. if (matrix==NULL) exit(1);
  31.  
  32. for (i=0 ; i < candidates_x ; i++) {
  33. // intに修正
  34. matrix[i] = (int*)malloc(sizeof(int)*votes_y);
  35. if (matrix[i]==NULL) exit(1);
  36. }
  37. i = j = 0;
  38. while( (c = fgetc( fp )) != EOF ){
  39.  
  40. if('\n' == c){
  41. i = 0;
  42. j++;
  43. continue;
  44. }
  45.  
  46. // ここもxとyが逆だった件に併せて修正
  47. // if(j >= votes_y){
  48. if(j >= candidates_x){
  49. break;
  50. }
  51.  
  52. // ここもxとyが逆だった件に併せて修正
  53. // if(i < candidates_x){
  54. if(i < votes_y){
  55. // x"行"、y"列"だったのか…。
  56. // ファイル上でxが横方向、yが縦方向だと思ってたので間違い。格納場所を修正した。
  57. // ついでに、今回の場合だと、ファイルの数字(文字)を取得して、数値変換してから変数に格納した方が良い。
  58. // 「matrix[j][i]=c;」とするとmatrixには数値の1ではなく数字の'1'(=0x31)が格納されるので、
  59. // 後で比較するときに文字比較になって面倒。
  60. matrix[j][i] = c - '0'; // 必要なら数字以外が入力された場合の対応も書いてね^^;
  61. }
  62. i++;
  63. }
  64. // このループ内もxとyが逆だったので修正した。
  65. for (i=0 ; i < candidates_x ; i++) {
  66. for (j=0 ; j < votes_y ; j++) {
  67. // matrixをint型に修正したので(int)のキャストは不要になった。
  68. // ついでに数値変換して変数に格納しているので文字出力(%c)ではなく数値出力(%d)に変更
  69. printf("%d ",matrix[i][j]);
  70. }
  71. printf("\n");
  72. }
  73. // ループ終了時はj==votes_yになっているので、例えば3x3のときは[0][3]にアクセスしている。
  74. // 配列は0オリジンなのでインデックスは0~2、よって[1][0]へのアクセスと等価なので意図している処理とは違うはず。
  75. // ループを抜けた後の変数を使用するときは終了値に注意ね!
  76. // i=0; a=matrix[i][j];
  77.  
  78. // ループ内でループカウンタを使用して色々処理するときは、
  79. // ijkじゃなくて分かりやすい(意味のある)変数名にした方が良い。3日後には(ry
  80. {
  81. // 一時的に使用するだけのループカウンタなら、新たにブロックを作って宣言すればいい。
  82. // 後半でちょっとだけ使用するループカウンタをmainの先頭で宣言すると管理が大変。
  83. //(でもこういうソースをほとんど見たことがない。大規模なピュアCだと使ってるのかも?知らんけど^^;)
  84. int currentVote; // 元a。投票数のチェック対象となる投票者番号。
  85. int candidateID; // 元b。投票者番号を回すループカウンタ
  86. int candidateIndex; // 元j。matrixの縦方向走査用カウンタ
  87.  
  88. // IDは1~、indexは0~。
  89. for(candidateID = 1; candidateID <= candidates_x; candidateID++){
  90. for(candidateIndex = 0; candidateIndex < candidates_x; candidateIndex++){
  91. // とりあえずファイルの左端の列だけ(x=0固定)
  92. currentVote = matrix[candidateIndex][0];
  93. if(currentVote == candidateID){
  94. count++;
  95. }
  96. }
  97. printf("candidates%d=%d\n", candidateID, count);
  98. count=0;
  99. }
  100. }
  101. for (i=0 ; i < candidates_x ; i++) {
  102. free(matrix[i]);
  103. }
  104. free(matrix);
  105. fclose(fp);
  106. return 0;
  107. }
Runtime error #stdin #stdout 0.02s 1856KB
stdin
Standard input is empty
stdout
候補者数と投票者数を入力 >test.txtファイルが開けません