白駿4344号(c言語)


古いコード

#include <stdio.h>

int main() {
	int C = 0; // 테스트 케이스 갯수
	int N = 0; // 학생의 수
	int score[1000] = { 0 }; // 점수
	int sum = 0; 
	int everage = 0;
	int cnt = 0; // 평균보다 점수 높은애들 수 세는 변수

	scanf("%d", &C);
	
	for (int i = 0; i < C; i++) {
		scanf("%d", &N);
		for (int j = 0; j < N; j++) {
			scanf("%d", score[i]);
			
			sum += score[i];
		}
		// 1. 평균을 때린다.
		everage = sum / N;
		
		// 2. 평균보다 점수가 높은 애들 퍼센트를 낸다.
		for (int j = 0; j < N; j++) {
			if (everage < score[i]) {
				cnt++;
			}
		}
		printf("%d", cnt / N);
	}
}

修正が必要な部分


  • 変数の位置
    まず,scoreとsum変数はC(テスト個数)に等しいfor文に置くべきである.
    他の学生の採点のたびに0にリセットする必要があります

  • 配列インデックスの使用
    これは犯すべきでないエラーで、socre配列インデックスをfor文に変換し、sumのコードにn(学生数)に関するインデックスを加えるべきだが、C(テスト数)に関するインデックスを加えるべきだ.

  • データ型、変換フォーマット
    これはずっと問題になっている部分で、実際には他の問題は結果値を見て修正することができますが、この部分は学習不足の部分です.
    int everage = 0; => double everage = 0.00;
    everage = sum/N; => everage = (double)sum/N;
    printf("%d", cnt/N); => printf("%.3f%%\n", (double)cnt * 100/N);
  • コードの変更

    #include <stdio.h>
    
    int main() {
    	int C = 0; // 테스트 케이스 갯수
    	int N = 0; // 학생의 수
    	
    	scanf("%d", &C);
    	
    	for (int i = 0; i < C; i++) {
    		scanf("%d", &N);
    
    		int sum = 0;
    		int score[1000] = { 0 }; // 점수
    		double everage = 0.00;
    
    		for (int j = 0; j < N; j++) {
    			scanf("%d", &score[j]);
    			sum += score[j];
    		}
    		// 1. 평균을 때린다.
    		everage = (double)sum / N;
    
    		// 2. 평균보다 점수가 높은 애들 퍼센트를 낸다.
    		int cnt = 0; // 평균보다 점수 높은애들 수 세는 변수
    		for (int j = 0; j < N; j++) {
    			if (everage < score[j]) {
    				cnt++;
    			}
    		}
    		printf("%.3f%%\n", (double)cnt * 100 / N);
    	}
    	return 0;
    }
    
    ソース:https://www.acmicpc.net/problem/4344