2014-11-24 2 views
-3

나는 성적 n을 나타내는 문자 c와 등급을 나타내는 n 개의 부동 소수점 값을 먼저 입력 할 수있는 프로그램을 작성했습니다. 배열을 사용하여 내가 입력 한 성적을 저장할 수 있으며 100 개 이상의 성적을 도입 할 수 있습니다. 이 프로그램을 사용하면 's'를 입력 할 때 배열의 요소 합계를 계산할 수 있었고 'p'를 입력하면 배열의 요소 생성을 계산하고 다른 단어를 입력 할 때 요소의 평균을 계산할 수있었습니다. 나는 성적과 성격을 입력 한 후. 이 프로그램은 내가 계속해서 돌아 오면 응답이 없습니다. 어디 내 코드C의 성적 평균 계산하기

#include<stdio.h> 

#include<stdio.h> 

int main() 
{ 
    char c; 
    int integer_grade [100]; 
    float floting_grade [100]; 
    printf("Enter a grade"); 
    scanf("%i,%f",&integer_grade[100],&floting_grade[100]); 
    int *a; 
    a=&integer_grade[100]; 
    int *b; 
    b=&floting_grade[100]; 
    printf("Enter a character"); 
    getchar(); 
    scanf("%c",&c); 
    int n; 
    switch(c) 
    { 
    case 's': 
     for (n=0;n=100;n++) 
      *a+=*a; 
      *b+=*b; 
     printf("Sum is %d",*a+*b); 
    case 'p': 
     for (n=0;n=100;n++) 
      *a*=*a; 
      *b*=*b; 
     printf("Sum is %d",*a**b); 
    default: 
     for (n=0;n=100;n++) 
      *a+=*a; 
      *b+=*b; 
     printf("average is %d",(*a+*b)/100); 
    } 
    return 0; 
} 

의 실수 작업입니다 : 당신이 먼저 정수 n 다음 c를 문자를 입력하고 N 성적을 나타내는 값을 떠 프로그램을 작성하라. 성적을 저장하려면 배열을 사용하십시오. 100 개 이하의 학년이 도입 될 것이라고 가정 할 수 있습니다. 귀하의 프로그램은 다음을 계산하고 인쇄해야합니다 : c가 성적의 합, c가 모든 성적의 제품이고 다른 문자가 소개 된 경우 모든 성적의 산술 평균. * 사용 스위치 * 당신은 당신의 입력이 유효하다고 가정 할 수 있습니다.

+0

될 것입니다. – marsh

+0

C! = C++. C를 배우는 경우, 비교를 요구하지 않는 한 일반적으로 C++을 크로스 태그하지 마십시오. 다른 언어에 대한 "기본"솔루션은 매우 다를 수 있습니다. – crashmstr

+0

'C++'태그를 제거하십시오. 이것은'C'입니다. 또한, 왜 포인터? – bitcell

답변

0

, 그것은 바로 전혀 아니다.먼저

: 당신은 100 개 요소의 두 배열을 선언는, 당신은 그 배열 범위 이외의 값을 할당

초 (100 요소 배열은 0부터 시작, 99 완료) : 당신의 외부를 가리키는 두 포인터를 만들 그 배열 경계.

셋째 : (그 for이 올 것입니다 경우)이

for (n=0;n=100;n++) 
    *a+=*a; 
    *b+=*b; 

이 증가 할 첫 번째 문 : 스위치 내부에서 for (n=0;n=100;n++) 잘못, for(n = 0; n < 100; n++)

넷째과 같이해야한다 . 올바른 방법은

for (n = 0; n < 100; n++) 
{ 
    *a += *a; 
    *b += *b; 
} 

적절한 코드가 floating_grade 당신이 마크를 잃을 수 있습니다 floting_grade 아닌 그냥 메모

#include <stdio.h> 

