C 6일차 정리
전처리기(preprocessor)
#include
디스크 상에 수록된 특정 파일의 내용을 원시프로그램에 포함시키는 기능
#include <파일이름>:C에서 지원 <프로그램에서 지원>
#include "파일이름": 사용자 정의
#define
프로그램에서 특정 문자열을 정의하고 적절하게 치환할 때 사용
#define 매크로 이름
#define 매크로 이름 (인수)
empty는 새로만들기에서 C++소스파일 ->파일이름 적기
header file 만들때도 똑같이 새로만들기 -> c/c++ header file로 생성
########################
디파인이 많을 수록 코드의길이가 많고 어려워진다. 1~2개가 적당. 함수들도 define할 수 있다.
많아도 10줄까지만, 헤더파일을 넣게되면 더 보기 어렵다.
#define mask 0x0f
#undef 이전에 정의된 매크로를 해체하는 기능.
조건부 컴파일 지시어에서는 #if, #else #endif로 사용되며 반드시 endif를 써야됨
#if 조건식
문장1:
##--->변수의 유효범위
@지역변수
-정의된 블록 내부에서만 사용 가능한 변수
#include "stdafx.h"
#include <stdio.h> //printf(), scanf()
int main(int argc, char* argv[]){
int a=100; //int main(int argc, char * argc[])에 속한 a
if(a==100){
int a=10;
printf("%d\n",a);
}
printf("%d\n",a);
}
------실행결과
10
100
계속하려면 아무 키나 누르십시오 . . .
------------------
#-->전역변수
#include "stdafx.h"
#include <stdio.h> //printf(), scanf()
int a=100; //main문 외부에 선언된 전역변수
int main(int argc, char* argv[]){
a=10;
if(a==100){
printf("%d\n",a);
}
printf("%d\n",a);
}
10
계속하려면 아무 키나 누르십시오 . . .
<예제>
int main(int argc, char* argv[]){
int i;
for(i=0;i<10;i++){
int a=100;
a++;
printf("%d",a);
}
}
----------실행결과
101
101
101
101
101
101
101
101
101
101
계속하려면 아무 키나 누르십시오 . . .
------------------
#include "stdafx.h"
#include <stdio.h> //printf(), scanf()
int main(int argc, char* argv[]){
int i;
for(i=0;i<10;i++){
static int a=100; //static 프로그램과 별도로 공간을 잡아서 a라는 변수 공간을 만듬.
a++;
printf("%d\n",a);
}
}
전역 - main 위쪽
변수의 수명
전역&정적:프로그램종료 - 코드는 쉬우나 성능이 낮아진다.(메모리를 할당함)
지역변수:선언 지역을 벗어날 경우
전역변수:함수 밖에
정적변수:static
지역변수:모듈안에
###################함수################
#include "stdafx.h"
#include <stdio.h> //printf(), scanf()
int main(int argc, char* argv[]){
int i,n, sum=0;
scanf("%d",&n);
for(i=0;i<n;i++)
sum+=i;
printf("%d",sum);
}
--------실행결과
10
45계속하려면 아무 키나 누르십시오 . . .
---------------
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
#include "stdafx.h"
#include <stdio.h> //printf(), scanf()
void SumFunc(){
int i,n, sum=0;
scanf("%d",&n);
for(i=0;i<n;i++)
sum+=i;
printf("%d",sum);
}
int main(){
SumFunc();
}
--------실행결과
10
45계속하려면 아무 키나 누르십시오 . . .
---------------
<예제>
#include "stdafx.h"
#include <stdio.h> //printf(), scanf()
void Sumfunc(int n){
int sum=0;
for(int i=0;i<n;i++)
sum+=i;
printf("%d",sum);
}
int main(){
int n;
scanf("%d",&n);
Sumfunc(n);
}
--------실행결과
10
45계속하려면 아무 키나 누르십시오 . . .
---------------
▼▼함수 변환
#include "stdafx.h"
#include <stdio.h> //printf(), scanf()
int SumFunc(int n){
int sum=0;
for(int i=0;i<n;i++)
sum+=i;
return sum;
}
int main(){
int ret, n;
scanf("%d",&n);
ret=SumFunc(n);
printf("%d",ret);
}
-------실행결과
10
45계속하려면 아무 키나 누르십시오 . . .
-----------
★★단계별로 바꿔가면서 함수를 만드는 것이 좋다
<예제>
#include "stdafx.h"
#include <stdio.h> //printf(), scanf()
float avrg(int x,int y);
void show_avrg(int,int,float);
void main()
{
int i,j;float f;
i=2;j=3;
f=avrg(i,j);
show_avrg(i,j,f);
}
float avrg(int j, int k)
{
int total;float f;
total=j+k;
f=total/2.0f;
return f;
}
void show_avrg(int a, int b, float c)
{
printf("\n%d와 %d의 평균", a,b);
printf("값은 %10.2f입니다. \n",c);
}
----------실행결과
2와 3의 평균값은 2.50입니다.
계속하려면 아무 키나 누르십시오 . . .
-------------------
<예제>
#include "stdafx.h"
#include <stdio.h> //printf(), scanf()
char big(int x, int y)
{
if(x > y) return 'Y';
else if(x < y)return 'N';
else return '=';
}
void main(void)
{
int a = 100, b=200;
char size =big(a,b);
if(size == 'Y')
printf("\n %d는(은) %d보다 크다.",a,b);
else if(size=='N')
printf("\n %d는(은) %d보다 작다.",a,b);
else if(size=='=')
printf("\n %d는(은) %d과(와) 같다.",a,b);
}
--------실행결과
100는(은) 200보다 작다.계속하려면 아무 키나 누르십시오 . . .
--------------
##--->반환함수(Call by value) - 값에 의한 호출
##--->재귀함수(call by ref) - 자기 자신을 호출하겠다.
##-->무한루프 ㅋㅋ 4811번 반복됨.
#include "stdafx.h"
#include <stdio.h> //printf(), scanf()
void main()
{
printf("recursive function");
main();
}
--------------------------
##-->4번만 print되고 나머지는 메인 호출만.
#include "stdafx.h"
#include <stdio.h> //printf(), scanf()
void main()
{
static int a = 0;
if(a>=3) return;
else a= a+1;
printf("recursive function");
main();
}
---------------실행결과
recursive functionrecursive functionrecursive function계속하려면 아무 키나 누르
십시오 . . .
--------------------
재귀함수- 복기 주소로 돌아가는 것.
5factorial 5! = 5x4x3x2x1
##-->
#include "stdafx.h"
#include <stdio.h> //printf(), scanf()
long fact(long n)
{
if(n==1L) return 1L;
else return(n*fact(n-1));
}
void main(void)
{
long x=5L;
printf("\n%ld!의 값은 %ld이다. \n",x,fact(x));
}
------실행결과
5!의 값은 120이다.
계속하려면 아무 키나 누르십시오 . . .
--------------
문제
1.두수를 입력 받아 큰 수를 출력하는 함수를 만드시오.
#include "stdafx.h"
#include <stdio.h> //printf(), scanf()
int main()
{//1.두수를 입력 받아 큰 수를 출력하는 함수를 만드시오.
int i,j;
scanf("%d",&i);
scanf("%d",&j);
print("%d %d",printFunc(i,j));
}
printFunc(int a, int b)
{
if (a >= b) return a;//printf(%d,a);
else return b;//printf(%d,b);
}
-----------------------
big(){
식
}
int main()
{
big();
}
2.수를 입력 받아 소수를 판별하는 함수를 만드시오
void prime(){
int num, i, cnt=0;
scanf("%d",&num);
for(i=1;i <= num;i++){
if(num%i == 0) {cnt++;}
}
if(cnt==2){printf("%d",num);}
}
int main()
{/*2.수를 입력 받아 소수를 판별하는 함수를 만드시오
*/
prime();
}
---------------------
3.절대값을 구하는 함수를 만드시오
int ab(int su){
if(su >0) return su;
else if(su == 0) return su;
else su * -1;
}
int main()
{/*3.절대값을 구하는 함수를 만드시오
*/
int num;
scanf("%d", &num);
ab(num);
}
4.거꾸로 수를 반환하는 함수를 만드시오
int reverse(int n){
int ret=0, tmp;
while(1){
ret+= n%10;
n = n/10;
if(n==0){break;}
ret=ret*10;
}
return ret;
}
int main()
{/*4.거꾸로 수를 반환하는 함수를 만드시오
*/
int num;
scanf("%d", &num);
reverse(num);
printf("%d",reverse(num));
}