언어/c언어

# 네이버 _ 2017_10_21

파아랑새 2017. 10. 21. 11:38

# include <stdio.h>
# include <stdlib.h>
# include <stdbool.h>
//+++++++++++++++++++++++++++++++++++++
typedef struct _NaverStu
{
 int* pArray;
 int secondSmall;
 int firstSmall;
 int sizeValue;
}NaverStu;
//+++++++++++++++++++++++++++++++++++++
NaverStu* creatNode();
void _init_(NaverStu** param);
void _arraySize_(NaverStu** param);
void _elementWrite_(NaverStu** param);
void _smallTwoValue_(NaverStu** param);
//+++++++++++++++++++++++++++++++++++++
int main(void)
{
 NaverStu* node = NULL;
 node = creatNode();
 _init_(&node);
 _arraySize_(&node);
 _elementWrite_(&node);
 _smallTwoValue_(&node);
 free(node);
 return 0;
}
//+++++++++++++++++++++++++++++++++++++
NaverStu* creatNode()
{
 NaverStu* pNode = (NaverStu*)malloc(sizeof(NaverStu));
 return pNode;
} // end of creatNode function
//+++++++++++++++++++++++++++++++++++++
void _init_(NaverStu** param)
{
 if ((*param) == NULL)
 {
  fprintf(stderr, "malloc error ... !!!\n");
  exit(1);
 }
 else
 {
  (*param)->pArray = NULL;
  (*param)->secondSmall = 0;
  (*param)->firstSmall = 0;
  (*param)->sizeValue = 0;
 }
} // end of _init_ function
//+++++++++++++++++++++++++++++++++++++
void _arraySize_(NaverStu** param)
{
 int tmpSize = 0;
 int* ptr = NULL;
 printf("크기 입력:  ");
 scanf("%d", &tmpSize);
 (*param)->sizeValue = tmpSize;
 (*param)->pArray = (int*)malloc(sizeof(int)*tmpSize);
 if ((*param)->pArray == NULL)
 {
  fprintf(stderr, "malloc error... !!!\n");
  exit(1);
 }
 else // (*param)->pArray != NULL
 { // Initiallize____________________________
  ptr = (*param)->pArray;
  for (int i = 0; i < tmpSize; i++)
  {
   *(ptr + i) = 0;
  }

  // data printf____________________________
  for (int i = 0; i < tmpSize; i++)
  {
   printf("%d ", *(ptr + i));
  }
  printf("\n"); // 개행
 }
}
void _elementWrite_(NaverStu** param)
{
 int tmpSmall = 0;
 int* pNode = NULL;
 pNode = (*param)->pArray;
 for (int i = 0; i < (** param).sizeValue; i++)
 {
  printf("[%d] 번째 값 입력 =>  ", i+1);
  scanf("%d", (pNode + i));
  // 배열중에 가장 작은 수____________________
  if (i == 0)
  {
   tmpSmall = *(pNode + i);
  }
  else
  { // i != 0
   if (tmpSmall > *(pNode + i))
   {
    tmpSmall = *(pNode + i);
   }
  }
 }
 (*param)->firstSmall = tmpSmall;
} // end of _elementWrite_ function
void _smallTwoValue_(NaverStu** param)
{
 bool flag = false;
 int index = 0;
 int tmpTwoSmall = 0;
 // 가장 작은 값보다 큰 수
 while (true)
 {
  if ((*param)->firstSmall < (*param)->pArray[index])
  {
   (*param)->secondSmall = (*param)->pArray[index];
   flag = true;
   break;
  }
  else
  { // (*param)->firstSmall < (*param)->pArray[index]
   index++; // 후위 증감식
   if (index == (*param)->sizeValue) { break; }
  }
 }
 if (flag == false)
 {
  printf("second small value => %d\n", (*param)->firstSmall);
 }
 else
 {// flag == true
  // case 1 : "두번째로 작은 값이 마지막 위치에 있을 경우"
  if (index == (*param)->sizeValue - 1)
  {
   printf("second small value => %d\n", (*param)->secondSmall);
  }
  // case 1
  else
  { // index != (*param)->sizeValue - 1
   for (int i = index + 1; i < (*param)->sizeValue; i++)
   {
    if ((*param)->pArray[i] != (*param)->firstSmall)
    {
     if ((*param)->secondSmall > (*param)->pArray[i])
     {
      (*param)->secondSmall = (*param)->pArray[i];
     }
    }
   }
  }
  printf("second small value => %d\n", (*param)->secondSmall);
 }
} // end of _smallTwoValue_ function