레이블이 C language인 게시물을 표시합니다. 모든 게시물 표시

  1 #include <stdio.h>   2 #include <stdlib.h>   3 #include < string .h>   4   5 int ** alloc_dyn_array( int  n...

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4
  5 int** alloc_dyn_array(int nRow, int nCol);
  6 void print_array(int** ppResult, int nRow, int nCol);
  7 void free_dyn_array(int** ppResult, int nRow);
  8
  9 int** alloc_dyn_array(int nRow, int nCol)
 10 {
 11     int** ppResult = NULL;
 12     int i = 0;
 13     if (nRow > 0 && nCol > 0)
 14     {
 15         ppResult = (int**)malloc(sizeof(int*) * nRow);
 16         if (NULL != ppResult)
 17         {
 18             for (i = 0; i < nRow; i++)
 19             {
 20                 ppResult[i] = (int *)malloc(sizeof(int)* nCol);
 21                 if (NULL != ppResult[i])
 22                 {
 23                     memset(ppResult[i], 0sizeof(int)* nCol);
 24                 }
 25                 else
 26                 {
 27                     int j=0;
 28                     for (i = 0; j < i; j++)
 29                     {
 30                         free(ppResult);
 31                         ppResult[i] = NULL;
 32                     }
 33                     ppResult = NULL;
 34                     break;
 35                 }
 36             }
 37         }
 38     }
 39     else
 40     {
 41         printf("오류 : alloc_dyn_array() 매개변수 \n");
 42     }
 43     return ppResult;
 44 }
 45
 46 void print_array(int** ppResult, int nRow, int nCol)
 47 {
 48     int i = 0, j = 0;
 49     if (NULL != ppResult && nRow > 0 && nCol > 0)
 50     {
 51         for (i = 0; i < nRow; i++)
 52         {
 53             for (j = 0; j < nCol; j++)
 54             {
 55                 printf("%d", ppResult[i][j]);
 56             }
 57             printf("\n");
 58         }
 59     }
 60 }
 61
 62 void free_dyn_array(int** ppResult, int nRow)
 63 {
 64     int i = 0, j = 0;
 65     if (NULL != ppResult && nRow > 0)
 66     {
 67         for (i = 0; i < nRow; i++)
 68         {
 69             if (NULL != ppResult[i])
 70             {
 71                 free(ppResult[i]);
 72             }
 73         }
 74         free(ppResult);
 75     }
 76 }
 77
 78 int main(void)
 79 {
 80     int row = 2, col = 3;
 81     int i = 0, j = 0;
 82     int **ppResult = NULL;
 83
 84     ppResult = alloc_dyn_array(row, col);
 85     if (NULL != ppResult)
 86     {
 87         printf("값 설정하기 이전 \n");
 88         print_array(ppResult, row, col);
 89
 90         printf("값 설정한 후: \n");
 91         ppResult[0][0] = 1;
 92         ppResult[0][2] = 2;
 93         ppResult[1][0] = 3;
 94         ppResult[1][2] = 4;
 95
 96         print_array(ppResult, row, col);
 97         free_dyn_array(ppResult, row);
 98     }
 99
100     return 0;
101 }


※ 동적 2차원 배열으로서, 행의 크기 nRow 변수와 열의 크기 nCol 변수를 이용하였고 alloc_dyn_array()함수는 2차원 배열을 메모리에 동적으로 할당받고
print_array() 함수는 할당받은 2차원 배열의 내용을 출력하며, free_dyn_array() 함수는 할당받았던 메모리를 해제한다.
이 챕터에서 가장 중요시 되는 것은
NULL != ( ) 매개변수 유효성 점검.
() = ()malloc(sizeof() * ) 배열 할당.
free() 메모리 해제

라고 생각이 된다.

사용자로부터 원소의 개수를 입력받아서 동적으로 int형 배열을 할당받는 프로그램을 작성해 보세요. 즉, 계속 반복하여, 아래의 작업을 수행해야 합니다. 단, 사용자가 입력한 원소의 개수가 0이나 0보다 작은 값이면 프로그램을 종료합니다. - 기존 ...

사용자로부터 원소의 개수를 입력받아서 동적으로 int형 배열을 할당받는 프로그램을 작성해 보세요. 즉, 계속 반복하여, 아래의 작업을 수행해야 합니다. 단, 사용자가 입력한 원소의 개수가 0이나 0보다 작은 값이면 프로그램을 종료합니다.

