// 문제 1. 실수를 입력받아 출력하시오. float과 double 둘다 해보기.
#include<stdio.h>
int main(void)
{
float num1;
printf("실수를 하나 입력해주세요!");
scanf("%f", &num1);
printf("실수는 %f입니다\n", num1);
return 0;
}
#include<stdio.h>
int main(void)
{
double numb; // double은 long 타입이기 때문에 서식지원문을 쓸 때 lf를 써야 한다.
printf("실수를 하나 입력해주세요!");
scanf("%lf", &numb);
printf("실수는 %lf입니다\n", numb);
}
---------------------------------------------------------------------------------------------------------------
// 문제 2. 자신의 이니셜을 입력 받아 출력하시오
#include<stdio.h>
int main(void)
{
char ini[10];
printf("이니셜 3개를 이어서 입력하세요");
scanf("%s", ini);
printf("당신의 이니셜은 %s입니다\n", ini);
}
#include<stdio.h>
int main(void)
{
char ini1, ini2, ini3;
printf("이니셜 3개를 각각 입력하세요\n");
scanf("%c%c%c",&ini1,&ini2,&ini3); // 단일문자는 공백이 서식지원에 포함이 되기 때문에 붙여서 입력받아야 한다.
printf("당신의 이니셜은 %c.%c.%c입니다\n", ini1, ini2, ini3);
}
// 문제 2. T 풀이
#include<stdio.h>
int main(void)
{
char a, b, c, name[10];
// 문자열은 마지막 엔터가 다음 서식에 영향을 주기 때문에 엔터가 %c 하나를 먹는다.
printf("이니셜2 입력:");
scanf("%s", name);
printf("이니셜1 입력:");
scanf(" %c%c%c", &a, &b, &c); //따라서 그런 경를 방지하기 위해 다음과 같이 %c%c%c 앞에 공백을 한칸 만들어준다.
printf("이니셜2 출력: %s\n", name);
printf("이니셜1 출력 : %c%c%c\n", a, b, c);
return 0;
}
---------------------------------------------------------------------------------------------------------------
// 문제 3. 3과목의 성적을 입력받아 합계와 평균을 구하시오.
#include<stdio.h>
int main(void)
{
int kor, math, sci, total;
float avg;
printf("국어점수를 입력하세요");
scanf("%d", &kor);
printf("수학점수를 입력하세요");
scanf("%d", &math);
printf("과학점수를 입력하세요");
scanf("%d", &sci);
total = kor + math + sci;
avg = ((float)kor + (float)math + (float)sci)/3;
printf("합계는 %d이고 평균은%.2f 입니다.\n", total, avg);
}
#include<stdio.h>
int main(void)
{
int kor,eng,mat,sum;
double avg;
printf("3과목의 성적을 차례대로 입력:\n>>>");
scanf("%d%d%d", &kor, &eng, &mat);
sum=kor+eng+mat;
avg=(double)sum/3;
printf("총점 : %d\n평균 : %.2f\n", sum, avg);
}
// 입력함수를 사용할 떄는 lf를 꼭 지켜줘야 한다.
---------------------------------------------------------------------------------------------------------------
// 문제 4. 다음과 같이 데이터를 입력 받아 출력하시오.
// 당신의 이름은 무엇입니까? 홍길동
// 홍길동님의 나이는 몇살입니까? 18
// 홍길동님의 나이는 18살입니다.
#include<stdio.h>
int main(void)
{
char name[30];
int age;
printf("당신의 이름은 무엇입니까?");
scanf("%s", name);
printf("%s님의 나이는 몇살입니까?\n", name);
scanf("%d", &age);
printf("%s님의 나이는 %d살입니다\n", name, age);
}
---------------------------------------------------------------------------------------------------------------
// 산술연산자 : 두 개의 피 연산자 간의 산술연산을 하기 위해 사용
a + b : 두수의 합
a - b : 두수의 차
a * b : 두수의 곱
a / b : 나누기 곲
a % b : 나누기 나머지
// 연산자 - 항상 왼쪽에서 오른쪽으로 진행된다.
// /(나눗셈-몫) - 정수/정수 일때 몫 값만 반환. 완전 연산을 하려면 cast 연산자 사용
// %(나눗셈-나머지)
# 연산의 사용 예시
1. 짝, 홀수 구분
2. 배수 구분
3. 숫자의 자릿수 구분하기
4. 범위 안의 숫자 구하기
#include<stdio.h>
int main(void)
{
int su1 = 20, su2 = 3;
printf("%d+%d=%d\n", su1, su2, su1 + su2);
printf("%d-%d=%d\n", su1, su2, su1 - su2);
printf("%d*%d=%d\n", su1, su2, su1 * su2);
printf("%d/%d=%d\n", su1, su2, su1 / su2);
printf("%d%%%d=%d\n", su1, su2, su1 % su2);
}
---------------------------------------------------------------------------------------------------------------
관계연산자
두 개의 피연산자간의 대소관계를 비교하기 위하여 사용 0은 거짓. 0 이외의 모든 수는 참을 의미.
C는 0과 1로 반환된다. True 1, False 0;
세상에 존재하는 모든 데이터는 모두 참이지만, 0은 거짓이다.
관계연산자 왼쪽 값은 기준, 오른쪽은 비교대상이다.
// !는 부정의 의미가 있다.
< : ~보다 작다 - if (a<10)~
> : ~보다 크다 - if (a>10)~
<= : ~보다 작거나 같다 - if (a<=10)~
>= : ~보다 크거나 같다 - if (a>=10)~
== : ~와 같다 - if (a==10)~
!= : ~ 와 같지 않다 - if (a!=10)~
---------------------------------------------------------------------------------------------------------------
대입연산자 : 우측에 수행한 결과를 좌측에 지정된 변수로 대입
= 대입연산자의 규칙
유일하게 우측에서 좌측으로 진행
우측항의 결과를 좌측항에 대입한다.
그래서 좌측항은 무조건 변수만 올 수 있다.
변수=상수
변수=변수(값이 존재하는 변수)
변수=연산식
변수=함수
복합대입연산자
대입연산자를 다른 연산자와 결합하여 사용
// a+=b a=a+b a는 무조건 변수밖에 못 온다. b는 상수, 변수, 함수, 연산식 다 올 수 있다.
#include<stdio.h>
int main(void)
{
int su1, su2;
su1 = su2 = 5; // 5에서부터 su2 -> su1으로 진행
printf("su1+1=%d\n", su1 += 1);
printf("su1-1=%d\n", su1 -= 1);
printf("su1*su2=%d\n", su1 *= su2);
printf("su1/su2=%d\n", su1 /= su2);
printf("su1%%su2=%d\n", su1 %= su2);
}
// 대입구간에서 복합대입연산자를 사용해도 바로 변수에 적용이 된다.
---------------------------------------------------------------------------------------------------------------
논리연산자
|| --> 비트연산자에서도 or 연산자라서 나중에 헷갈린다.
&& 논리곱 : 둘다 참일 때만 참.
! : python의 not과 똑같다 거짓이면 참으로, 참이면 거짓으로 반환(?)
---------------------------------------------------------------------------------------------------------------
// 증감 연산자
전치(++a) : 선증감 후연산 1씩 증가를 먼저 시키고 후 연산
후치(a++) : 선연산 후증감
#include<stdio.h>
int main(void)
{
int su1;
float su2;
su1 = 5; ++su1; printf("++su1=%d\n", su1);
su1 = 5; su1++; printf("su1++=%d\n", su1);
su2 = 12.3;++su2; printf("++su2=%f\n", su2);
su2 = 12.3;su2++; printf("su2++=%f\n", su2);
}
// 여기서는 연산요소가 없어서 결과값이 같다.
// 단항일 경우에는 전치나 후치나 결과가 다르지는 않다.
// 실수 데이터도 정수1만큼 증가하거나 감소
#include<stdio.h>
int main(void)
{
int su1, su2, su3;
su1 = 10;
su2 = ++su1; // 대입도 연산이다.
printf("su1=%d\n", su1);
su1 = 10;
su3 = su1++;
printf("su2=%d\n", su2);
printf("su3=%d\n", su3); // su3은 그래서 이렇게 후치 전 값이 들어간다. (대입도 연산이다)
printf("su1=%d\n", su1);
}
---------------------------------------------------------------------------------------------------------------
// 분석해봐라 특정 구간에서 이해가 안 되는 곳이 어디며 그 구간이 왜 그런 결과가 왜 나왔을지 고민해보기
// 에러나 버그는 나오지 않을 것
#include<stdio.h>
int main(void)
{
int a = 5, b = 6, c = 10, d;
d = ++a * b--; // a=6, b=5, d=36
printf("a=%d,b=%d,d=%d\n", a, b, d);
d = a++ + ++c - b--; // a=7, b=4, c=11, d=12
printf("a=%d,b=%d,c=%d,d=%d\n", a, b, c, d);
a = 1;
b = 0;
d = a++ || ++b * d-- / ++c;
printf("a=%d,b=%d,c=%d,d=%d\n", a, b, c, d);
// d=1 인데 후치가 적용돼서 0이 될까?
// 컴퓨터가 좌측항이 참이면 우측항을 아예 무시해버린다. 그래서 위의 항을 그대로 내려받는다.
// 따라서 a++ 만 후치 적용이 된 것이다.
d = b++ && ++a / ++c * d++;
// AND 연산자는 좌측항이 거짓이면 우측항을 무시해버린다.
printf("a=%d,b=%d,c=%d,d=%d\n", a, b, c, d);
}
---------------------------------------------------------------------------------------------------------------
조건연산자(3항연산자)
조건식에 따라 참인 경우 앞부분을 수행하고 거짓인 경우 뒷부분을 수행한다.
사용 예)
(조건식) ? 참일 때 수행하는 문장 : 거짓일 때 수행하는 문장 ;
조건식이 참인 경우 ? 다음부터 : 이전까지를 수행하고
조건식이 거짓인 경우 : 다음부터 ; 이전까지의 내용을 수행함
예제)
// 이름, 학번, 3과목의 성적을 입력받아 합계와 평균을 구하고, 평균이 90이상이면 A, 80이상 B,
// 70이상 C, 60이상 D, 60미만 F를 출력하시오.
// 단 코드는 삼항 연산자를 이용하여 작성하세요.
#include<stdio.h>
int main(void)
{
int kor, eng, mat, sum, hak;
char name[10];
double avg;
printf("이름을 입력하세요:");
scanf("%s",name);
printf("학번을 입력하세요");
scanf("%d",&hak);
printf("국어, 영어, 수학 점수를 입력하세요");
scanf("%d%d%d",&kor,&mat,&eng);
sum = kor + mat + eng;
avg = (double)sum / 3;
(avg > 100) ? printf("올바른 점수를 다시 기입해주세요. 평균이 %f으로 지나치게 높습니다.\n", avg) :
(avg >= 90) ? printf("당신의 평균은 %f점으로 A 학점입니다.\n", avg) :
(avg >= 80) ? printf("당신의 평균은 %f점으로 B 학점입니다.\n", avg) :
(avg >= 70) ? printf("당신의 평균은 %f점으로 C 학점입니다.\n", avg) :
(avg >= 60) ? printf("당신의 평균은 %f점으로 D 학점입니다.\n", avg) :
(avg >= 0) ? printf("당신의 평균은 %f점으로 F 학점입니다.\n", avg) :
printf("올바른 점수를 다시 기입해주세요. 평균이 %f으로 지나치게 낮습니다.\n", avg);
return 0;
}
T풀이)
#include<stdio.h>
int main(void)
{
int kor, eng, mat, sum, hak;
char name[10],level;
double avg;
printf("이름을 입력하세요:");
scanf("%s", name);
printf("학번을 입력하세요:");
scanf("%d", &hak);
printf("국어 점수를 입력하세요:");
scanf("%d", &kor);
printf("영어 점수를 입력하세요:");
scanf("%d", &eng);
printf("수학 점수를 입력하세요:");
scanf("%d", &mat);
sum = kor + eng + mat;
avg = (double)sum / 3;
(avg >= 90) ? level = 'A':
(avg >= 80) ? level = 'B':
(avg >= 70) ? level = 'C':
(avg >= 60) ? level = 'D':
(level = 'F'); // 마지막 항은 괄호로 묶어줘야 한다. 대입연산자가 따로 논다 (=F), 컴퓨터는 3항을 등호 왼쪽까지만 인식해버린다.
printf("==============================성적표==============================\n");
printf("이름\t학번\t국어\t영어\t수학\t총점\t평균\t학점\n");
printf("==================================================================\n");
printf("%s\%d\t%d\t%d\t%d\t%d\t%.2f\t%c\n", name, hak, kor, eng, mat, sum, avg, level);
return 0;
}
---------------------------------------------------------------------------------------------------------------
// 5 1 0 1
// | 3 0 1 1
// | 7(or) 1 1 1
// & 1(and) 0 0 1
// ^ 주로 오류검출 하는 데 사용하는 기법 / 같은 자리 비트에 서로 같은 숫자가 오면 0처리 다른 숫자가 오면 1 (올림 숫자를 무시한다고 생각하면 된다. 예 001과 001 더하면 010 이지만 가운데 올림 1 무시)
// ^ 6(xor)
// ~
// ~ 양수를 음수로 음수를 양수로 바꿔주는데 양수를 음수로 바꾸면 절대값+1 하고 마이너스가 붙는다. 반대로 음수가 양수가 될땐 절대값-1 이 된다.
// 부호비트
// 128 64 32 16 8 4 2 1
// 0 0 0 0 0 1 0 1 양수 5
// 1 0 0 0 0 1 0 1 음수 5
// 1 0 0 0 1 0 1 0 합하면 -10이 나온다. 맞지 않는 결과
// 그래서 보수라는 개념을 사용한다. (상대되는 수를 만드는 것, 만드는 이유는 빠른 연산을 위해서)
// 10진수의 n의 보수는 10-n / 2-8, 5-5, 6-4, 7-3
// 1의 보수(n-1의 보수)
// 8bit로 만들 수 있는 가장 큰 수와 가장 작은 수 127과 -(127+1)
// ~는 비트부정이라고 하지만 사실 보수를 구하는 연산자라고 생각하면 된다.
// 5<< 2비트 이동 101(2진수 변환) 10100으로 0 2개 붙여주고 다시 10진수로 변환
// >> 1(2의 0승) 우측으로 비트가 넘어가면 0처리가 된다.
#include<stdio.h>
int main(void)
{
int su1 = 12, su2 = 7, result;
result = su1 | su2;
printf("su1과 su2의 논리합 : %d\n", result);
}
#include<stdio.h>
int main(void)
{
int su1 = 12, su2 = 7, result;
result = su1 & su2;
printf("su1과 su2의 논리곱 : %d\n", result);
}
#include<stdio.h>
int main(void)
{
int su1 = 12, su2 = 7, result;
result = su1 ^ su2;
printf("su1과 su2의 배타적논리합(xor) : %d\n", result);
}
#include<stdio.h>
int main(void)
{
int su1 = 15;
su1 = ~su1;
printf("su1의 비트 부정:%d\n", su1);
}
#include<stdio.h>
int main(void)
{
int op = 30, result;
result = op << 3;
printf("30을 좌측으로 3비트 이동시킨 결과 = %d\n", result);
}
#include<stdio.h>
int main(void)
{
int op = 30, result;
result = op >> 6;
printf("30을 우측으로 6비트 이동시킨 결과 = %d\n", result);
}
---------------------------------------------------------------------------------------------------------------
기타 연산자
sizeof 연산자 : 크기를 바이트 단위로 표기
콤마연산자 : 식들을 콤바로 구분하여 좌측부터 실행하며 가장 우측식이 연산결과가 된다.
#include<stdio.h>
int main(void)
{
int a = 0, b = 0, c = 0;
printf("정수의 크기는 %d입니다.\n", sizeof(int));
// 배열을 할 때 size를 파악해야 하는데 나중에..지금은 32비트라서 int의 결과가 4바이트로 나옴 / 메모리비트에 할당되는 크기를 visual 2022는 8바이트로 나옴
a = (b = 3, c = 5, b + c);
// 콤마연산자 왼쪽부터 오른쪽으로 차례로 수행함.'그리고'의 개념이 있다. 연속적인 명령을 수행하는 국어의 그리고의 개념에 가깝다.
printf("a=%d, b=%d, c=%d\n", a, b, c);
}
---------------------------------------------------------------------------------------------------------------
#include<stdio.h>
int main(void)
{
int su1 = 123;
char ch = 'a';
float su2 = 12.345;
printf("변수 su1의 크기: %d byte\n", sizeof(su1)); // 정수형 4바이트
printf("문자형 자료형의 크기: %d byte\n", sizeof(char)); // 1바이트
printf("문자형 자료형의 크기: %d byte\n", sizeof(ch)); // 1바이트
printf("수식 (su1+su2)의 크기: %d byte\n", sizeof(su1+su2)); // 정수 + 실수 (얜 그냥 실수?) 플러스로 쓰였기 때문에 4바이트 (float = 4byte)
printf("실수 1.23456의 크기: %d byte\n", sizeof(1.23456)); // 그냥 상수 실수를 쓰게되면 정확도를 높이기 위해 double로
printf("문자형 상수'a'의 크기: %d byte\n", sizeof('a')); // 4바이트, 문자같은 경우는 실제로 4바이트로 할당받는다, 문자형이나 문자형 변수는 1바이트이지만
}
---------------------------------------------------------------------------------------------------------------
#include<stdio.h>
int main(void)
{
int su1, su2, su3;
float result;
result = (su1 = 5, su2 = su1 + 2, su2++, su3 = su2 / su1); // 정수/정수 기 때문에 몫값만
printf("su1=%d\nsu2=%d\n"
"su3=%d\nresult=%f\n", su1, su2, su3, result);
}
'IT&코딩 > C' 카테고리의 다른 글
C언어 2주차 복습-2 (0) | 2022.08.24 |
---|---|
C언어 2주차 복습-1 (0) | 2022.08.19 |
C언어 1주차 복습-4 (0) | 2022.08.17 |
C언어 1주차 복습-2 (0) | 2022.08.10 |
C언어 1주차 복습-1 (0) | 2022.08.09 |