본 소스는 2007년 2월 21일부터 이루어지는 손채봉 교수님의 C클리닉 유인물을 약간 풀어본것입니다.
전부 주석처리 되어있으며 각 소스의 상단주석의 마지막에서 */ 를 추가하면 그 소스가 실행됩니다 ;;;
Code Type : C
/////////////////////////////////////////
// 2007년 02월 26일 고급프로그래밍 //
// Coded By 오형탁 Ohyung (2002711158) //
// ohyung@ohyung.com http://ohyung.com //
/////////////////////////////////////////
/* 유용하게 쓰이는 한파일에 여러소스 입력하기용 주석 */
/* 포인터 테스트 개인적인 소스 -.-;
#include < stdio.h>
void main()
{
int a=150;
int *p;
p=&a;
printf("a의 주소 = %u , %u \n", &a,p);
printf("a의 데이터 = %d , %d \n", a,*p);
printf("a의 내부 주소 = %p , %p \n", &a,p);
}
/**/
/* 포인터! - val에 5를 넣고 pval로 val의 주소를 치환 그뒤 pval의 주소가 향하는곳에 2를 대입. 곧 val이 2로 치환! 오야르!
#include < stdio.h>
void main()
{
int *pval,val;
val=5;
pval=&val;
*pval=2;
printf("%d",val);
}
/**/
/* 즐거운 포인터의 이해!
#include < stdio.h>
void main()
{
int a=90,b=20,c=30,d=40,e=50,f=60,*pa;
pa=&a;
printf ("%c \t %p \t %4d \t %p \n",'a',&a,*pa,pa);
pa-=3;
printf ("%c \t %p \t %4d \t %p \n",'b',&b,*pa,pa);
pa-=3;
printf ("%c \t %p \t %4d \t %p \n",'c',&c,*pa,pa);
pa-=3;
printf ("%c \t %p \t %4d \t %p \n",'d',&d,*pa,pa);
pa-=3;
printf ("%c \t %p \t %4d \t %p \n",'e',&e,*pa,pa);
pa-=3;
printf ("%c \t %p \t %4d \t %p \n",'f',&f,*pa,pa);
}
/**/
/* 입력하기 귀찮아!
#include < stdio.h>
void main()
{
}
/**/
/* 1. 출력값? - 14
#include < stdio.h>
void main()
{
int a;
a=7;
printf("%d",a+a);
}
/**/
/* 출력값? - 8,9,10,11,12,13,14,15 - 15가 출력되는 이유는 14<15가 된상태에서 다시 do 간뒤 15가 찍혔기때문
#include < stdio.h>
void main()
{
int han=8;
do {
han++;
printf("%d",han);
}
while(han<15);
}
/**/
/* 출력값? - 4,3,2,1 - 만약 han--라면 4,3,2,1,0
우선순위 bracket 이나 brace 단항연산자 이항연산자 조건 대입 등 뒤의 -- 나 ++는 변태라서 열외
#include < stdio.h>
void main()
{
int han=5;
while(han-->0)
printf("%d\n",han);
}
/**/
/* 출력값? - 에러 // 안으로 들어간다고 해도 +는 의미없는 연산자 워닝발생 결과값 무
#include < stdio.h>
void main()
int m=7,n=8,k=9,y;
{
y=1;
y+m*n%k;
}
/**/
/* while 횟수 - 4번 그러나 While 등의 대문자로 쓰면 X
#include < stdio.h>
void main()
{
int sum,i;
sum=0;
i=1;
while(sum<10) {
sum=sum+i;
i=i+1;
//printf("1");
}
}
/**/
/* 출력값 - 1,0 a+b = 50 > 10 논리 값으로 1 , 30>20 = 1 > 10 의 논리 값으로 0
#include < stdio.h>
void main()
{
int a=30, b=20, c=10, d;
d=a+b>c;
printf("%d",d);
d=a>b>c;
printf("%d",d);
}
/**/
/* 출력값 - 110 , 440에서 2(진수)^2(b의값)으로 나눈값 110이 출력 2진 shift
#include < stdio.h>
void main()
{
int a=440,b=2;
printf("%d",a>>b);
}
/**/
/* 출력값 - !abcd=0 , 0x 16진수 0는 8진수
#include < stdio.h>
void main()
{
int x=0xabcd;
printf("!%x=%x\n",x,!x);
}
/**/
/* b의 수행후 결과값은? - 3 ?는 조건이다. 참이면 앞 거짓이면 뒤를 가진다. 3>2가 참(1,true)이므로 3을 취하게 된다.
#include < stdio.h>
void main()
{
int b;
b=(3>2)?3:2;
printf("%d",b);
}
/**/
/* 출력값은 - 0, 1, -1 , &&는 AND , ||는 or , ~는 not 그러나 bitwised이다.
논리적으로 a는 true b는 false이라고 보고, 1 AND 0 은 0 , 1 OR 0 은 1 ,
그리고 b은 1바이트로 0000 0000 를 취한다. 이것을 bitwised 하게되면 1111 1111 이 되고 이것의 값은 -1 이된다.
-1이 되는 것은 2의 보수를 취하면 알수 있다. 0000 0000 +1 이므로 0000 0001 이 되고 마이너스값이 붙는다.
#include < stdio.h>
void main()
{
char a=3,b=0;
printf("%d %d %d\n",a&&b, a||b, ~b);
}
/**/
/* 출력값 - c가 정의되지 않으면 에러 정의가 된다면 7 정수형으로 계산된다. 만약에 a라고 한다면 재정의 에러가 발생
#include < stdio.h>
void main()
{
int c;
float a=3.5;
float b=4.6;
c=(int)a+(int)b;
printf("%d",c);
}
/**/
/* 맞는것은? 맞다. c에 ' '이 들어가고 b_c에 1이들어간다. 교수님의 말씀으로는 c==' '를 원하셨다.
#include < stdio.h>
void main()
{
int c,blank_cnt=0;
if(c=' ')
++blank_cnt;
printf("%d",blank_cnt);
}
/**/
/* 맞는것은? 맞다. b에 a값이 들어간다. - 교수님의 말씀으로는 b==a를 원하셨다. -.-;
#include < stdio.h>
void main()
{
int a=1,b=1;
if(b=a)
printf("%d",b);
}
/**/
/* 맞는것은? - A=65 , a=97 차이는 32이다.또한 c의 값의 a(97)~z(122) 사이에 있을경우c+가 실행된다. 소문자 to 대문자
#include < stdio.h>
void main()
{
int c='z';
printf("%d\n",c);
if(c!=EOF&&'a'<=c&&c<='z')
c+='A'-'a';
printf("%c",c);
}
/**/
/* 맞는것은? 틀림! - i,j값이 동일지 않으면 내부실행 아니면 else 실행후 i값 출력 ; 원문에는 ;가 추가되어있었다 -.-;
#include < stdio.h>
void main()
{
int i=4,j=5;
if(i!=j) {
i=1;
j=2;
printf("%d %d\n",i,j);
}
else i+=j;
printf("%d",i);
}
/**/
/* 출력값? 656667 이유인즉, A로 싸인된뒤 break가 없으며, A부터 아래로 진행 65='A' 부터 67='C' 까지 출력
#include < stdio.h>
void main()
{
char ch='A';
switch(ch) {
case 'A': printf("%d\n",'A');
case 'B': printf("%d\n",'B');
case 'C': printf("%d\n",'C');
}
}
/**/
/* 14번문제 연산결과 - 6,16,1,0
#include < stdio.h>
void main()
{
int a=4,b=2;
a+=2;
printf("%d,",a);
a=4,b=2;
printf("%d,",a*=b+2);
a=4,b=2;
printf("%d,",a/=b+2);
a=4,b=2;
printf("%d",a%=2);
}
/**/
/* 17번 올바른 변수 - 아래소스가 에러나는지 안나는지만 확인해보면됨. - 경고는 무시해도됨;;
#include < stdio.h>
void main()
{
int _total,KBS,Int;
}
/**/
/* 20번 출력값 - 11 20 앞에서 말했듯이 뒤에 붙는 -- 나 ++ 는 변태임
#include < stdio.h>
void main()
{
int i=10,j=20;
printf("%d %d\n",++i,j--);
}
/**/
/* 21번 6,8 우선 첫번째 printf문에서 2*=3 이므로 6 출력 그위 6*=3 이므로 18출력 역시 뒤에뭍는 ++는 변태
#include < stdio.h>
void main()
{
int x=2,y=2;
printf("%d\n",y*=++x);
printf("%d\n",y*=x++);
}
/**/
/* 22번 if else문 바꾸기 - 바꾸는 이유는 뽀대! 보다는 속도;
#include < stdio.h>
void main()
{
int a=2,b=3,c=4;
if (a>b) c=a;
else c=b;
printf ("%d\n",c);
a=2,b=3,c=4; // 재정의
c=(a>b)?a:b;
printf ("%d\n",c);
}
/**/
/* while의 반복횟수 - 그 유명하신 무한루프님! while은 항상 참이므로 미친듯 돈다
#include < stdio.h>
void main()
{
int a=20,i=1,y=0;
while(1) {
if(i < a) i++;
y+=i;
}
}
/**/
/* 25 y의 값 - 30 - 우선 y에 10 들어가고 그뒤 if에서 20들어간뒤 조건에 의해 30들어감 y=20에서 참이므로 else 실행 X 그리고 프린트
#include < stdio.h>
void main()
{
int y=10;
if (y=20)
y=30;
else
y=40;
printf("%d",y);
}
/**/
/* 26 결과값 - 4 Long형의 크기
#include < stdio.h>
void main()
{
printf("%d",sizeof 123L);
}
/**/
/* 문자 타입(포멧)별 크기
#include < stdio.h>
void main()
{
printf("\nchar %%s%%c %d",sizeof(char));
printf("\nshort %%d %d",sizeof(short));
printf("\nint %%d %d",sizeof(int));
printf("\nlong %%ld %d",sizeof(long));
printf("\nfloat %%f %d",sizeof(float));
printf("\ndouble %%f %d",sizeof(double));
printf("\n\nunsigned");
printf("\nchar %d",sizeof(unsigned char));
printf("\nshort %%u %d",sizeof(unsigned short));
printf("\nint %%u %d\n",sizeof(unsigned int));
}
/**/
/* 27 출력값 (char)1*3*4 = 12 입니다 ㄳ
#include < stdio.h>
void main()
{
char a[3][4];
printf("%d",sizeof a);
}
/**/
/* 28 수행후의 x,y,z - 6,5,3
z의경우 변동 없음. 왼쪽으로 가서 y= 2+3 = 5가됨 또한 x의 경우 1+5 = 6이 됨
i = 30 - i의 경우 8+2 한뒤 3*10이 됨 30 correct!
a = 4 - a의 경우 10%3=1 후에 1*4 = 4 가됨.
#include < stdio.h>
void main()
{
int x=1,y=2,z=3;
int i=3,j=8;
int a=10,b=3,c=4;
x+=y+=z;
printf("%d %d %d\n",x,y,z);
i*=j+2;
printf("%d\n",i);
a=a%b*c;
printf("%d",a);
}
/**/
/* 31 출력값은? 123.5, 123.5 ,00123 , 123
소수 첫번째자리까지 표현 나머지는 반올림.
전체 5자리 소수점 1자리까지 표현
05 앞부분에 0으로 체움
-5 앞에서 부터 출력 123뒤에 2개의 공백이 있다.
이것은 대충 값을 변경하면서 해봐야지 확실히 알수 있다.
#include < stdio.h>
void main()
{
printf("%3.1f",123.45);
printf("%5.1f",123.45);
printf("%05d",123);
printf("%-5d",123);
}
/**/
/* 출력값은? - 4,4,6,1 - 우선
a의 경우 a++에서 ++가 변태라고 했으므로 대입연산자 보다 느리다. 그러므로 3+3 이 c의 값이 된후에 a++이 되는것이다.
d의 경우 1 b가 4/4이 므로 값이 1이된다.
#include < stdio.h>
void main()
{
int a=3,b=3,c,d;
c=a+++3;
d=b/++b;
printf("%d %d %d %d \n",a,b,c,d);
}
/**/
/* 33. 출력값 x,a,z - putchar는 한개의 문자를 출력 마지막기중
#include < stdio.h>
void main()
{
char c='z';
putchar('x');
putchar('z+a');
putchar(c);
}
/**/
/* 34 출력값 2 출력 - 비교한후 거짓이었으므로 y 선택 , 둘중 큰값 출력
#include < stdio.h>
void main()
{
int x=1,y=2;
printf("%d\n",(x>y)?x:y);
}
/**/
/* 입력하기 귀찮아!
#include < stdio.h>
void main()
{
}
/**/