본문 바로가기
studylog

231018 TIL

by Nam Kyeongmin 2023. 10. 18.

안녕하세용 오늘은 이번 주에 있을 튜터링 수업 전 과제를 푼 것에 대한 기록을 남기려 합니다.

linking 개념을 활용한 문제인 HW2-1.

여기서 활용한 concept은 struct 안 next 변수, 즉 다음 인덱스를 가진 구조체의 주소값을 저장할 변수의 변수명을 struct (구조체명)*으로 선언해야 한다.

오늘도 나의 귀여운 마루노트와 함께 sudo code 그려보기 + concept 간단 복습하기

평소와 달리 문제의 조건 하나하나에 순서를 매겨 분류해 적으니, 코드를 작성할 때 꽤나 도움이 되었다. 문제에 대한 좋은 접근 방법이라는 생각이 든다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
struct NODE{
   int key;
   struct NODE* next; /*struct NODE* 말고 int* 으로 설정할 수는 없는것이겠지? (25줄 참고)*/
}array[5];
struct INDEX {
   int key;
   int num;
}index[5];

int main() {
   struct NODE array[5]={{0,0}, {1,0}, {2,0}, {3,0}, {4,0}};
   printf("Before linking\n");
   for (int i = 0; i < 5; i++) {
      index[i].key = array[i].key;
      index[i].num = i;
      /*key*/
      /*근데 왜 인덱싱한 것인지 모르겠음. 왜 하라고 한 걸까?*/
      printf("i=%d key=%d next=%d Add=%d\n", i, array[i].key, array[i].next, &array[i]);
   }
   /*before node link*/
   printf("\nAfter linking\n");
   for (int i = 0; i < 5; i++) {
      if (i != 4) {
         array[i].next = &array[i + 1];
      }
      printf("i=%d key=%d next=%d Add=%d\n", i, array[i].key, array[i].next, &array[i]);
   }
   /*After node link */
}

 내가 작성한 코드에서는 구조체 변수명을 NODE로 설정했기 때문에 next의 변수명은 struct NODE*가 되는 것!

왜냐하면 주석에도 적었듯이, array[i].next = &array[i+1]; 을 수행할 때, array[i+1]가 구조체 변수명의 포인터 변수에 들어가는 형태이기 때문이다. 즉, NODE의 포인터로 선언된 변수에 저장되어야 하기 때문이다. 아 그리고 문제에서 인덱싱하라고 해서 인덱싱하기는 했는데, 왜 하라고 한 건지 아직도 의도를 모르겠다. 20일 금요일 튜터링 모임에서 튜터분께 한번 여쭤봐야겠다.

 (+) 방금 발견한 티스토리의 아쉬움... 코드블럭 형태로 따로 코드를 분류할 수 있는 건 정말 좋은 기능인 것 같은데, 왼쪽에 적혀있어야 할, 몇 번째 줄인지 알려주는 부분이 없다는 것이 조금 아쉽다. 🥹

그리고 HW2-2. 사실상 2-2와 2-3은 같은 문제인데 조건이 하나 다르다.

바로 call by value 대 call by reference! 2-2는 call by value이기 때문에 조금 더 편안한 마음으로 풀었다. (아직 포인터에 대해 조금은 어려움을 느끼고 있는 나..얼른 극복하자)

마찬가지로 HW2-1과 마찬가지로 sudo code 작성하기.

근데 이번에 사용한 개념은 정말 간단해서 sudo code도 딱 심플하게 작성했다. 바로 코드로 넘어가보자.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
struct INFO{
   char name[10];
   int height;
   int weight;
   int schols;
};
int check_height(int he) {
   if (he < 180) {
      he = 180;
   }
   return he;
}
int check_weight(int we) {
   if (we < 100) {
      we = 100;
   }
   return we;
}

int main() {
   struct INFO student[5] = { 0 };
   for (int i = 0; i < 2; i++) {
      printf("Type %d-th student's info(Name, height, weight, schols): ", i);
      scanf("%s %d %d %d", &student[i].name, &student[i].height, &student[i].weight, &student[i].schols);
      student[i].height = check_height(student[i].height);
      student[i].weight = check_weight(student[i].weight);
   }
   printf("Name     =      %s\nHeight   =     %d\nWeight   =     %d\nSchols   =      %d\n", student[0].name, student[0].height, student[0].weight, student[0].schols);
   printf("\nName     =      %s\nHeight   =     %d\nWeight   =     %d\nSchols   =      %d\n", student[1].name, student[1].height, student[1].weight, student[1].schols);
}

 사실 main함수 밖에서 함수를 선언하는 게 코드의 효율성을 위해선 좋기 때문에, 습관화해야 하는데 아직 익숙지 않아서 조금은 낯설어했던 나다. 근데 언제까지고 낯설 수는 없기 때문에 이번 코드를 풀 때 함수 호출하기 연습할 겸 함수를 만들어 간단한 연산 후, 값을 반환하게 했다. (그리고 알고 보니, 함수를 이용해야 원하는 조건을 사용할 수 있는 구조였다 ㅋㅋ)

 (+) 그리고 마지막 프린트할 때도 for문안에 넣어도 좋겠지만, 주어진 터미널 형태와 똑같이 구현하고자 그냥 프린트문 두 개로 만들었다. ㅎㅎ 여기까지가 call by value,

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
struct INFO {
   char name[10];
   int height;
   int weight;
   int schols;
};
int check_height(int* he) {
   if (*he < 180) {
      *he = 180;
   }
   return *he;
}
int check_weight(int* we) {
   if (*we < 100) {
      *we = 100;
   }
   return *we;
}

int main() {
   struct INFO student[5] = { 0 };
   for (int i = 0; i < 2; i++) {
      printf("Type %d-th student's info(Name, height, weight, schols): ", i);
      scanf("%s %d %d %d", &student[i].name, &student[i].height, &student[i].weight, &student[i].schols);
      student[i].height = check_height(&student[i].height);
      student[i].weight = check_weight(&student[i].weight);
   }
   printf("Name     =      %s\nHeight   =     %d\nWeight   =     %d\nSchols   =      %d\n", student[0].name, student[0].height, student[0].weight, student[0].schols);
   printf("\nName     =      %s\nHeight   =     %d\nWeight   =     %d\nSchols   =      %d\n", student[1].name, student[1].height, student[1].weight, student[1].schols);
}

여기가 call by reference, HW2-3이다.

바뀐 것은 함수에 들어가는 값을 포인터형태로 주고, main 함수에서 값을 할당할 때, 포인터형 변수(여기서는 we)에 할당할 주소를 입력한다는 점이다. 즉 &student[i].height는 he로, &student[i].weight는 we로 간다!!

 

 오늘의 코드는 쉬워 보일 수 있지만, 매일 꾸준히 감을 잃지 않고 프로그래밍 연습하는 것이 중요하고 좋은 것 같다. 앞으로도 꾸준히 문제를 풀어야겠다! ✊

'studylog' 카테고리의 다른 글

240419 백준1008번 A/B  (0) 2024.04.19
231020 TIL  (0) 2023.10.20
231017 TIL  (0) 2023.10.18
231015~16 TIL  (2) 2023.10.16
231013 TIL  (2) 2023.10.13