[완료]C언어로 월별 및 시간으로 전체의 누적을 구하려고 하는데 잘 안되서 이렇게 질문합니다.

mewestside의 이미지

월별 및 시간으로 전체의 누적을 구하려고 하는데 잘 안되서 이렇게 질문합니다.
일단 시간은 제외하고 월별만 코딩을 했습니다.
데이터는 2001년부터 2002년까지 이며, 이중 월별로 1월은 몇개, 2월은 몇개의 형식으로 나타내려고 합니다.
코딩 한번 봐주세요..ㅠ
---------------------------------
-- DATA --

2002-12-26 23:41
2002-12-17 8:44
2002-12-16 18:21
2002-12-12 21:42
2002-12-10 7:42
2002-12-07 16:43
2002-12-05 11:01
2002-12-05 10:05
2002-11-13 21:46
2002-11-06 21:48
2002-10-28 11:50
2002-10-25 4:06
2002-10-23 10:30
2002-10-20 4:22
2002-10-19 21:31
2002-10-16 19:48
2002-10-04 2:06
2002-09-19 3:10
2002-09-16 7:36
2002-09-15 16:40
2002-08-13 16:07
2002-08-10 21:47
2002-08-06 21:37
2002-08-06 7:32
2002-07-17 6:50
2002-07-12 8:17
2002-07-09 4:01
2002-07-02 1:49
2002-06-23 11:12
2002-06-07 22:24
2002-05-29 18:22
2002-04-17 7:52
2002-04-14 12:29
2002-04-01 7:46
2002-03-25 18:10
2002-03-25 5:31
2002-03-22 11:28
2002-03-17 9:26
2002-03-12 20:04
2002-03-08 2:09
2002-03-07 23:30
2002-02-28 22:26
2002-02-07 9:31
2002-02-03 22:44
2002-01-17 20:16
2002-01-17 6:28
2002-01-08 8:18
2002-01-07 17:10
2002-01-04 0:33
2001-11-30 11:18
2001-11-24 16:10
2001-11-21 10:49
2001-11-13 6:15
2001-11-09 13:54
2001-10-28 22:27
2001-10-01 3:35
2001-09-24 9:33
2001-09-19 8:47
2001-09-15 2:32
2001-09-13 6:07
2001-09-07 8:42
2001-08-24 11:12
2001-08-20 21:04
2001-08-06 23:46
2001-07-27 10:04
2001-07-26 19:55
2001-07-23 17:29
2001-07-15 20:01
2001-06-29 11:21
2001-06-17 1:04
2001-06-16 21:26
2001-06-13 13:53
2001-06-09 0:36
2001-05-28 7:25
2001-05-27 20:24
2001-05-27 15:25
2001-05-25 0:06
2001-05-16 1:09
2001-05-05 19:23
2001-05-05 11:21
2001-04-21 2:30
2001-04-17 2:42
2001-04-16 22:50
2001-03-19 22:16
2001-03-07 8:27
2001-03-06 0:23
2001-02-28 12:46
2001-02-19 8:27
2001-02-14 1:02
2001-02-10 17:47
2001-02-08 16:59
2001-01-29 11:44
--------------------------

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
 
int main (int argc, char **argv)
{
        int i, j, k, n;
        int dummy;
        double *mon, *hr;
        int count[12] = { 0 };
 
        mon = (double *)malloc(n*sizeof(double));
        hr = (double *)malloc(n*sizeof(double));
 
        n = 501.;
        k = 0;
        i = 0;
        j = 0;
 
        for (i=0; i<n; i++)
        {
                scanf("%d-%lf-%d %lf:%d", &dummy, &mon[i], &dummy, &hr[i], &dummy);
                printf("%.0lf %.0lf\n", mon[i], hr[i]);
        }
 
        for (j=0; j<12; j++)
                for (k=0; k<n; k++)
                {
                printf("%.0lf", mon[i]);
                        if(mon[i] == j+1)
                        {
                        count[j] ++;
                        }
//              printf ("%d : %d\n", j+1, count[j]);
                }
        printf ("%d : %d\n", j+1, count[j]);
}
snowall의 이미지

뭐가 어떻게 안되는데요?

피할 수 있을때 즐겨라! http://melotopia.net/b

mewestside의 이미지

값 츌력이 원하는대로 안되서요....

ymir의 이미지

