인공지능 프로그래밍 수업을 듣고 있는데, 코딩 기초자들이 많아서 4주동안 C언어의 기초가 나왔다.
사실 이미 알고 있는 내용들이 대부분이라 수업 잘 안들었다..
아니 애초에 교수님도 OT때 나한테 '너가 이 수업을 들으면 어떡해' 라고 하셨으니.. 졸업하려고 듣습니다 교수님...
암튼 완전히 집중해서 수업을 들은 적은 거의 없지만 과제가 나왔으니 오랜만에 C언어 다뤄보면서 정리만 해두려고 한다.
혹시 시험 대비할 때 갑자기 기억 안날까봐...
1. Hello, World! 출력하기
아 내가 이걸 하는게 맞나..? 나 그래도 정통 4학년인데...?
#include <stdio.h>
int main() {
printf("Hello, World!");
return 0;
}
2. 정수 입력하고 출력하기
#include <stdio.h>
int main() {
int number;
printf("Enter an integer: ");
scanf("%d", &number);
printf("You entered: %d", number);
return 0;
}
C언어에서는 항상 변수의 자료형을 선언해 줘야 한다.
int는 정수형이고 영어로는 integer이라고 부른다.
그리고 integer의 출력형식은 %d이다.
3. 정수 입력 2개 받고 출력하기
#include <stdio.h>
int main() {
int number1, number2, sum;
printf("Enter two integers: ");
scanf("%d %d", &number1, &number2);
sum = number1 + number2;
printf("%d + %d = %d", number1, number2, sum);
return 0;
}
음... 더하기 연산자를 다뤄보았다.
4. double 자료형 다뤄보기
double은 실수형이다.
여기서 미리 정리하자면 실수형 자료형에는 총 3가지가 있다.
float : 4바이트 가능
double : 8바이트 가능
long double : 시스템마다 다르지만 8바이트 이상 가능.
다시말해서 어느 자료형을 사용하느냐에 따라 출력할 수 있는 자리수가 달라진다. 바이트 수가 높으면 높을수록 더 많이 출력할 수 있겠지?
#include <stdio.h>
int main() {
double a, b, product;
printf("Enter two numbers: ");
scanf("%lf %lf", &a, &b);
product = a * b;
printf("Product = %.2lf", product);
return 0;
}
각 자료형에 따른 출력형식은 나중에 정리하겠다. 사실 과제 제출 마감 얼마 안남았다.
이번에는 곱하기 연산자였다. 재밌지?
5. ASCII Value 출력해보기
이번에 미리 소개하자면 char는 character의 약자로 문자를 위한 변수형이지만 사실은 정수형이다. 서식형은 %c이다.
#include <stdio.h>
int main() {
char c;
printf("Enter a character: ");
scanf("%c", &c);
printf("ASCII value of %c = %d", c, c);
return 0;
}
6. 몫과 나머지 연산 해보기
.. 해보자
#include <stdio.h>
int main() {
int dividend, divisor, quotient, remainder;
printf("Enter dividend: ");
scanf("%d", ÷nd);
printf("Enter divisor: ");
scanf("%d", &divisor);
quotient = dividend / divisor;
remainder = dividend % divisor;
printf("Quotient = %d\n", quotient);
printf("Remainder = %d", remainder);
return 0;
}
끝났다.
7. 각 자료형 바이트 출력하기
음.. 해보자
#include<stdio.h>
int main() {
int intType;
float floatType;
double doubleType;
char charType;
printf("Size of int: %zu bytes\n", sizeof(intType));
printf("Size of float: %zu bytes\n", sizeof(floatType));
printf("Size of double: %zu bytes\n", sizeof(doubleType));
printf("Size of char: %zu byte\n", sizeof(charType));
return 0;
}
보면 알겠지만 sizeof()를 쓰면 바이트수를 알 수 있다. 참 쉽죠잉?
8. 두 값 입력받아서 둘이 바꾸기
#include<stdio.h>
int main() {
double first, second, temp;
printf("Enter first number: ");
scanf("%lf", &first);
printf("Enter second number: ");
scanf("%lf", &second);
temp = first;
first = second;
second = temp;
printf("\nAfter swapping, first number = %.2lf\n", first);
printf("After swapping, second number = %.2lf", second);
return 0;
}
여기서 %.2lf는 소수점 두번째까지 출력하라는 의미이다.
넘어가자
9. 정수 입력받고 짝수 홀수 구분하기
이제는 if문이다!
#include <stdio.h>
int main() {
int num;
printf("Enter an integer: ");
scanf("%d", &num);
if(num % 2 == 0)
printf("%d is even.", num);
else
printf("%d is odd.", num);
return 0;
}
10. 위에서 진행한거를 ternary operator를 이용해서 해보기
#include <stdio.h>
int main() {
int num;
printf("Enter an integer: ");
scanf("%d", &num);
(num % 2 == 0) ? printf("%d is even.", num) : printf("%d is odd.", num);
return 0;
}
9번과 동일한 결과가 나온다.
11. 알파벳 입력받고 모음인지 자음인지 구분하기
#include <ctype.h>
#include <stdio.h>
int main() {
char c;
int lowercase_vowel, uppercase_vowel;
printf("Enter an alphabet: ");
scanf("%c", &c);
lowercase_vowel = (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u');
uppercase_vowel = (c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U');
if (!isalpha(c))
printf("Error! Non-alphabetic character.");
else if (lowercase_vowel || uppercase_vowel)
printf("%c is a vowel.", c);
else
printf("%c is a consonant.", c);
return 0;
}
12. 세개 숫자 입력받고 제일 큰거 찾기
#include <stdio.h>
int main() {
double n1, n2, n3;
printf("Enter three numbers: ");
scanf("%lf %lf %lf", &n1, &n2, &n3);
if (n1 > n2 && n1 > n3)
printf("%.2lf is the largest number.", n1);
else if (n2 > n1 && n2 > n3)
printf("%.2lf is the largest number.", n2);
else
printf("%.2lf is the largest number.", n3);
return 0;
}
사실 이렇게 안하고 라이브러리 받아와서 max 쓰면되는데.. 교수님이 내주신 과제가 이렇게 하라고 하니...
이런방식으로 하면 비교해야 하는게 많아지면 진짜 엄청난 예외처리의 향연일 것이다. 효율을 위해 이렇게 절대 안하는 걸 추천한다.
13. 계수 입력받고 루트값 구하기
#include <math.h>
#include <stdio.h>
int main() {
double a, b, c, discriminant, root1, root2, realPart, imagPart;
printf("Enter coefficients a, b, and c: ");
scanf("%lf %lf %lf", &a, &b, &c);
discriminant = b * b - 4 * a * c;
if (discriminant > 0) {
root1 = (-b + sqrt(discriminant)) / (2 * a);
root2 = (-b - sqrt(discriminant)) / (2 * a);
printf("root1 = %.2lf and root2 = %.2lf", root1, root2);
}
else if (discriminant == 0) {
root1 = root2 = -b / (2 * a);
printf("root1 = root2 = %.2lf;", root1);
}
else {
realPart = -b / (2 * a);
imagPart = sqrt(-discriminant) / (2 * a);
printf("root1 = %.2lf+%.2lfi and root2 = %.2lf-%.2lfi", realPart, imagPart, realPart, imagPart);
}
return 0;
}
14. 반복문 사용해서 더하기 해보기
자, 이제 반복문을 사용해 보자.
반복문을 사용해서 1을 n번 더하는 것이다.
두가지 버전을 사용할 것이다.
첫번째는 for문이다.
#include <stdio.h>
int main() {
int n, i, sum = 0;
printf("Enter a positive integer: ");
scanf("%d", &n);
for (i = 1; i <= n; i++) {
sum += i;
}
printf("Sum = %d", sum);
return 0;
}
자 이번에는 while문을 이용해보자.
#include <stdio.h>
int main() {
int n, i = 1, sum = 0;
printf("Enter a positive integer: ");
scanf("%d", &n);
while (i <= n) {
sum += i;
i++;
}
printf("Sum = %d", sum);
return 0;
}
참 쉽죠잉?
슬슬 지겹다..
15. 팩토리알 사용하기
n을 입력받아서 n팩토리알을 계산해보자!
#include <stdio.h>
int main() {
int n, i;
unsigned long long fact = 1;
printf("Enter an integer: ");
scanf("%d", &n);
if (n < 0)
printf("Error! Factorial of a negative number doesn't exist.");
else {
for (i = 1; i <= n; i++) {
fact *= i;
}
printf("Factorial of %d = %llu", n, fact);
}
return 0;
}
16. 피보나치 수열을 해보자!
#include <stdio.h>
int main() {
int i, n;
int t1 = 0, t2 = 1;
int nextTerm = t1 + t2;
printf("Enter the number of terms: ");
scanf("%d", &n);
printf("Fibonacci Series: %d, %d, ", t1, t2);
for (i = 3; i <= n; i++) {
printf("%d, ", nextTerm);
t1 = t2;
t2 = nextTerm;
nextTerm = t1 + t2;
}
return 0;
}
다들 느꼈을지 모르겠지만, 슬슬 멘트 치기 귀찮다. 그리고 과제 제출 10시간 남음 ㅋㅋㅋㅋㅋㅋ 아 왜이리 많아..
16. 몇자리 수인지 계산하기
#include <stdio.h>
int main() {
long long n;
int count = 0;
printf("Enter an integer: ");
scanf("%lld", &n);
do {
n /= 10;
++count;
} while (n != 0);
printf("Number of digits: %d", count);
}
음.. 전공자가 이런말 하기 좀 그렇지만 나 do 처음봄.. ㅋㅋㅋㅋㅋ 이런게 있었구나..
do - while의 조합으로 while 조건이 채워질때까지 실행하는 형식인가 보다.
17. 사칙연산 계산하기
두개의 실수와 연산자를 입력하면 계산을 해주는 프로그램을 짜보자.
#include <stdio.h>
int main() {
char op;
double first, second;
printf("Enter an operator (+, -, *, /): ");
scanf(" %c", &op);
printf("Enter two operands: ");
scanf("%lf %lf", &first, &second);
switch (op) {
case '+':
printf("%.1lf + %.1lf = %.1lf", first, second, first + second);
break;
case '-':
printf("%.1lf - %.1lf = %.1lf", first, second, first - second);
break;
case '*':
printf("%.1lf * %.1lf = %.1lf", first, second, first * second);
break;
case '/':
if (second != 0)
printf("%.1lf / %.1lf = %.1lf", first, second, first / second);
else
printf("Error! Division by zero.");
break;
default:
printf("Error! Operator is not correct");
}
return 0;
}
보면 느낌이 오겠지만 switch는 case에 따라 변환해주도록 하는 기능이 있다. 그냥 if문으로 해도 되기는 된다.
18. n개의 정수를 입력해 배열에 저장하고 평균 계산하기
#include <stdio.h>
int main() {
int n, i;
float num[100], sum = 0.0, avg;
printf("Enter the number of elements (1 to 100): ");
scanf("%d", &n);
while (n < 1 || n > 100) {
printf("Error! Number should be in the range of (1 to 100).\n");
printf("Enter the number again: ");
scanf("%d", &n);
}
for (i = 0; i < n; i++) {
printf("%d. Enter number: ", i + 1);
scanf("%f", &num[i]);
sum += num[i];
}
avg = sum / n;
printf("Average = %.2f", avg);
return 0;
}
19. n개의 실수를 입력해서 가장 큰 값 찾기
#include <stdio.h>
int main() {
int n;
double arr[100];
printf("Enter the number of elements (1 to 100): ");
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
printf("Enter number %d: ", i + 1);
scanf("%lf", &arr[i]);
}
for (int i = 1; i < n; ++i) {
if (arr[0] < arr[i]) {
arr[0] = arr[i];
}
}
printf("Largest element = %.2lf", arr[0]);
return 0;
}
가장 큰 값을 arr[0]에 넣어서 계속해서 비교해 나가는 방식이다.
이부분 주석을 달까 했는데, 주석 없는 코드 컨셉 유지하려고.. ㅎㅎ
20. n x m배열 채우고 배열 계산하기
#include <stdio.h>
int main() {
int r, c, a[100][100], b[100][100], sum[100][100], i, j;
printf("Enter the number of rows (between 1 and 100): ");
scanf("%d", &r);
printf("Enter the number of columns (between 1 and 100): ");
scanf("%d", &c);
printf("\nEnter elements of the 1st matrix:\n");
for (i = 0; i < r; ++i)
for (j = 0; j < c; ++j) {
printf("Enter element a%d%d: ", i + 1, j + 1);
scanf("%d", &a[i][j]);
}
printf("Enter elements of the 2nd matrix:\n");
for (i = 0; i < r; ++i)
for (j = 0; j < c; ++j) {
printf("Enter element b%d%d: ", i + 1, j + 1);
scanf("%d", &b[i][j]);
}
for (i = 0; i < r; ++i)
for (j = 0; j < c; ++j) {
sum[i][j] = a[i][j] + b[i][j];
}
printf("\nSum of two matrices:\n");
for (i = 0; i < r; ++i)
for (j = 0; j < c; ++j) {
printf("%d ", sum[i][j]);
if (j == c - 1) {
printf("\n\n");
}
}
return 0;
}
첫번째 배열을 채우고 두번째 배열을 채우면, 두 배열의 합을 만들어주는 형식이다.
재미삼아 배열 크게 잡지 마라.. 채우다가 하루 다간다..
21. 함수를 이용해서 행렬의 계산을 진행해보자.
위에서 한 것 처럼 행렬 계산을 진행할 건데, 이번에는 함수를 이용해 보려고 한다.
#include <stdio.h>
void getMatrixElements(int matrix[][10], int row, int column) {
printf("\nEnter elements: \n");
for (int i = 0; i < row; ++i) {
for (int j = 0; j < column; ++j) {
printf("Enter a%d%d: ", i + 1, j + 1);
scanf("%d", &matrix[i][j]);
}
}
}
void multiplyMatrices(int first[][10], int second[][10], int result[][10], int r1, int c1, int r2, int c2) {
for (int i = 0; i < r1; ++i) {
for (int j = 0; j < c2; ++j) {
result[i][j] = 0;
}
}
for (int i = 0; i < r1; ++i) {
for (int j = 0; j < c2; ++j) {
for (int k = 0; k < c1; ++k) {
result[i][j] += first[i][k] * second[k][j];
}
}
}
}
void display(int result[][10], int row, int column) {
printf("\nOutput Matrix:\n");
for (int i = 0; i < row; ++i) {
for (int j = 0; j < column; ++j) {
printf("%d ", result[i][j]);
if (j == column - 1)
printf("\n");
}
}
}
int main() {
int first[10][10], second[10][10], result[10][10], r1, c1, r2, c2;
printf("Enter rows and columns for the first matrix: ");
scanf("%d %d", &r1, &c1);
printf("Enter rows and columns for the second matrix: ");
scanf("%d %d", &r2, &c2);
while (c1 != r2) {
printf("Error! Enter rows and columns again.\n");
printf("Enter rows and columns for the first matrix: ");
scanf("%d %d", &r1, &c1);
printf("Enter rows and columns for the second matrix: ");
scanf("%d %d", &r2, &c2);
}
getMatrixElements(first, r1, c1);
getMatrixElements(second, r2, c2);
multiplyMatrices(first, second, result, r1, c1, r2, c2);
display(result, r1, c2);
return 0;
}
22. 구조체를 이용해 정보를 저장하고 출력하기
이번에는 구조체를 사용해 볼 것이다.
구조체에서 각 변수에 대한 자료형을 선언하고 이를 메인에서 호출해서 정보를 data를 저장하는 것이다.
#include <stdio.h>
struct student {
char name[50];
int roll;
float marks;
} s;
int main() {
printf("Enter information:\n");
printf("Enter name: ");
fgets(s.name, sizeof(s.name), stdin);
printf("Enter roll number: ");
scanf("%d", &s.roll);
printf("Enter marks: ");
scanf("%f", &s.marks);
printf("Displaying Information:\n");
printf("Name: %s", s.name);
printf("Roll number: %d\n", s.roll);
printf("Marks: %.1f\n", s.marks);
return 0;
}
여기서 보면 student라는 구조체를 만들어두고, 구조체 마지막에 s라고 명명해주었기 때문에 main에서 s._으로 호출 할 수 있는 것이다.
그리고 하나 더 얘기하자면 fgets함수는 구조체를 파일 입출력 stream에서 문자열을 가져오는 함수이다.
여기서는 이름을 입력하면 이를 name에 저장해 주기 위해 사용된 것이다.
23. 함수와 구조체를 사용해서 두개의 complex number 더해주기
#include <stdio.h>
typedef struct complex {
float real;
float imag;
} complex;
complex add(complex n1, complex n2);
int main() {
complex n1, n2, result;
printf("For 1st complex number \n");
printf("Enter the real and imaginary parts: ");
scanf("%f %f", &n1.real, &n1.imag);
printf("\nFor 2nd complex number \n");
printf("Enter the real and imaginary parts: ");
scanf("%f %f", &n2.real, &n2.imag);
result = add(n1, n2);
printf("Sum = %.1f + %.1fi", result.real, result.imag);
return 0;
}
complex add(complex n1, complex n2) {
complex temp;
temp.real = n1.real + n2.real;
temp.imag = n1.imag + n2.imag;
return (temp);
}
별로 안어렵죵?
이제..!!! 끝났다
야호~ 과제 끝~
꽤나 다양한 자료형이 나오는 관계로 시험 전에 한번 정리 해줄 필요가 있을 것 같다.