코딩/C언어

수업014_함수 ~ 수업015_함수와배열02 , 문제014_함수 ~ 문제015_함수와배열(1~3)

tree0505 2025. 7. 3. 10:50
반응형

_11_교재


    • 수업013_입력.cpp
#include <stdio.h>

int main(void) {

	int n;
	printf("숫자를 입력하고 엔터를 누르시오.");
	scanf("%d", &n); 
	printf("입력한숫자는 %d 입니다.\n", n);
	return 0;
}

  • 수업014_함수.cpp
#include <stdio.h>

void print() {

	printf("print() 함수입니다.\n");
}

int main(void) {

	print();
	print();
	print();

	return 0;
}

  • 수업014_함수02.cpp
#include <stdio.h>

void print(int a) {

	printf("%d\n", a);
}

int main(void) {

	print(10);
	print(2);
	print(3);

	return 0;
}

  • 수업014_함수03.cpp
#include <stdio.h>

void plus(int a, int b) {
	printf("%d\n", a + b);
}
void minus(int a, int b) {
	printf("%d\n", a - b);
}

int main(void) {
	plus(10, 3);
	minus(10, 3);

	return 0;
}

  • 수업014_함수04.cpp
    • return은 자료형을 맞추어 주어야 한다.
    • retrun이 없으면 void
    • 있으면 자료형 맞추어 주기 
#include <stdio.h>

int change(int n) {
	n = 20;
	return n;
}

int main(void) {
	int n = 10;
	printf("%d\n", n);
	// 리턴으로 함수를 이용해 변수값을 변경할수있다. 
	n = change(n);
	printf("%d\n", n);
	return 0;
}

  • 수업014_함수05.cpp
#include <stdio.h>
#include <stdlib.h>

void swap(int a, int b){
	int temp;
	temp = a;
	a = b;
	b = temp;
}


int main(void) {
	int k, j;
	k = 3;
	j = 2;
	swap(k, j);
	printf("%d %d \n", k, j); // 값이 안바뀜 
	//변수는 안 바뀐다. 
   
	return 0;
}

  • 수업015_함수와배열.cpp
    • 변수는 바뀌지 않는다. 
#include <stdio.h>

void temp(int a, int b) {
	a = 30;
	b = 40;
	printf("temp() ==> %d %d \n", a, b);
}

int main(void) {

	int a = 10;
	int b = 20;
	temp(a, b);
	// 값이 전혀 바뀌지않는다. 
	printf("main() ==> %d %d \n", a , b);

	return 0;
}

  • 수업015_함수와배열02.cpp
    • 배열은 바뀐다. 
#include <stdio.h>

void temp(int arr[]) {
	arr[0] = 100;
	arr[1] = 200;
	arr[2] = 300;
}

int main(void) {

	int arr[] = { 10, 20, 30 };
	int i = 0;
	for (i = 0; i < 3; i++)
		printf("%d ", arr[i]);
	printf("\n\n\n");

	// 배열은 수정이 된다. 
	temp(arr);

	for(i = 0; i < 3; i++)
		printf("%d ",arr[i]);
	printf("\n\n\n");

	return 0;
}

  • _11_문제

  • 문제014_함수02.cpp
#include <stdio.h>
#include <stdlib.h>

void swap(int a, int b){
	int temp;
	temp = a;
	a = b;
	b = temp;
}


int main(void) {
	int k, j;
	k = 3;
	j = 2;
	swap(k, j);
	printf("%d %d \n", k, j); // 값이 안바뀜 
   
	return 0;
}

  • 문제014_함수03.cpp
    • 프로그램은 위에서 아래로. 왼쪽에서 오른쪽으로 
#include <stdio.h>
#include <stdlib.h>

// 함수전방선언 // 전방선언을 하면 main 밑에 함수를 정의할수있다. 
int func(int n);	
	//모르기 때문에 위에 적어놓는것 

