함수란?
반복적인 수행을 정의해 놓은 작은 프로그램 단위
함수 구조
반환타입 함수명 (인자들...) {
작업1
작업2
}
아래 문제 중요!!
#include <stdio.h>
void swap(int a, int b) { // swap을 먼저 선언해주던가, 아니면 코드 자체를 main 위에 써줌
int temp;
temp = a;
a = b;
b = temp;
}
int main() {
int k, j;
k = 3;
j = 2;
swap(k, j);
printf("k = %d, j = %d", k, j); // 3 2
return 0;
}
// swap 변수 안에서 교체 된 변수들은 함수의 종료와 함께 모두 메모리에서 지워지고 있다.
// 즉, 메인함수에서는 아무것도 변화되지 않는다
// 만약 전역 변수였다면 main에 있는 변수도 바뀜, 혹은 주소값을 전달하거나 함수가 리턴값을 줘야한다
함수와 반복문
#include <stdio.h>
int func(int n);
int main(void){
int num;
printf("%d\n", func(5)); // 5
return 0;
}
int func(int n){
if(n < 2)
return n;
else {
int i, tmp, current = 1, last = 0;
for (i = 2; i <=n; i++) {
tmp = current;
current += last;
last = tmp;
}
return current;
}
}
// 5값을 리턴하고 모든 지역변수는 메모리에서 내려감
// tmp : ? -> 1 -> 1 -> 2 -> 3
// currnet : 1 -> 1 -> 2 -> 3 -> 5
// last : 0 -> 1 -> 1 -> 2 -> 3
함수에 주소전달
main과 다른 함수에서 사용되는 변수의 이름이 같을 때 지역변수인지, call by reference 인지 이런 것들 잘 체크하기
#include <stdio.h>
int main() {
int x = 10, y = 20;
printf("%d", f(&x, y)); // 51
printf("%d %d\n", x, y); // 15 20
}
int f(int *i, int j) { // 주소로 전달할 때는 이렇게 주고 받는다
*i += 5; // 15 20
return (2 * *i + ++j); // 51, *i = 15, j = 21 이지만 j 같은 경우는 지역변수이므로 메모리에서 내려온다
}
#include <stdio.h>
void change(int *px, int *py, int pc, int pd) {
*px = *py + pd; // x = 60
*py = pc + pd; // y = 70
pc = *px + pd; // pc = 100
pd = *px + *py; // pd = 130
}
void main(void) {
int a=10, b=20, c=30, d=40;
change(&a, &b, c, d);
printf("a=%d, b=%d, c=%d, d=%d", a, b, c, d); // 60 70 30 40
}
#include <stido.h>
double h(double *f, int d, double x) { // f 주소, 4, 2
int i;
double res = 0.0;
for (i = d-1; i >= 0; i--) { // i = 3
res = res * x + f[i]; // 49
}
return res;
}
int main() {
double f[] = {1, 2, 3, 4};
printf("%3.1f\n", h(f, 4, 2)); // 49.0 소수점과 함께 4자리인 경우이므로 3을 초과해서 출력된다고 한다
return 0;
}
#include <stido.h>
void func(int *a, int b, int *c) {
int x;
x = *a; // x = 20
*a = x++; // a = 20, x = 21
x = b; // x = 20
b = ++x; // b = 21, x = 21
--(*c); // c = 19
}
int main () {
int a, b, c[1];
a = 20;
b = 20;
c[0] = 20;
func(&a, b, c);
printf("a=%d b=%d c=%d", a, b, c[0]); // 20 20 19
return 0;
}
아래 실수하기 좋은 문제!
#include <stiod.h>
#define SIZE 3
void func(int *m, int *a, int b);
int main(void) {
int num[SIZE] = {1, 3, 6};
int a = 10, b = 30;
func(num, &a, b);
printf("a=%d, b=%d\n",a, b); // a=7, b=30
return 0;
}
void func(int *m, int *x, int y){
int i = 0, n = 0;
y = *x; // y = 10
n = *(m+1) + (*m+2); // n = 6
*x = ++n; // a = 7
}
다음은 숫자를 처리하는 C 프로그램이다. 3 2 1 4를 입력하였을 때의 출력 결과를 작성하시오.
#include <stdio.h>
void a(int n, int *num) {
for (int i = 0; i< n; i++)
scanf("%d", &(num[i])); // 2 1 4
}
void b(int n, int *lt) {
int a, b;
for (a = 0; a < n-1; a++)
for (b = a+1; b < n; b++)
if (lt[a] > lt[b])
c(lt+a, lt+b);
}
void c(int *a, int *b) {
int t;
t = *a;
*a = *b;
*b = t;
}
int main() {
int n;
int *num;
printf("How many numbers?");
scanf("%d", &n); // 3
num = (int *)malloc(sizeof(int) * n);
a(n, num);
b(n, num);
for (int i = 0; i < n; i++)
printf("%d", num[i]); // 1 2 4
}
'정보처리기사' 카테고리의 다른 글
[정보처리기사] C언어 특강 53~57강 정리(재귀함수) (0) | 2024.10.09 |
---|---|
[정보처리기사] C언어 특강 49~52강 정리(static 변수) (0) | 2024.10.09 |
[정보처리기사] C언어 특강 35~36강 정리(구조체, 배열포인터) (0) | 2024.10.06 |
[정보처리기사] C언어 특강 29~34강 정리(포인터) (0) | 2024.10.05 |
[정보처리기사] C언어 특강 23~28강 정리(포인터) (0) | 2024.10.04 |