2010-12-10 4 views
1

.txt 파일에 소수를 인쇄하는 C 프로그램이 있습니다. 프로그램에서 실행 시간을 분 단위로 묻고 싶습니다. 코드 조각으로 해결하려고합니다.C에서 실행 시간을 제어하는 ​​방법

#include <stdio.h> 
#include <time.h> 

int main() 
{ 
    execute(); 
    return(0); 
} 

int execute(int minute) 
{ 
    time_t now; 
    time(&now); 
    struct tm *tmp = localtime(&now); 
    printf("How long you want to execute the program by minute? "); 
    scanf("%d",&minute); 
    printf("%d %02d %02d\n",tmp->tm_hour, tmp->tm_min+minute, tmp->tm_sec); 
    return(minute); 
} 

여기도 내가 실행하고 싶은 코드입니다.

#include <stdio.h> 

int isprime(int x); 

int main(void) 
{ 
     int AX_REGISTER, BX_REGISTER; 
     FILE *number, *primes; 

     int forever = 1; 

     while (forever) 
     { 

       if ((number = fopen("lastnumber.txt", "r")) == NULL) 
       { 
         fprintf(stderr, "Cannot read LASTNUMBER.txt file.\n"); 
         return 1; 
       } 
       fscanf(number,"%d",&AX_REGISTER); 
       fclose(number); 

       BX_REGISTER=AX_REGISTER; 
       AX_REGISTER=AX_REGISTER+1; 

       if ((number = fopen("lastnumber.txt", "w")) == NULL) 
       { 
         fprintf(stderr, "Cannot write LASTNUMBER.txt file.\n"); 
         return 1; 
       } 
       fprintf(number,"%d\n",AX_REGISTER); 
       fclose(number); 

       if (isprime(BX_REGISTER)) 
       { 

         if ((primes = fopen("primes.txt", "a")) == NULL) 
         { 
           fprintf(stderr, "Cannot open PRIMES.txt file.\n"); 
           return 1; 
         } 

         fprintf(primes,"%d\n",BX_REGISTER); 
         fclose(primes); 
       } 

     } 
     return 0; 
} 

int isprime(int x) 
{ 
     int i; 

     for (i=2;i<x;i++) 
     { 
       if (x%i==0) 
         return 0; 
     } 
     return 1; 
} 

나는 C 프로그래밍 언어의 초보자이므로 나 혼자서는 해결할 수 없습니다. 누군가 나를 도울 수 있습니까?

+0

이것이 벤치마킹을위한 것이라면, 지정된 다른 한도로 실행 한 다음 수행하려고 시도하는 것이 아니라 소요 된 시간을 확인하는 것이 좋습니다. –

+0

사용자가 지정한 시간 동안 isPrime 함수를 실행할 수 있다는 것에 대한 질문입니까? 그것은 당신이 찾고있는 것입니까? 말할 수 있듯이 다음 10 분 동안 입력 파일에서 소수를 찾으십시오. 귀하의 질문에 적절하게 답변 할 수 있도록 명확히 설명해 주시겠습니까? – Gangadhar

답변

2

일부 플랫폼에는 지정된 시간 (초) 후에 응용 프로그램에 신호를 보내는 데 사용할 수있는 alarm() 기능이 있습니다.

Windows가 아닌 경우 man alarm에서이 기능에 대한 정보를 제공해야합니다. Windows를 사용하는 경우 다른 방법이 필요할 수 있습니다.


다른 말로, 작성중인 코드에 의미있는 변수 이름을 사용하는 것을 고려해야합니다. 일반 독자에게는 BX_REGISTER이라는 이름은 아무 의미가 없습니다. 아마도 이름을 number_to_test (및 AX_REGISTER ~ next_number 또는 그 이상)으로 변경하는 것이 좋습니다.

0

while 루프에서 실행 중이므로 while 루프 외부에서 현재 시간을 가져 와서 분을 추가하고 while 루프의 끝에서 시간을 가져옵니다. 같은 뭔가 :이 방법의

time_t now; 
time_t end_time; 

now = time(); 
end_time = now + (minutes * 60); 

while(now < end_time) 
{ 
    ...Do processing here... 

    now = time(); 
} 

한 가지 단점은 isprime() 다음 실행 매우 매우 긴 시간이 걸리는 경우가 꽤 많이하여 종료 시간을 오버 슈트 수 있다는 것이다. 이를 해결하는 한 가지 방법은 값을 isprime()으로 전달하고 해당 함수의 루프에서도 확인하는 것입니다. 또는 프로그램을 실행중인 터미널에서 Ctrl-C를 누르십시오.

프로그램이 충돌하는 경우를 대비하여 꼭 파일에 쓰십시오. 시간이 많이 걸리지 않으려 고하지만, while 루프 이전에 lastnumber.txt에서 값을 읽은 다음 메모리에 저장하십시오. 그것은 당신의 프로그램을 가속화 할 것입니다.

또한 끔찍한 파일 잠금 의미론이있는 Windows에서 실행하지 않는 한 파일을 계속 열고 닫는주기를 절약하기 위해 전체 시간 동안 쓰기 파일 핸들을 열어 두는 것이 좋습니다.

관련 문제