int main(void) {
	//main함수는 func이라는 함수를 모른다. 
		//그래서 에러가 난다. 
		//위에 적으면 밑으로 내려 갈 수 있다. 
	int num;
	printf("%d\n" , func(5)); //5 
	return 0;
}

int func(int n){
	if (n < 2)
		return n;
	else{
		int i, tmp, curent = 1, last =0;

		// 2 , 3 , 4 , 5 
		for (i = 2; i <= n; i++){
			tmp = curent; // 1 //1 //2 //3
			curent += last; // 1 //2 //3 //5
			last = tmp; // 1 //1 //2 //3
			printf("%d %d %d %d\n" , i , tmp , curent, last);
			// 2 1 1 1
			// 3 1 2 1
			// 4 2 3 2
			// 5 3 5 3
		}
		return curent;
	}
}

  • 문제014_함수04.cpp
#include <stdio.h>
#include <stdlib.h>

int func(int base, int exp); //전반선언 

int main(void) {
	int res;
	res = func(2, 10);
	printf("main=> %d\n" , res);
	return 0;
}

int func(int base, int exp){ // 2, 10 
	int res = 1;
	int i =0;

	//0 1 2 3 4 5 6 7 8 9 
	for (i = 0; i < exp; i++){
		// 1 * 2, 2 * 2, 3 * 2, 4 * 2, 5 * 2, 6 * 2, 7 * 2, 8 *2, 9 * 2 
		res = res * base;
		printf("%d \n" , res);
	}
	return res;
		
}

  • 문제014_함수05.cpp
    • 전역 변수 
    • 밖에 있는 변수는 미리 만들어 진다. 
    • 자바에서는 스태틱과 같다. 
    • 그 다음에 main이 실행된다. 

#include <stdio.h>
#include <stdlib.h>

// 함수와 전역변수 
int a = 1, b = 2, c =3;
int f();

int main(void) {
	printf("%3d\n", f()); //12 
	printf("%3d %3d %3d\n" , a , b , c); 
	//여기는 밑의 함수와 상관 없이. 위의 전역변수로 나온다. 
	// 4 2 3 
	return 0;
}

int f(){
	int b, c; //먼저 우선순위 
	a = b = c = 4;
	return (a + b + c);
}

  • 문제014_함수06.cpp

#include <stdio.h>
#include <stdlib.h>

int star = 10; //지역 변수 

void printStar(){
	printf("%d\n", star); //10 
	//이 star은 위의 지역 변수 10이다. 
}
int main(void) {
	int star = 5; //이것은 main안에서만 쓸 수 있다. 
	printStar();
	printf("%d\n" , star); // 5 
	return 0;
}

  • 문제014_함수07.cpp

#include <stdio.h>
#include <stdlib.h>

//1. 전역변수. 3번 전역에 만들어 진다. 제일 먼저 만들어 진다. 
int a = 10;
int b = 20;
int c = 30;


void func(void)
{
	static int a = 100;
	//스택틱도 전역변수에 만들어진다. 3번 
	//한번 하고. 2번째는 동작을 안한다. //2번째는 동작 x 
	//100이 아니라. 그래도 101이다. 
	int b = 200;
	a++;
	b++;
	c = a;
}

//2. 그다음 main이 실행됨. 
int main(void) {
	func();
	func(); //2번째 
	
	printf("a = %d, b = %d, c = %d\n", a, b, c);
	
	return 0;
}

출력 : a  = 10 , b = 20, c = 102 


  • 문제015_함수와배열.cpp
#include <stdio.h>

