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