C언어 진짜 많이 했네요,,, 빨리 다른것도 올리고 싶은데, C언어만 올리니깐 1학년 때 생각나고 좋나...? 엥 말하고 보니깐 오랜만에 봐서 좋은거 같기도 어쨋든 계속 올려볼게요! 도움이 될 만한 코드들로~
출발
#1. 구조체로 첫 알파벳만 출력, 지정한 단어 출력
#include<stdio.h>
#include<string.h>
struct p1{
char a[3][6];
int x[3];
};
int main(){
struct p1 p2;
int i, j;
printf("Enter the name : ");
for(i=0; i<3; i++){
gets(p2.a[i]);
}
for(i=0; i<3; i++){
p2.x[0]+=strlen(p2.a[i]);
}
printf("strlen is %d\n", p2.x[0]);
for (i=0; i<3; i++){
printf("%c",p2.a[i][0]);
}
printf("\nwhich do you select?\n");
scanf("%d", &i);
if(i==1)
printf("%s", p2.a[0]);
if(i==2)
printf("%s", p2.a[1]);
if(i==3)
printf("%s", p2.a[2]);
}
혹시 구조체 기억 안 날까봐, 하나 더 넣긴 했는데 이해가 안 될 수 있으니깐, 저번에는 문법 설명만 간략하게 했는데, 코드를 설명해주면, 띄어쓰기를 제외한 단어를 하나 입력하면, 그 단어의 첫 시작을 뽑아서 출력하고, 전체 단어를 출력할 숫자를 선택하여 단어까지 출력합니다. 이때는 알다시피 구조체가 필요 없긴 하지만 쓰는게 도움이 될거 같아서 가져왔어요~~
나중에 자바 object의 개념이라 기억해두면 좋아요!
#2. 구조체
#include<stdio.h>
#include<string.h>
struct stores{
char a[3][10];
float p[3];
int q[3];
int sum[3];
};stores s;
void sum(struct stores s){
for(int i=0; i<3; i++){
s.sum[i]=s.p[i]*s.q[i];
printf("%s price is %d\n", s.a[i], s.sum[i]);
}
int max=0;
for(int i=0; i<3; i++){
if(s.p[i]>max)
max=s.p[i];
}
printf("highest p is %d\n", max);
max=0;
for(int i=0; i<3; i++){
if(s.q[i]>max)
max=s.q[i];
}
printf("highest q is %d", max);
}
int main(){
printf("Enter the name : ");
gets(s.a[0]);
printf("Enter the second name : ");
gets(s.a[1]);
printf("Enter the second name : ");
gets(s.a[2]);
s.p[0]=100;
s.q[0]=20;
s.p[1]=123;
s.q[1]=22;
s.p[2]=125;
s.q[2]=23;
sum(s);
}
구조체와 사용자 지정 함수를 사용하는 것이네요. 여기서 우리는 코드를 보고 딱 두 가지를 깨달으면 좋을거 같아요. 눈치를 채도 좋고, 못 채도 좋아요. 어짜피 눈치 못 채도 지금 배우면 그만이니깐요? 저는 더 심했으니깐 괜찮아요,,여러분 저는 몇 번을 했는데 아직도 헷갈려요
여튼 핵심 1. string 헤더파일이 필요없는데 왜 들어가있는가? 2. 사용자 지정함수에서 매개변수에 스트럭트 구조를 선언했다. 이 두 가지!!를 꼭 기억하면 그냥 끝 사용자지정함수 매개변수에 등록된 저 부분은 struct stores s = s; 의 구조와 똑같죠? 여기서 main 함수의 s변수와 sum 함수의 s는 다른 변수이니깐 헷갈리면 UML 코드를 작성해보면 편할거같아요~ 1번은 안쓰는 헤더파일을 빼는게 좋지 않을까...? 싶네요 사실 뭐 넣어도 괜찮은데, 자바에서는 안 쓰면 빼라고 경고하더라고요...ㅎㅎ 머쓱
#3. 포인터
#include<stdio.h>
void swap(int *p1, int *p2){
int temp = *p1;
*p1=*p2;
*p2=temp;
}
int main(){
int p1=10;
int p2=20;
swap(p1, p2)
printf("%d,%d", p1, p2);
swap(&p1, &p2)
printf("%d,%d", p1, p2);
}
드디어 포인터 부분이 왔습니다. 포인터를 완벽히 이해하고 사용하는 사람은 극히 일부일거라고 저는 조심스럽게 판단을 해보면서, 가볍게 생각을 할 수 있는 부분은 값을 할당하는 주소를 불러와 주소에 할당되어있는 값을 변형할 수 있다~ 라고 생각하면 말은 참 쉽죠? 우리는 이를 call by reference라고 불러요~
자 간단하게!!
Q: 진짜 간단하게 우리가 값을 사용자지정함수에서 메인함수로 넘겨주려면 어떻게 해야되죠?
A: return을 써서 값을 넘겨줘야합니다!
Q: 그런데용 이를 안 쓰고 그냥 사용자 지정함수에 저렇게 swap을 해준다면 값이 바뀔까요?
A: 안 바뀌겠죠
여기서 깨닫는 한 가지! 아! 그럴려고 만든 것이 포인터구나!!!
자 이렇게 왜 쓰게 됐는지 알게 됐으니깐, 실습 결과를 사용하기 위한 포인터 문법은 우리 모두 구글링을 통해 알아보도록하구, 알게 됐다면 이 말을 이해하게 될거에요. 일단 포인터는 주소를 변수에 할당하고, 그 주소에 값을 제어하는 것은 *를 통해 사용한다. 그렇다면, 그 주소를 통해 값을 통제하기 때문에 지역변수 꼴로 사용할 수 있다.
'C' 카테고리의 다른 글
(C언어) 기말고사 (0) | 2022.12.20 |
---|---|
(C언어) 기말고사 전 과제들 - (3) (0) | 2022.12.18 |
(C언어) 기말고사 전 과제들 - (1) (1) | 2022.12.17 |
(C언어) 기말고사 전 과제들 (1) | 2022.12.17 |
(C언어) 모의중간고사, 중간고사 (1) | 2022.12.17 |