반응형
- 자바 -> C 언어 넘어가는 과정에서 기본 베이직 복습 / 포인터 등 이해 빠르도록 초반부터 정리합니다.
- 가독성은 라이 님 블로그가 최고니까 거기에서 보시는 걸 추천.
https://m.blog.naver.com/kks227/60197470889
함수
- 함수를 호출한다: 함수를 사용한다. add(8, 9); 같은 것
- 매개변수: 함수에 전달하는 인자. 괄호 안에 들어가 있다. (호출과 동시에 초기화)
- 리턴(return) : 만나면 함수가 종료됨, void의 경우는 return; 만 쓰면 됨
- 시스템 함수: 이미 컴퓨터에서 제공하고 있는 함수
- 사용자 함수: 사용자가 제작한 함수
- main 함수 위에 먼저 만들어 줘야 한다
- 함수의 작성
- 함수의 리턴값의 자료형, 함수의 인자, 함수의 내용(return 포함)이 필요
- 함수의 이름 - 중복 불가능
- 매크로 함수: #define add(x, y) (x+y)
- sum = add(3,7);
- sum=(3+7);
- #define add(type, x, y) ((type)(x+y))
- sum = (float, 3.2, 7.1);
- sum = ((float)(3.2+7.1));
지역 변수 / 전역 변수
- 지역 변수: 어느 범위 안에서만 살아 있는 변수
- 전역 변수: c 파일 전체에서 살아 있는 변수 / 어떤 함수보다 위에 있다
- 스코프: 활동 범위
- 블록: {} / 블록 안에서 선언된 변수는 그 블록 밖을 나가면 죽는다
- 초기화 이후 대입되지 않은 b값은 0으로 출력
- 아래 코드 보면서 결과 생각해 보기
...더보기
#include <stdio.h>
int b;
void test(){
b = 5;
}
int main(){
printf("%d\n", b);
test();
printf("%d\n", b);
return 0;
}
[결과]
0
5
#include <stdio.h>
int b;
void test(){
b = 5;
printf("%d\n", b);
}
int main(){
int b = 3;
printf("%d\n", b);
test();
printf("%d\n", b);
return 0;
}
[결과]
3
5
3
#include <stdio.h>
int add(int a, int b){
return a+b;
}
int main() {
int a, b, sum;
a = 3;
b = 8;
sum = add(a, b);
printf("%d\n", sum);
return 0;
}
함수 내부 함수 호출
- 함수 안에서도 함수 호출이 가능하다
- add((3,5),7); => 값: 15
- 함수 안에서 함수를 쓰는 예제 1
#include
void print_integer(int n){
printf("%d\n", n);
}
int add(int a, int b){
int sum = a+b;
print_integer(sum);
return sum;
}
int main() {
int n;
n = add(1, 4);
print_integer(n);
return 0;
}
5 : add 함수 안에서 나온 printf
5 : print_integer에서 나온 printf
[커서]
- 함수 안에서 함수를 쓰는 예제 2
#include <stdio.h>
int print_integer(int n){
printf("%d\n", n);
return n;
}
int add(int a, int b){
return print_integer(a+b);
}
int main() {
int n;
n = add(1, 4);
print_integer(n);
return 0;
}
auto / static
- auto : 동적 변수, 정적 변수로 선언하지 않으면 자동으로 동적 변수로 실행
- 범위를 벗어나면 사라져서 다시 쓸 수 없음
- static : 정적 변수, 범위를 벗어났어도 값을 저장하고 있으며 다시 사용 가능
프로토 타입
- 함수의 기본형
- 많은 사용자 함수를 선언하다 보면 밀리니까... main 앞에는 이것만 둔다
- int add(int a, int b) 이거 main 앞에 써 두고
- 나중에 해당 함수 내용을 정의
- 프로토타입 부분은 함수를 선언(declaration)한다
- 내용 부분은 함수를 정의(definition)한다
* 함수의 필요성: 함수에 이름과 주석을 따로 부여해 어떤 부분이 무슨 처리를 하는지 쉽게 알아볼 수 있게 해 주는 역할
Call by value / reference
- Call by reference : scanf / swap
다양한 함수 만들기
- abs() : 절대값
#include <stdio.h>
int sign(int);
int main() {
printf("%d %d %d\n", sign(3), sign(0), sign(-7));
return 0;
}
int sign(int n){
if(n<0) return -1;
else if(n>0) return 1;
else return 0;
}
- 정해둔 수 사이의 차이
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int randnum(int, unsigned int);
int main() {
srand(time(0));
int i;
for(i=0; i<50; i++)
printf("%d", randnum(5, 3));
printf("\n");
return 0;
}
int randnum(int init, unsigned int dif){
return init + rand()%(dif+1);
}
- 반올림
- return (int)(f+0.5);
#include <stdio.h>
int round(double);
int main() {
printf("%d %d %d\n", round(3.7), round(5.1), round(0.5));
return 0;
}
int round(double f){
int n = (int)(f*10);
if(n%10 >= 5) return n/10+1;
else return n/10;
}
- 반올림 ver.2
#include <stdio.h>
double round(double, int);
int main() {
printf("%.4f %.4f %.4f\n", round(4.569, -2), round(10.6, 0), round(386, 2));
printf("%.4f %.4f %.4f\n", round(2.3333, -2), round(7.312, 0), round(1422, 2));
return 0;
}
double round(double f, int digit){
int i, n;
if(digit<1){
for(i=digit; i<0; i++)
f *= 10;
// 올리고자 하는 자릿수가 첫째 자리 수가 될 때까지 곱한다
f += 0.5;
// 반올림
f = (double)((int)f);
// 소수점 절삭
for(i=digit; i<0; i++)
f /= 10;
}
// 원래의 자릿수로 돌려놓는다
else if(digit>=1){
for(i=digit; i>0; i--)
f /= 10;
// 올리고자 하는 자릿수가 첫째 자리 수가 될 때까지 나눈다
f += 0.5;
// 반올림
f = (double)((int)f);
// 소수점 절삭
for(i=digit; i>0; i--)
f *= 10;
}
// 원래의 자릿수로 돌려놓는다
return f;
}
- 양수의 약수 출력
#include <stdio.h>
void print_divisor(int);
int main() {
printf("-----(24) 전달-----\n");
print_divisor(24);
printf("-----(17) 전달-----\n");
print_divisor(17);
printf("-----(-15) 전달-----\n");
print_divisor(-15);
return 0;
}
void print_divisor(int n){
if(n<=0) return;
int i;
for(i=1; i<=n; i++)
if(n%i==0) printf("%d\n", i);
}
- 키값만큼 이동하는 Ceasar 암호: 다시
#include <stdio.h>
#define ALP_NUM 26
char ceasar(char, int);
int main() {
char ch;
int key;
printf("키값을 입력하세요: ");
scanf("%d", &key);
printf("문장을 입력하시면 Ceasar 암호에 따라 암호화됩니다.\n");
getchar();
do{
ch = getchar();
putchar(ceasar(ch, key));
}while(ch!='\n');
return 0;
}
char ceasar(char ch, int key){
int dif, temp;
if(ch>='A' && ch<='Z') dif = 'A';
else if(ch>='a' && ch<='z') dif = 'a';
else return ch;
temp = ch-dif;
temp += key;
while(temp<0)
temp += ALP_NUM;
temp %= ALP_NUM;
return temp+dif;
}
- Call by reference: 다시
#include <stdio.h>
void quotient_and_remainder(int, int, int*, int*);
int main() {
int quo, mod;
quotient_and_remainder(17, 4, &quo, &mod);
printf("17을 4로 나눈 몫은 %d, 나머지는 %d입니다.\n", quo, mod);
return 0;
}
void quotient_and_remainder(int dividend, int divisor, int *quotient, int *remainder){
*quotient = dividend / divisor;
*remainder = dividend % divisor;
}
매개변수에 배열 쓰기
하... 이것도 이해 안 간다
재귀함수
- 팩토리얼
#include <stdio.h>
int fact(unsigned int);
int main() {
int i;
for(i=1; i<8; i++)
printf("%d! = %d\n", i, fact(i));
return 0;
}
int fact(unsigned int n){
if(n>1) return n*fact(n-1);
else return 1;
}
- 피보나치
#include <stdio.h>
int fibo(int);
int main() {
int i;
for(i=1; i<=12; i++)
printf("%2d번째 항 = %d\n", i, fibo(i));
return 0;
}
int fibo(int n){
if(n>2) return fibo(n-1) + fibo(n-2);
else return n-1;
}
- 거꾸로 출력: 다시
#include <stdio.h>
void reverse();
int main() {
reverse();
return 0;
}
void reverse(){
int n;
scanf("%d", &n);
if(n){
reverse();
printf("%d\n", n);
}
}
- 스택 오버플로
반응형
'자린고비 독학하기 > 자린고비 코딩하기' 카테고리의 다른 글
Git 설치 및 커맨드 확인 (0) | 2019.09.10 |
---|---|
C basic - 99~102 (0) | 2019.09.02 |
C - 포인터 정리 (0) | 2019.09.02 |
C언어 basic - 23~38 (0) | 2019.08.29 |
C언어 basic - 11~22 (0) | 2019.08.29 |