void align(int a[]) { //배열은 바뀐다. 
	// 버블정렬 
	int temp;
	int i;
	int j;

	// 0 1 2 3 
	for (i = 0; i < 4; i++) {

		//0123, 012, 01, 0
		for (j = 0; j < 4 - i; j++) {

			// 85, 75, 50, 100, 95
			// 75, 50, 85, 95, 100
			// 50, 75, 85, 95, 100
			// 50, 75, 85, 95, 100
			if (a[j] > a[j + 1]) {
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
		}
	}
}

int main(void) {

	int a[] = { 85, 75, 50, 100, 95 };
	align(a);
	int i;
	for (i = 0; i < 5; i++)
		printf("%d ", a[i]);
	return 0;
}

  • 문제-예제

  • 예제001.cpp
    • 스택에 만들 수 있는것 
    • 삭제를 못 한다. 

#include<stdio.h>
#include<stdlib.h>
#define N 3

int main(void){
    /*
        c언어의 데이터 저장 종류 
    */
    /*
        stack에 만들어지는 데이터 
        (1) 변수, (2) 일차배열, (3) 이차배열 
    */
    int a; 
    int arr[3]; 
    int darr[3][3];

    //지역변수로 만들 수 있다. 
    //원래는 못 만드는데. 
    //c언어는 만들 수 있따. 
    //main함수 안에 만들 수 있다. 


	return 0;
}

  • 예제002.cpp
    • heap 만들 수 있다. 
    • heap만들면 삭제 할 수 있다. 

#include<stdio.h>
#include<stdlib.h> //이게 있어야. malloc()을 쓸 수 있다. 
#define N 3

int main(void){
    /*
        c언어의 데이터 저장 종류 
    */
  

    /*
        heap 에 만들어지는 데이터
        heap에 만들어지는 데이터는 반드시 사용후 삭제해야한다. 
        // 생성함수 malloc();
        // 삭제키워드 free();
    */
    /*
        엠얼록사용법 
        엠얼록을 사용하여 heap에 공간을 생성할수있다. 
        단, 직접 원하는 바이트를 적어야한다.   
        malloc(바이트); //메모리 할당. 메모리얼록케이션? 
    */

    malloc(16); //공간 생성 

    
    
	return 0;
}

  • 예제003.cpp
#include<stdio.h>
#include<stdlib.h>
#define N 3

int main(void){
   
    malloc(16);  //=>new int[4]; 
    //이렇게 만들면. heap에 메모리를 만든것.
    //이렇게 만들면 메모리는 만들었는데. 사용할 수 없다.
    //왜? 어디있는지 모르니까.  

    //자바에서 
    //int[]arr = new int[4]; 
    //여기서 앞을 안 쓴것과 같다. new int[4]; 
    //변수가 있어야. arr[1] = 100; 

    //c언어는 변수를 포인터 
    int * p;  //=>int [] arr; 같다. 
    

    /*  
        이와같이 heap에 메모리를 생성하나 접근할수없기때문에 사용할수없다.
        마치 자바의 int[] arr = new int[4]; 를 하지않고, 
        new int[4]; 만 한것이랑 같은 상황이다. 
    */
    
    /*
        힙에 생성되기 때문에 주소를 저장해야 한다.
        원하는 자료형의 포인터변수에 저장한다. 
        int * p = malloc(16); 는  
        자바의 int[]arr = new int[4]; 와 같은상황이다.
    */


    int* p = malloc(16);   //int[]arr = new int[4]; 
    free(p); // 사용후에는 메모리삭제를 직접한다. 
    // 자바는 자동삭제가된다. 

    
	return 0;
}
​

  • 예제004.cpp
#include<stdio.h>
#include<stdlib.h>
#define N 3

int main(void){
  
    /*
        int* p = malloc(16); 
        16은 보기가 않좋다. 
        malloc(16) => 통으로 메모리를 만든것 
            // 몇칸짜리인지 모른다.
            그래서 (int*)을 붙여주어야 한다.   
            즉, 몇 바이트씩 나누어진지 모른다. 몇개씩 써야 하는지. 
            p[0] = 10; 
                4바이트에 들어가야하는데. 모른다는 것.  

                
        이렇게되면 생메모리 16바이트가 몇개로 나눠지는지
        알수가없기때문에 int* p = (int*)malloc(16);  이와같이 형변환을한다. 
        그리면 malloc()은 아하 4바이트씩 사용한다는 것을 인지한다. 
        예를들어
        char* cp = (char*)malloc(16);
        은 char[] arr = new char[4]; 가아니라 char[] arr = new char[16];으로인지한다.
        왜냐하면 char는 1바이트이기때문이다. 

        정리하면 (int*)malloc(16); 은 16바이트를 4바이트단위로 잘라줘라는뜻이다.
    */

    // 아래 는 똑같은 16바이트지만 뜻이 완전히 다르다. 
    int * p = (int*)malloc(16); 
    //4바이트씩 나누라는 뜻 
    //자바로변형시 int[] arr = new int[4];
    //(int*) => 형변환
    //4개씩 나누어서 저장되고. p에 저장된다. 
    //p[15]; //이러면 에러 
    //p[0~3]; 이게 끝이다. 

    char* cp = (char*)malloc(16); 
    //1칸씩 저장해라. char*
    // cp[0~15]; 1바이트니까. 가능하다. 
    //자바로변형시 char[] arr = new char[16];

    

	return 0;
}

  • 예제005.cpp
#include<stdio.h>
#include<stdlib.h>
#define N 3

int main(void){
  

    /*
        int * p = (int*)malloc(16);
        //16이 보기가 싫다. 

        위 형태에서 최종적으로 한번의 변화를 더한다. 16이라는 숫자는
        아무래도 헷갈리는 위험이 있기때문이다. 

    */

    // SIZE는 4이고 sizeof(int) 또한 4이므로 16이된다.

    //최종형태 
    int SIZE = 4; 
    int * p = (int*)malloc(SIZE * sizeof(int));
    free(p);
    // 결국 저한줄이 int[]arr = new int[SIZE]; 와같다.

	return 0;
}

  • 예제006.cpp

#include<stdio.h>
#include<stdlib.h>
#define N 3

int main(void){
  
    /*
        포인터 변수의 종류 
    */


    int *p; // 일차배열 
    p = (int*)malloc(N * sizeof(int)); 
    // 12바이트
    // 3칸 배열     
    //----------------------------------------------
    //2차배열 

    int (*pArr)[N]; 
    //p가 3개 있는것 
    // 이차배열 // 스택과 힙이 반반섞어 만드는방법 
    pArr = (int(*)[N])malloc(N * N * sizeof(int)); // 3 * 3 * 4
    //9칸 

    // 마치 아래와 같다. 
    //pArr[0] = (int*)malloc(N * sizeof(int));
    //pArr[1] = (int*)malloc(N * sizeof(int));
    //pArr[2] = (int*)malloc(N * sizeof(int));


    int **pp;      // 이차배열 // 온전히 힙으로만 만드는방법
    pp = (int**)malloc(N * sizeof(int*)); // 머리만 3개 만들기
    //각각 new를 한것  
    //머리를 저장하는것을 또 만든것 
    pp[0] = (int*)malloc(N * sizeof(int));
    pp[1] = (int*)malloc(N * sizeof(int));
    pp[2] = (int*)malloc(N * sizeof(int));


	return 0;
}

  • 예제007.cpp

#include<stdio.h>
#include<stdlib.h>
#define N 3

int main(void){
  
    int (*pArr)[N]; //머리 3개 만든것 //main에 만든것 
    pArr = (int(*)[N])malloc(N * N * sizeof(int)); 

    int num = 0;
    for(int i = 0; i < N; i++){ //2차원 배열도 된다.
        //2차로 저장함  
        for(int j = 0; j < N; j++){
            pArr[i][j] = num;
            num += 1;
        }
    }

    for(int i = 0; i < N; i++){
        for(int j =0; j < N; j++){
            printf("%d " , pArr[i][j]);
        }
    }

    printf("\n\n");

    // c언어 2차배열은 1차배열과 같다. 
    // 그러므로 첫번째 주소를 *p에 저장할수있다. 
    int * p; //그냥 배열 
    p = (int*)pArr; //주소를 준것 

    printf("%d %d %d",p[0], p[4], p[8]); 

	return 0;
}

 

반응형