- 기존 원소의 개수보다 작거나 같으면 이를 무시하고 다시 원소의 개수를 입력받습니다.
- 만약 기존 원소의 개수보다 크면 realloc() 함수로 메모리를 확장합니다.
- 또한, 이때 새롭게 추가되는 원소에 대해서는 사용자로부터 그 값을 입력받습니다.
- 사용자로부터 원소의 개수를 입력받기 전에, 현재 원소의 개수와 각 원소의 값을 출력합니다
  (물론 프로그램이 시작되는 최초에는 원소의 개수가 0개입니다.)



  1 #pragma warning(disable:4996)
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4 #include <string.h>
  5 void doInput(int count, int *value);
  6
  7 int main()
  8 {
  9     // 두개의 입력값
 10     int i = 0, pvalue = 0;
 11     int count = 0, new_count = 0;
 12     int *value = NULL;
 13     int *value2 = NULL;
 14
 15     // 현재 원소의 개수 출력
 16     // 원소의 개수. 0이하의 값이면 종료
 17
 18     do
 19     {
 20         printf("현재 원소의 개수는 %d개입니다.\n", count);
 21         printf("원소의 개수는(0이하의 값을 입력하면 종료됩니다)?");
 22         scanf("%d", &count); //count : 원소
 23
 24         
 25
 26         if (count > 0// 원소의 값이 0보다 클때
 27         {
 28             
 29             value = (int*)malloc(sizeof(int)*count); // 메모리 할당
 30                         
 31             if (count > new_count) // 최초의 원소의 값이 새로운 원소의 값보다 클때
 32             {
 33                 value2 = (int*)realloc(value, sizeof(int)* count);
                // value 초기값으로 하여 메모리 확장
 34             }
 35             if (NULL != value2) // value2 가 NULL 이 아닌지 체크
 36             {
 37                 value = value2;
 38                 for (i = new_count; i < count; i++) // 새로운 원소 ++
 39                 {
 40                     printf("%d번째 원소의 값은? ", i);
 41                     scanf("%d", &pvalue);
 42                     *(value + i) = pvalue;
 43                 }
 44                 for (i = 0; i < count; i++)
 45                 {
 46                     printf("[%d] %d \n", i, pvalue);
 47                 }
 48             }
 49             else
 50             {
 51                 printf("메모리 할당에 실패하였습니다. \n");
 52             }
 53
 54         }
 55
 56         
 57         new_count = count;
 58
 59     } while (count > 0);
 60     if (NULL != value) free(value); // 메모리 해제
 61
 62     return 0;
 63 }
 64



  ※ '기존 원소의 개수보다 작거나 같으면' 의 조건은 다음에 하기로..

  1  #pragma warning(disable: 4996 )    2  #include <stdio.h>    3  #include <stdlib.h>    4     5   void  doInput( int  cou...

  1 #pragma warning(disable:4996
  2 #include <stdio.h> 
  3 #include <stdlib.h> 
  4 
  5 void doInput(int count, int* pScore); 
  6 double getAverage(int count, int *pScore); 
  7 
  8 int main() 
  9 { 
 10     int         count = 0
 11     int         *pScore = NULL; 
 12     double     average = 0
 13 
 14     do 
 15     { 
 16         printf("학생수는? (0이하의 수를 입력하면 종료됩니다."); 
 17         scanf("%d", &count); 
 18 
 19         // 메모리 할당 
 20         if (count > 0
 21         { 
 22             pScore = (int*)malloc(sizeof(int)*count); 
 23             if (NULL != pScore) 
 24             { 
 25                 doInput(count, pScore); 
 26                 average = getAverage(count, pScore); 
 27                 printf("평균점수는 %f입니다.", average); 
 28             } 
 29             // 메모리 할당시 예외 
 30             else 
 31             { 
 32                 printf("메모리 할당에 실패하였습니다. \n"); 
 33             } 
 34             if (NULL != pScore)    free(pScore); 
 35 
 36         }     
 37     } while (count > 0); 
 38 } 
 39 void doInput(int count, int *pScore) 
 40 { 
 41     int i; 
 42     int score = 0
 43     // 학생수 반복 입력 
 44     if (count > 0 && NULL != pScore) //검사 
 45     { 
 46         for (i = 0; i < count; i++) 
 47         { 
 48             printf("[%d]번째 학생의 점수 : ", i + 1); 
 49             scanf("%d", &score); 
 50 
 51             *(pScore+i) = score; 
 52         } 
 53     } 
 54     else //예외 
 55     { 
 56         printf("오류가 있습니다.");         
 57     } 
 58 } 
 59 
 60 double getAverage(int count, int *pSocre) // 평균식 
 61 { 
 62     double result = 0
 63     int i = 0
 64     if (count > 0 && NULL != pSocre) 
 65     { 
 66         for (i = 0; i < count; i++) 
 67         { 
 68             result += *(pSocre + i); 
 69         } 
 70         return result / count; 
 71     } 
 72     else 
 73     { 
 74         printf("오류가 있습니다."); 
 75     } 
 76     return result; 
 77 }



서적: 난 정말 C programming을 공부한 적이 없다구요 프로그램 사용자로부터 주민등록번호를 입력 받아서 유효한 주민등록번호인지 확인하여 주는 프로그램을 작성하자. 프로그램 사용자가 정상적인 주민등록번호를 입력할때까지 입력은 계속되어야 하며...

서적: 난 정말 C programming을 공부한 적이 없다구요

프로그램 사용자로부터 주민등록번호를 입력 받아서 유효한 주민등록번호인지 확인하여 주는 프로그램을 작성하자. 프로그램 사용자가 정상적인 주민등록번호를 입력할때까지 입력은 계속되어야 하며, 유효한 주민등록번호의 조건은 다음과 같다.

- 바(-)를 포함하여 14개의 문자로 이뤄진다. : YYMMDD - Sxxxxxx
- MM은 01이상 12이하이다.
- DD는 01이상 31이하이다. 단 MM이 02이면 01이상 29이하다.
- S는 1 아니면 2가 와야 한다.

보다 복잡한 형식을 취하여 정교한 검사도 가능하지만, 이 정도만 확인을 하도록 하겠다




  1 #pragma warning(disable:4996
  2 #include  
  3 int main(void
  4
  5     char str[30] = { 0 };
  6     int i = 0
  7     int len = 0
  8
  9     printf("바(-)를 포함한 주민등록번호 입력 : "); 
 10     scanf("%s", str); 
 11
 12       
 13     while (str[2]<2 | (str[2] = '1' && str[3] < '3')  )
 14     { 
 15         printf("입력 오류 : 월 표기"); 
 16         printf("참고 : 주민등록번호 상에서 월은 01이상 12 이하가 되어야 합니다.\n");                 printf("다시입력 \n");
 17         scanf("%s", str); 
 18     } 
 19     if (str[2] < 2 || (str[2] = 1 && str[3] < 2)) 
 20    // 월의 첫번째 단위가 2 이하, 또는 첫번째단위가 1이며 두번째 단위가 2를 넘을때.12월이하. 
 21     { 
 22         while ((str[4] < 4 && str[4] < 2) | (str[2] == 0 && str[3] == 2)) 
 23          // DD는 31 이하| 월이 02이면 밑의 소스 실행 
 24         { 
 25             printf("입력 오류 : 일 표기 \n"); 
 26             printf("\n"); 
 27             printf("참고 : 주민등록번호 상에서 월이 02이면 일은 \n"); 
 28             printf("01 이상 29이하 가 되어야 합니다. \n"); 
 29              
 30             printf("다시 입력 \n"); 
 31             scanf("%s", str); 
 32             if ((str[4] < 4 && str[4] < 2) | (str[2] == 0 && str[3] == 2))
 33             { 
 34                 while (str[7] < 3)
 35                 { 
 36                     printf("주민등록번호 상의 첫 뒷자리는 1 혹은 2가 되어야 합니다."); 
 37                     scanf("%s", str); 
 38                 } 
 39             }; 
 40         } 
 41     }; 
 42
 43     printf("정상적인 주민번호 입력 감사 드립니다. \n"); 
 44      
 45     return 0
 46
 47


프로그램 자체가 정확하지 않다.
소스 수정이 더 필요하다.

서적: 난 정말 C programming을 공부한 적이 없다구요. 단리와 복리 예금금액이 1000원이며, 단리가 년 7.2%, 복리가 4.7%라고 할때, 단리 : 1년차 이자 : 1000 x 0.072 = 72원 2년차 이자 : 1000...

서적: 난 정말 C programming을 공부한 적이 없다구요.

단리와 복리

예금금액이 1000원이며, 단리가 년 7.2%, 복리가 4.7%라고 할때,

단리 :
1년차 이자 : 1000 x 0.072 = 72원
2년차 이자 : 1000 x 0.072 = 72원
3년차 이자 : 1000 x 0.072 = 72원

복리 :
1년차 이자 : 1000 x 0.047 = 47원
2년차 이자 : (1000+47) x 0.047 = 49.209원
3년차 이자 : (1000+47+49.209) x 0.047 = 51.427823원

1. 프로그램 사용자로부터 적금에 예치할 금액과 기간(년 단위)을 입력받는다.
2. 단리의 이율은 7.2%, 복리의 이율은 4.7%이다.
3. 프로그램 사용자가 5년 미만의 기간을 입력하면 입력을 재 요청한다.
4. 단리와 복리의 최종 이자를 표시하고 어떠한 상품이 더 좋은지 추천한다.

그리고 계산된 최종이자에서 원단위 미만은 삭제한다.

.......

c언어를 배우고 있다. 분명 이 문제는 main함수 이외에 새로운 함수를 만들어서 계산하라는 문제일것이다. 하지만 새로운 함수를 만드는데 아주 약하다. 만일 함수를 만들고 하는 일에 능숙하다면 이렇게 소스가 길지는 않았을것이다. 이는 나의 수준이라고 해도 과언이 아닐것이다. 특히 변수를 선언하는 첫부분은 너무 더럽게 보인다. 집앞에 덕지덕지 붙어있는 광고지를 보는것 같다.


  1 #include <stdio.h> 
  2
  3 int short_bank(int money); 
  4
  5 int main(void
  6
  7  int year; 
  8  int money; 
  9  int second_money; 
 10  int second_money_temp; 
 11  int money_short_temp = 0;
 12  int money_long_temp = 0;
 13  int result; 
 14  int i; 
 15  int year_temp = 0
 16  int year_temp1 = 0
 17  int short_money = 0
 18  int long_money = 0
 19  int money_shortrate; 
 20  int money_long_rate = 0;
 21  int money_shortrate_sum = 0;
 22  int money_longrate_sum = 0;
 23  double short_rate = 0.072
 24  double long_rate = 0.047
 25   
 26  do
 27   printf("예치할 금액과 기간을 입력 : "); 
 28   scanf("%d %d", &money, &year); 
 29  } while (year < 5); 
 30  second_money = money; 
 31  printf("====================== \n");  
 32  printf("단리 이율이 적용된 계좌 \n"); 
 33  for (i = 0; i < year; i++)
 34  { 
 35   money_shortrate = money*short_rate; // 단리이율이 포함한 금액 
 36   money_shortrate_sum += money_shortrate; //매 년마다 단리이율을 중복해서 더함 
 37   year_temp++; 
 38   printf("%d년차 이자 : %d원\n", year_temp, money_shortrate);   
 39  } 
 40  result = money_shortrate_sum + money; 
 41  printf("이자가 적용된 금액 : %d원\n", result); 
 42
 43  for (i = 0; i < 2; i++)
 44  { 
 45   printf("===========================\n"); 
 46  } 
 47
 48  printf("복리 이율이 적용된 계좌 \n"); 
 49
 50   
 51  for (i = 0; i < year; i++)
 52  { 
 53   second_money_temp = second_money * long_rate;//기본 이자 : 원금 * 이율 
 54
 55   second_money += (second_money + second_money_temp) * long_rate;  
 56 // (원금+기본이자) * 이율 
 57   year_temp1++; 
 58   printf("%d년차 이자 : %d원\n", year_temp1, second_money_temp); 
 59  } 
 60  printf("이자가 적용된 금액 : %d원 \n", second_money); 
 61
 62  if (second_money > result) 
 63   printf("복리상품이 단리상품보다 더 좋습니다."); 
 64   
 65  else  
 66   printf("단리상품이 복리상품보다 더 좋습니다."); 
 67   
 68  return 0
 69






 

































서적: 난 정말 C programming을 공부한 적이 없다구요 문제 5. 언제 돈이 똑 떨어질까? 통나무   집을  만드시는  톰   아저씨의   통장에는  5000만원의 돈이 있으며, 그분이 매달 저축하는 금액은 100만원이다. 하지만 그...

서적: 난 정말 C programming을 공부한 적이 없다구요
문제 5. 언제 돈이 똑 떨어질까?


통나무 집을 만드시는  아저씨의 통장에는 5000만원의 돈이 있으며, 그분이 매달 저축하는 금액은 100만원이다. 하지만 그분이 매달 생활비로 쓰시는 돈이 250만원이다. 그나마 다행인 것은 이자율이다. 아저씨가 돈을 맡긴 은행에서는 한달에 원금의 2%에 해당하는 어마어마한 이자를 지급한다(연간 이자가 아닌 월 단위 이자가 2%이다.) 그리고 다음은 오지랖 넓은 필자와 아저씨의 대화이다.
필자 : 아저씨 그렇게 돈을 지출하시면 언젠가는 통장이 비게 되요.
 아저씨 : 버는 돈 보단 쓰는 돈이 많아서 걱정된단 말이지?
필자 : 버시는 금액과 이자를 포함해도 지출이 더 커요. 언젠간 텅 비게 돼요.
 아저씨 : 내게 중요한 건 통장이 언제 비게 되냐는 거다! 그게 언제냐? 계산 좀 해봐라.

정확히 몇달 뒤에 아저씨는 통장의 잔고가 0이 되는 것을 확인하게 되겠는가? 이를 확인하게 위한 프로그램을 작성해 보자. 언제 비게 되고 마지막 출금액이 얼마가 되는지 계산하여 출력해 보자.

참고로 첫 번째 달에는 5000만원에 대한 2%의 이자가 증가한 이후에 100만원이 저축되고 250만원의 지출이 생긴다. 즉 매달 이자가 증가한 이후에 100만원이 저축되고 250만원이 지출되는 방식으로 통장관리가 된다.

c언어를 배우고 있는 학생으로서 열심히 했다. 그러다고 해서 이것이 저자가 원하는 답이라고는 확신할수 없다.


  1 #pragma warning(disable:4996)
  2 #include <stdio.h>
  3
  4 int main(void)
  5 {
  6  int bank_money = 50000000// 원금
  7  int month_save = 1000000// 한달 적립
  8  int month_spend = 2500000;
  9  int bank_temp;
 10  double bank_save_rate;
 11  int month = 30// 한달은 30일
 12  int sum_day = 0// 일 합산
 13  double month_rate = 0.02// 이자율
 14
 15  bank_temp = bank_money;
 16  
 17  printf("원금 : %d원 \n\n", bank_money);
 18
 19  while (bank_temp > 0)
 20  {
 21   sum_day += month; // 하루가 지날때마다 30일 추가
 22   printf("=======%d일이 경과=======\n", sum_day);
 23   bank_temp -= month_spend;
 24   printf("찾으신 금액 : %d원 || 남은 금액 : %d원\n", month_spend, bank_temp);
 25   bank_temp += month_save;
 26   printf("예금하신 금액 : %d원|| 남은 금액 : %d원\n\n", month_save, bank_temp);
 27
 28   bank_save_rate = bank_temp * (double)month_rate; 
 29                 // 이자 =  원금 * 이자율
 30   // bank_temp += (int)bank_save_rate;
 31   printf("%d일 경과 됬으므로 원금에 이자율이 적용됩니다. \n", sum_day);
 32   printf("오늘의 이자 : %.0f원 \n", bank_save_rate);
 33
 34   printf("남은금액 (이자적용) : %.0f \n\n", bank_temp + bank_save_rate);
 35   bank_temp += (int)bank_save_rate;
 36
 37  }
 38  if (bank_temp < 0)
 39  {
 40   printf("예측 : %d달후 당신은 %d원 빚지게 됩니다. \n", sum_day / 12, -bank_temp);
 41  }
 42  else
 43   printf("예측 : 당신은 몇푼만 가지게 됩니다.");
 44  return 0;
 45
 46 }







대학교를 다니고 있다. 갑자기 수업을 듣는데 문득 이러한 생각이 들었다. 꼬박꼬박 하루마다 밥먹는데 돈을 쓰는데 몇일뒤면 내가 나의 통장의 바닥을 볼수 있을까 궁금했다.   1 #pragma warning(disable: 4996 )   ...

대학교를 다니고 있다. 갑자기 수업을 듣는데 문득 이러한 생각이 들었다.
꼬박꼬박 하루마다 밥먹는데 돈을 쓰는데 몇일뒤면 내가 나의 통장의 바닥을 볼수 있을까
궁금했다.

  1 #pragma warning(disable:4996
  2 #include<stdio.h> 
  3 int main(void)
  4 {
  5  int money; //돈 
  6  int food; //지출금액 
  7  int day = 1;
  8  int lastday = 0;
  9  int i;
 10  printf("소지한 돈 입력:");
 11  scanf("%d", &money);
 12  printf("\n");
 13  printf("사용하는 금액 입력 :");
 14  scanf("%d", &food);
 15
 16  while (money>0)
 17  {
 18   money -= food;
 19   lastday += day;
 20
 21   printf("%d일 지속\n", lastday);
 22   printf("남은 금액 : %d 원\n", money);
 23  }
 24  return 0;
 25 }




서적: c언어 정복 리얼 교과서 사용자에게 정수 3개를 입력받아서, 3개 정수에 대한 최대값, 최소값, 평균을 구해서 출력해보세요. 단, 숫자를 입력받는 함수, 최대값을 구하는 함수, 최소값을 구하는 함수, 평균을 구하는 함수, 그리고 결과를...

서적: c언어 정복 리얼 교과서

사용자에게 정수 3개를 입력받아서, 3개 정수에 대한 최대값, 최소값, 평균을 구해서 출력해보세요. 단, 숫자를 입력받는 함수, 최대값을 구하는 함수, 최소값을 구하는 함수, 평균을 구하는 함수, 그리고 결과를 출력하는 함수를 각각 구현해야 합니다. 아울러, 평균을 실수로 구해야 합니다.

  1 #pragma warning(disable:4996
  2 #include <stdio.h> 
  3
  4 int Input(int num) 
  5
  6  printf("%d번째 값을 입력해주세요 \n", num); 
  7  scanf("%d", &num); 
  8  return num; 
  9
 10
 11 void ShowValue(int num1, int num2, double num3) 
 12
 13  printf("최댓값은 %d입니다. \n", num1); 
 14  printf("최솟값은 %d입니다. \n", num2); 
 15  printf("평균은 %lf입니다. \n", num3); 
 16
 17
 18 int MAX_NUM(int value1, int value2, int value3) 
 19
 20  int temp; 
 21  int result; 
 22
 23  result = value1 > value2 ? value1 : value2; 
 24  temp = result > value3 ? result : value3; 
 25
 26  return temp; 
 27
 28
 29 int MIN_NUM(int Minus1, int Minus2, int Minus3) 
 30
 31  int temp; 
 32  int result; 
 33
 34  result = Minus1 > Minus2 ? Minus2 : Minus1; 
 35  temp = result > Minus3 ? Minus3 : result; 
 36
 37  return temp; 
 38
 39
 40 double Average(int input1, int input2, int input3) 
 41
 42  double average = 0
 43
 44  average = (input1 + input2 + input3) / 3.0
 45
 46  return average; 
 47
 48
 49 int main() 
 50
 51  int MAX = 0
 52  int MIN = 0
 53  double AVERAGE = 0
 54  int input1 = 0int input2 = 0int input3 = 0
 55
 56  input1 = Input(1); 
 57  input2 = Input(2); 
 58  input3 = Input(3); 
 59   
 60  MAX = MAX_NUM(input1, input2, input3); 
 61  MIN = MIN_NUM(input1, input2, input3); 
 62  AVERAGE = Average(input1, input2, input3); 
 63
 64  ShowValue(MAX, MIN, AVERAGE); 
 65
 66  return 0
 67 }




새로운 함수를 만드는 것은 생각보다 어려웠다. 책을 봤지만 완벽히 이해하지 못했다. 만드는 과정에서 새로운 것을 많이 익혔다.
아직 함수부분은 많이 약한것 같다. 이 부분을 보완해야겠다.