int main() 
{ 
    char c; 

    int integer_grade[100]; 
    float floting_grade[100]; 

    int nr_of_grades; 
    int i = 0; 

    printf("Enter number of grades: "); 
    scanf("%d", &nr_of_grades); 

    for(i = 0; i < nr_of_grades; i++) 

    { 
     printf("Enter a int grade: "); 
    scanf("%d", &integer_grade[i]); 

    printf("Enter a float grade: "); 
    scanf("%f", &floting_grade[i]); 
    } 


    int operation_i = 0; 
    float operation_f = 0; 


    printf("Enter a character"); 
    scanf(" %c", &c); 

    int n; 

    switch(c) 
    { 
    case 's': 
     for (n = 0; n < nr_of_grades; n++) 
     { 
      operation_i += integer_grade[n]; 
      operation_f += floting_grade[n]; 
     } 

     printf("Sums are Int: %d Float: %f", operation_i, operation_f); 
    case 'p': 

     operation_i = 1; 
     operation_f = 1; 


     for (n = 0; n < nr_of_grades; n++) 
     { 
      operation_i *= integer_grade[n]; 
      operation_f *= floting_grade[n]; 
     } 

     printf("Products are Int: %d Float: %f", operation_i, operation_f); 

    default: 
     for (n = 0; n < nr_of_grades; n++) 
     { 
      operation_i += integer_grade[n]; 
      operation_f += floting_grade[n]; 
     } 

     printf("Average is Int: %d Float: %f", operation_i/nr_of_grades, operation_f/nr_of_grades); 
    } 
    return 0; 
} 
+0

도움 주셔서 감사합니다. 그것이 제가 얻고 자하는 결과입니다. 나는 그 질문을 분명히 이해하지 못할 수도 있다고 생각한다. –

+0

@UniCell 어쩌면 숙제를해야한다는 표시를해야합니다. –

+0

@vlad_tepesch 네, 저도 제 잘못입니다. 공포를 보았을 때 나는 그가 옳은 일을 할 것이라고 믿을 수 없다고 썼다. 나는 그를 불쌍히 여겼다. 나는 내 실수를 받아 들인다. – bitcell

2

생각.

  1. 이것은 정의되지 않은 동작입니다. 존재하지 않는 배열에서 읽은 정수 및 부동 소수점을 100으로 설정합니다.

    int integer_grade[100]; 
    float floting_grade[100]; 
    scanf("%i,%f", &integer_grade[100], &floting_grade[100]); 
    
  2. 이 포인터는 해당 배열의 경계를 벗어나는 메모리를 가리 킵니다.

    int *a = &integer_grade[100]; 
    int *b = &floting_grade[100]; 
    
  3. 당신은 문자를 요청하고 해당 문자의 값 무시 : 당신은 다음 문자를 얻어서 그 후속

    getchar(); 
    

    합니다. 이상합니다. 그러나 당신은 올바른 타입을 사용하고 그렇지 않은 타입은 사용합니다. 그래서 그것은 승리입니다. 루프에 대한 이들의

    scanf("%c",&c); 
    
  4. 귀하의 들여 쓰기는 모두 문이 루프의 일부로 반복 될 것이라고 생각 것을 의미한다. 그건 잘못된거야. 그것을 달성하기 위해 { ... }를 사용

    for (n=0;n=100;n++) 
        *a+=*a; 
        *b+=*b; 
    
  5. 난 당신이 *a += *a에 의해 달성하고 무슨 생각을 아무 생각이 없습니다. *a의 값이 매우 빨리 증가 할 것임을 알고 있습니다.

  6. switch 문은 경우에 따라 폴트 닝을 사용합니다. 즉, 케이스가 's' 인 경우 세 가지 경우를 모두 포함하여 switch 문에 모든 코드가 실행됩니다. 이 동작을 원하지 않으면 각 case의 끝에 break 문을 써야합니다.

  7. 책/교수진/인터넷 자료로 돌아가서 for 루프가 어떻게 작동하는지 읽어보십시오. 이것은 아마 당신이 생각하는 것을하지 않습니다. 사실, 이것은 무한 루프입니다! 당신이 여기서 뭘하려고 무엇 이건

    for (n=0; n=100; n++) 
    
+2

7. 루프 조건은 할당입니다. –

+2

'getchar '은 이전 입력에서 줄 바꿈을 건너 뛰기위한 것입니다. 그러나'scanf ("% c", & c)'라고 쓰는 것이 낫습니다. – interjay

+1

5. 잘못되었으므로 각 반복마다 값이 두 배가되므로 결과는'* a * = 1 << 100; '이되어 int에 비해 너무 큽니다. – mch