민트맛뚱이
kwangkwang우럭따
민트맛뚱이
전체 방문자
오늘
어제
  • 분류 전체보기 (16)
    • C (12)
    • C programming (2)
    • digital engineering (1)
    • machine learning (0)
    • Data communication (0)
    • signal processing (0)
    • computer architecture (RISC.. (0)
    • project (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
민트맛뚱이

kwangkwang우럭따

뚱이가 알려주는 소프트웨어

(C언어) 기말고사 전 과제들 - (3)
C

(C언어) 기말고사 전 과제들 - (3)

2022. 12. 18. 06:30

새벽에 쓰게 되네요~~ 


#1. 세 개의 숫자를 swap하면서 최대 최소 찾기!

#include<stdio.h>
void p_f(float *a, float *b, float *c){
	float k;
	int avg, t;
	
	t=*a;
	*a=*b;
	*b=*c;
	*c=t;
	
	if(*a>*b){
		if(*a<*c)
	        printf("HIGH c");
	        else//a>c
	        printf("HIGH a"); 
	} 
    else if(*b>*c){
    	        if(*b>*a)
    		printf("HIGH b");
    	        else //b<a
    	        printf("HIGH a"); 
	    }
    else if(*c>*a){
		if(*c>*b)
		printf("HIGH c");
	        else //c<b
	        printf("HIGH b");
	}  		 
	
	k=*a+*b+*c;
	printf("\nsum is %f", k);
	avg=k/3;
	printf("\navg is %d", avg);
	
}

int main(){
	int t;
	float x=10.5, y=30.66, z=32.5;
	float *a=&x, *b=&y, *c=&z;
	printf("%f\n", *a); 
	p_f(a, b, c);
}

 음 이 코드는 솔직히 pointer를 이해했나를 확인하려는 코드인데요. 너무 많이 해서 질릴 정도,,, 우리 최대 최소는 어떻게 구하는지 기억나나요? 기억 안 나도 괜찮아요! 저도 잘 까먹기 때문에 또하면 되거든요~ 그래서 제 즐겨찾기 주소는 창이 터져나간답니다. 최대 최소는 세 개의 대수를 비교에서부터 시작되죠? 비교하고 정렬처럼 사용해도 되고 새로운 변수를 지정해 max값과 min값을 넣어줘도 된답니다. 그리고 이를 pointer로 받으면 끝인 코드에요~

 pointer 핵심은 뭐다? 값을 바로 받지 않는 call by value가 아닌 call by reference이다~~ 이거 알면 이론점수 만점 쌉가능 진짜로 아는척 하고싶다? 포인터 call by reference라 주소 지정하고 값 바꿔야돼 하는 순간 끝임 ㄹㅇㅋㅋ


#2. 구조체와 포인터

#include<stdio.h>
struct person{//구조체 설정  
	char a[3];
	int age;
};

void m(struct person *p){
	/*나이 제일 많은 사람을 선정함*/ 
	if(p->age > (p+1)->age && p->age > (p+2)->age)
	printf("%s is largest %d", p->a, p->age);
	
	else if(p->age > (p+1)->age && p->age < (p+2)->age)
	printf("%s is largest %d", (p+2)->a, (p+2)->age);
	
	else if(p->age < (p+1)->age && (p+2)->age < (p+1)->age)
	printf("%s is largest %d", (p+1)->a, (p+1)->age);
	
	else if(p->age < (p+1)->age && (p+2)->age > (p+1)->age)
	printf("%s is largest %d", (p+2)->a, (p+2)->age);
	
	else if((p+2)->age < (p+1)->age && (p+1)->age < (p)->age)
	printf("%s is largest %d", p->a, p->age);
	
	else if((p+2)->age < (p+1)->age && (p+1)->age > (p)->age)
	printf("%s is largest %d", (p+1)->a, (p+1)->age);
	
	else{
	printf("number same! check please!");
	} 
}

int main(){
	struct person a[3], *p;
	//p=a[0]랑 똑같은 말 
	for(p=a;p<a+3;p++)//p<a+3 
	scanf("%s%d", p->a, &p->age);// 띄어쓰기를 받는법? 다른 변수를 지정 or 아니면 [^\n]이거는 안됨 
	m(a);//사용자지정함수 설정 
}

 자,,이것도 이해하기 위해서는 우리는 thinking~~~again...이해 안 돼도 인정할게요...저도 몰랐었거든요..무조건 이해 안 되겠지만 이해하면 난 천재다 하고 넘겨요. 이 코드는 구조체를 활용하면, 구조체 데이터 타입을 통해 a, age를 받을 수 있죠? 포인터를 사용하면 이 데이터들을 가지는 p를 여러개 사용할 수 있는 장점을 가집니다.

자 이 코드를 이해하기 위한 포인트들을 설명할게요.

 

1. 포인터에 선언할 때 주소가 아닌 그냥 배열을 선언한다.

2. 배열이 ㅁ ㅁ ㅁ \n 이런식의 구조로 생성이 된 배열의 공간에 p를 할당한다. 배열을 즉 주소로 대체하는 꼴이죠?

3. 포인터 배열은 .이 아닌 -> 를 통해 사용한다.

 

자 이 3개가 제가 이해한 포인트 입니다. 이 포인트 3개만 이용한다면, 그냥 구조체처럼 사용할 수 있는 것이죠!!!

 

 그럼 우리는 이 코드에서 포인터 구조체를 왜 사용하는 걸까요?

A: 답은 상기에 적어놓았지만, 간단하게는 이름과 나이를 가지는 사람의 데이터를 여러명 생성할 수 있다!

 

이해가 안 되면 외우세요

문법적인 포인트는 3번, 우리가 이해해야하는 포인트는 2번

개념만 알고싶다 0 ㅡ> 2번만 기억하세요 배열공간을 주소로 사용하자 이것입니다.!!!!!


#3. 포인터 배열

#include<stdio.h>
#include<string.h>
void l_c(char *a[3], char c){
	int i, j, count;
	
		for(i=0;i<3;i++){//각각의 이름 
		for(j=0;*(a[i]+j)!='\0';j++) {/*a[0]+1 한 칸 차지 여기서 끝을 설정하면 널 값을 받고 정지*/
			if(*(a[i]+j)==c) /*내가 설정한 값과 만나면 count를 1개씩 더 함*/ 
			count++;
	}
 }
	printf("%c letter is %d\n", c, count);
	
 	printf("\n1 strlen %d", strlen(a[0])); //길이를 측정 
 	printf("\n2 strlen is %d", strlen(a[1]));
	printf("\n3 strlen is %d", strlen(a[2]));
}

int main(){
	char *a[3]={"kang","sing","su"};
	char c;
	
	printf("which letter you want to count : ");
	c=getchar();
	l_c(a, c);
}

야매긴 해도 point만 잘 기억하면 언젠가!!!!! 기억날거에요

 이 코드는 포인터 배열이에요. 자 정식으로 사용하는 것은 int *(변수[]) 이렇게 사용해야하는데, 포인터 연산자의 우선순위가 더 높기 때문에 보통 빼고~  생각합니다. 근데 코드로 설명하면, 이해가 안 될 수 있다고 생각해서 수정을 하고 설명을 드릴게요~ 개념만 보고 가세요


#4. (수정)

#include<stdio.h>
#include<string.h>
void l_c(char *a[3], char c){
	int i, j, count;
	
		for(i=0;i<3;i++){//각각의 이름 
		for(j=0;*(a[i]+j)!='\0';j++) {/*a[0]+1 한 칸 차지 여기서 끝을 설정하면 널 값을 받고 정지*/
			if(*(a[i]+j)==c) /*내가 설정한 값과 만나면 count를 1개씩 더 함*/ 
			count++;
	}
 }
	printf("%c letter is %d\n", c, count);
	
 	printf("\n1 strlen %d", strlen(a[0])); //길이를 측정 
 	printf("\n2 strlen is %d", strlen(a[1]));
	printf("\n3 strlen is %d", strlen(a[2]));
}

int main(){
	char name[3][20];
	char *a[3];
	char c;
	int i=0;
	
	for(i=0; i<3; i++){
		a[i]=name[i];
	}
    
	for(i=0; i<3;i++) scanf("%s",*(a+i));
    
	printf("which letter you want to count : ");
	c=getchar();
	c=getchar();
	l_c(a, c);
}

자 코드 수정했고, 잘 돌아가네요. 아까 기억나실지 모르겠는데 배열을 주소로 생각한다.

 

그럼 포인터 배열을 왜 쓸까...?

자! 이것의 장점!은 아무리 생각해도 저는 모르겠어요. 그냥 다들 쓰니깐,,따라 쓰는거지 아직 정확히 뭐가 편한지 모르겠어요. 일단 어떻게 쓰는지는 포인터를 이해하면서 알게 되었는데, 2차원 배열을 call by reference하고 싶어! 라고 생각하는게 맞는듯 한데. 포인터를 2차원 배열의 형태로 사용하고 싶어서 제작 된 것인데요...!!

 일단 여기서 point도 설명해볼게요~ 그러면 공통점이 존재할거고, 우리는 그것을 생각해보면 될듯요

배열 name[3][20]
ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ
ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ
ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ
3행 20열로 존재
포인터 *p[3]
ㅁㅁㅁ으로 존재

1. 포인터 배열, 즉 하나의 포인터에서 사용하는 배열이 존재! 그 칸은 총 3개!

2. 그 포인터에 주소값은 name의 배열 공간으로 들어갑니다. (이때 배열의 공간은 name의 행공간에 배분)

ㅁ ㅡ> name[1]ㅁx20

ㅁ ㅡ> name[2]ㅁx20

ㅁ ㅡ> name[3]ㅁx20

3. 포인터 배열마다 name의 행들의 공간을 할당받음 (2차원 배열에서 행을 의미)


기말고사 범위는 여기까지인데 사실 이차원포인터, 파일입출력, 동적할당도 남았는데, 그거는 기말고사 올리고 할지 말지 고민해볼게요.

모두들 굿나잇~~

'C' 카테고리의 다른 글

(C언어) 기말고사  (0) 2022.12.20
(C언어) 기말고사 전 과제들 - (2)  (1) 2022.12.18
(C언어) 기말고사 전 과제들 - (1)  (1) 2022.12.17
(C언어) 기말고사 전 과제들  (1) 2022.12.17
(C언어) 모의중간고사, 중간고사  (1) 2022.12.17
    민트맛뚱이
    민트맛뚱이
    암 벅

    티스토리툴바