코딩이 익숙치 않으면, 먼저 저 코드를 말로 풀어서 한 줄 한 줄 적어 보세요.
그리고 그대로 했을 때 문제가 풀리는 지 검토하고, 문제가 있다면, 알고리즘 수정.. 다시 구현.. 반복..
이 과정만 꼼꼼히 연습해도 스스로 많은 문제를 해결할 수 있을 겁니다.
다른 사람 손으로 문제를 해결했다 하더라도, 그 원인을 발견하나 해결하는 방법을 모르면 아무 소용 없죠.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

snowall의 이미지

일단 n에 값이 들어가기 전에 사용했네요. malloc부분을 n=501뒤로 옮기셔야 할 거예요. 그리고 n=501.으로 썼는데, n은 int형인데 501.은 double형이므로 뭔가 안맞죠?

scanf로 사용자 입력을 직접 받을거면 그냥 눈으로 보고 사람이 파싱하는게 더 빨라요. 즉, 애초에 이건 몇월 몇시다 이렇게 입력하는게 더 낫다는 겁니다. 자동화 하고 싶으면 파싱 루틴을 만드세요.

2중 for루프에서 for는 바로 다음에 있는 문장 1개만 반복하니까 {...}괄호를 사용해서 명확하게 반복해야 할 부분을 지정하세요.

컴파일러가 최적화를 해줄지 어떨지는 모르겠지만, 이 설계대로라면 2중 루프를 12*501번 돌아야 하네요. 더 최적화해서 501번만 돌도록 할 수도 있습니다. 엄밀히 말해서, for구문이 3개 들어가 있는데, 1개만 써도 됩니다.

수치 출력에 %lf를 사용했는데 갯수 세는거라면 정수를 사용하는게 더 낫지 싶네요.

math.h는 쓸일이 없어보이니까 빼도 될 거라고 생각합니다.

피할 수 있을때 즐겨라! http://melotopia.net/b

shint의 이미지

데이터를 a.txt 파일로 만들고. 아래와 같이 코딩합니다.
- n 변수 위치를 상위 코드로 올리기
- fscanf로 파일 읽기
- mon[n]을 mon[k]로 바꾸기

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
 
int main (int argc, char **argv)
{
        int i, j, k, n;
        int dummy;
        double *mon, *hr;
        int count[16] = { 0 };
 
        n = 92.;
		int max_line = n;
        mon = (double *)malloc(n*sizeof(double));
        hr = (double *)malloc(n*sizeof(double));
 
        k = 0;
        i = 0;
        j = 0;
 
		FILE* fp;
		fp = fopen("a.txt", "rt");
        for (i=0; i<n; i++)
        {
                fscanf(fp, "%d-%lf-%d %lf:%d", &dummy, &mon[i], &dummy, &hr[i], &dummy);
                printf("%.0lf %.0lf\n", mon[i], hr[i]);
        }
 
		printf("----------------------------------------\n");
 
		for (j=0; j<12; j++)
		{
			for (k=0; k<n; k++)
			{
				printf("%.0lf", mon[i]);
				if(mon[k] == j+1)
				{
					count[j] ++;
				}
				//printf ("%d : %d\n", j+1, count[j]);
			}
			printf ("%d : %d\n", j+1, count[j]);
		}
 
 
		//mon은 몇개
		//hr은 몇개
		for(i=0; i<12; i++)
		{
			int cnt = 0;
			int tmp = 0;
			while(1)
			{
				if(tmp>max_line)
				{
					count[i] = cnt;
					break;
				}
 
				//0~ 12 각각의 동일한 값이 있다면. 해당하는 i값 증가.
				if(i+1 == mon[tmp])
				{
					cnt++;
 
				}
				tmp++;
			}
		}
 
		for(i=0; i<12; i++)
		{
			printf("idx:%d count: %d\n", i+1, count[i]);
		}
 
}

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

qiiiiiiiip의 이미지

mon 과 hr을 double로 사용하시네요..

뒷부분의 if(mon[i] == j+1) 에서 괴로운 일이 생길수도 있습니다.

int로 사용하고, count[mon]++ 로 하세요..

대략

int count_mon[12] = {0,};
int count_hr[24] = {0,};
int mon, hr;
 
while( data_remains )
{
  if ( scanf( "%*d-%d-%*d %d:%*d", &mon, &hr ) == 2 )
  { if ( 1 <= mon <= 12 ) count_mon[mon-1] ++;
    if ( 0 <= hr < 24 ) count_hr[ hr] ++;
  }
}

이렇게 하시면 될듯..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.