/*
최대공약수 구하기 알고리즘
2개 값 입력, 최대 공약수 출력 함수
알고리즘:
1. v가 u보다 크면 v와 u값을 바꾼다.
2. u = u - v
3. u가 0이면 v가 최대공약수. 아니면 다시 처음으로 돌아간다.
*/#include<stdio.h>intGCD(void){
int u = 0;
int v = 0;
int temp = 0;
int result = 0;
printf("2개의 값을 입력하시오.\n");
printf("a:");
scanf_s("%d", &u);
printf("b:");
scanf_s("%d", &v);
while(1)
{
if (v > u) {
temp = u;
u = v; // 1. v가 u보다 크다면, v와 u값을 바꾼다.
v = temp;
u = u - v; // 2.
}
else {
u = u - v;
}
if (u == 0)
{
result = v; // 3. u가 0이면 v가 최대공약수break;
}
}
return result;
}
intmain(void){
int result;
result = GCD();
printf("최대공약수는: %d", result);
return0;
}
반응형
똑같은 기능을 하는 최대 공약수를 구하는 방법을 아래는 재귀함수를 이용한 방식이다.
/*
최대공약수 구하기 알고리즘(Recursive Function 모드 (재귀함수))
2개 값 입력, 최대 공약수 출력 함수
알고리즘:
1. v가 0이 아니면,
1.1. u = u % v
1.2. u와 v를 교환
1.3. 1으로 돌아감.
2. v가 0이면 u가 최대공약수
*/#include<stdio.h>intGCD_recursion(int u, int v){
if (v == 0)
return u;
elsereturnGCD_recursion(v, u % v);
}
intmain(void){
int u, v, result;
printf("2개의 값을 입력하시오.\n");
printf("a:");
scanf_s("%d", &u);
printf("b:");
scanf_s("%d", &v);
result = GCD_recursion(u, v);
printf("최대공약수는: %d", result);
return0;
}
아래 함수는 똑같이 최대 공약수를 구하는 방법이지만, 알고리즘 성능이 좀 더 향상 된 방법이다.
/*
최대공약수 구하기 알고리즘(성능 개선 모드)
2개 값 입력, 최대 공약수 출력 함수
알고리즘:
1. v가 0이 아니면,
1.1. u = u % v
1.2. u와 v를 교환
1.3. 1으로 돌아감.
2. v가 0이면 u가 최대공약수
*/#include<stdio.h>intGCD(void){
int u = 0;
int v = 0;
int temp = 0;
int result = 0;
printf("2개의 값을 입력하시오.\n");
printf("a:");
scanf_s("%d", &u);
printf("b:");
scanf_s("%d", &v);
while(v != 0) // v가 0이 아니면 무한 반복
{
u = u % v; // 1.1.
temp = v; // 1.2.
v = u;
u = temp;
}
result = u; // 2.return result;
}
intmain(void){
int result;
result = GCD();
printf("최대공약수는: %d", result);
return0;
}
- 여러 자료형(int, double 등)을 하나로 묶어서 표현할 수 있도록 함. - struct [자료형] 형태. 즉, 사용자 정의 자료형을 만듦.
- 구조체를 만들면 여러 자료형을 담고 있는 구조 하나만을 선언해서 가져올 수 있다.
#define _CRT_SECURE_NO_WARNINGS# include<stdio.h>// x, y점은 서로 독립된 것이 아니라, 하나의 정보를 표현한다.// 좌표점 세트(구조체)를 아래와 같이 정의structpoint
{int xpos;
int ypos;
};
// 구조체를 이용해서 좌표간 거리 구하기intmain(){
// 각각 x,y좌표를 지닌 2개의 구조체 생성.structpointpos1, pos2;double distance;
fputs("1번째 좌표: ", stdout);
scanf("%d %d", &pos1.xpos, &pos1.ypos);
fputs("2번째 좌표: ", stdout);
scanf("%d %d", &pos2.xpos, &pos2.ypos);
// 두 좌표 입력된 값 출력printf("첫번째 좌표점 : %d, %d\n", pos1.xpos, pos1.ypos);
printf("두번째 좌표점 : %d, %d\n", pos2.xpos, pos2.ypos);
return0;
}
위와 같은 방식으로 구조체 인스턴스(pos1, pos2)를 생성하고, 그 내부에 인자를 하나씩(pos1.xpos, pos1.ypos) 빼서 쓸 수 있다. 인스턴스에서 내부 인자에 접근하는 방법은 마침표(.)을 사이에 넣으면 된다.
반응형
<여러 타입(Type)자료형을 넣은 구조체>
인적정보가 담긴 구조체를 생성.
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>// char와 int 자료형이 섞여있는 구조체 생성 (인적 데이터)structperson
{char name[20];
char phoneNum[20];
int age;
};
intmain(){
// man1 과 man2 두 구조체인스턴스 생성.structpersonman1, man2;// man1에 대한 데이터 생성. (strcpy함수를 이용해 문자열 복사)strcpy(man1.name, "홍길동");
strcpy(man1.phoneNum, "010-1234-5678");
man1.age = 23;
// man2에 대한 데이터는 사용자 입력 받음printf("이름 입력: ");
scanf("%s", man2.name);
printf("번호 입력: ");
scanf("%s", man2.phoneNum);
printf("나이 입력: ");
scanf("%d", &(man2.age));
printf("첫번째 사람 이름: %s \n", man1.name);
printf("첫번째 사람 번호: %s \n", man1.phoneNum);
printf("첫번째 사람 나이: %d \n", man1.age);
printf("두번째 사람 이름: %s \n", man2.name);
printf("두번째 사람 번호: %s \n", man2.phoneNum);
printf("두번째 사람 나이: %d \n", man2.age);
return0;
}
구조체 인스턴스 man1은 자동입력된 데이터, man2는 유저의 입력은 받는 데이터.
구조체의 Type은 char과 int가 함께 들어가있다.
<구조체 선언과 동시에 변수까지 선언하기>
아래과 같이 main에서 구조체 인스턴스를 선언할 필요없이, 구조체 생성과 동시에 선언이 가능하다.
} 뒤에 띄어쓰기가 반드시 있어야 한다.
서로 같은 의미 main( )밖에서도 구조체 바로 아래 선언은 가능하다.
<구조체 선언과 동시에 초기화 하기>
아래과 같이 선언과 동시에 값을 넣으면, 구조체에 있는 변수 순서대로 값이 들어간다.
#include<stdio.h>structpoint
{int xpos;
int ypos;
};
structperson
{char name[20];
char phoneNum[20];
int age;
};
// 초기화 방식이 배열과 유사함.// 초기화 할 데이터들을 중괄호 안에 순서대로 나열하면 된다.intmain(){
structpointpos = {10, 20 };
structpersonman = {"이승기", "010-1234-5678", 21 };
printf("%d %d \n", pos.xpos, pos.ypos);
printf("%s %s %d \n", man.name, man.phoneNum, man.age);
return0;
}
{&nbsp; } 중괄호를 열고 값을 넣으면 해당값이 자동으로 들어가 초기화 한다.
#include<stdio.h>#include<string.h>intmain(){
char str1[30] = "First~";
char str2[30] = "Second";
char str3[30] = "simple num: ";
char str4[30] = "1234567890";
// case 1puts(str1); // 붙이기 전.strcat(str1,str2); // str1 뒤에 str2를 이어 붙임. [First~'\0']여기 NULL 자리를 str2로 채우고 NULL을 맨 뒤로 보냄. //**주의사항: str1 이 str2가 들어갈 충분한 배열공간을 갖고 있어야 뒤에 채워짐puts(str1); // 붙이기 후.// case 2strncat(str3, str4, 7); // n은 덧붙일 문자열의 최대 길이를 제한한다. 특히 NULL문자를 포함해 복사함으로,// 여기서 [1234567]까지 복사되고 그 뒤에 '\0'까지 복사가 된다. 즉, 총8개의 문자가 복사되는 것임.puts(str3);
return0;
}
서로 두개의 문자열을 비교해서 같으면 0을 반환하고, 왼쪽이 크면 +1 작으면 -1을 반환하는 함수이다.
아래 예를 보면 알 수 있다. (알파벳도 결국 아스키 코드이며, 그 아스키 코드값으로 비교한다)
#define _CRT_SECURE_NO_WARNINGS // 보안 경고로 인한 컴파일 에러 방지#include<stdio.h>#include<string.h>intmain(){
printf("%d \n", strcmp("ABCD", "ABCD")); // 같으므로 0을 반환printf("%d \n", strcmp("ABCD", "ABCC")); // C < D 이므로 s1이 값이큼. 0보다 큰값 반환. (왼쪽이 큼)printf("%d \n", strcmp("ABCD", "ABCDE")); // ABCD까지 같으나, E값이 나와서 s2가 더 큼. 0보다 작은값 반환.(오른쪽이 큼)return0;
}
결과
반응형
위 원리를 이용해서 아래와 같이 만들 수 있다.
2번의 문자열을 입력해서 그 두 문자열을 비교해서 일치여부 파악
#define _CRT_SECURE_NO_WARNINGS // fopen 보안 경고로 인한 컴파일 에러 방지#include<stdio.h>#include<string.h>intmain(){
char str1[20];
char str2[20];
printf("문자열 입력 1: ");
scanf("%s", str1);
printf("문자열 입력 2: ");
scanf("%s", str2);
// str1, str2가 같으면 0이 출력 그럼 False가 되는데, !(not)을 붙임으로 써 True를 만들어서 if 내부를 실행 시킴.if (!strcmp(str1, str2))
{
puts("두 문자열은 완벽히 동일합니다.");
}
else
{
puts("두 문자는 동일하지 않습니다.");
// str1, str2 의 3번째 까지 문자를 비교해 일치하면 0을 반환하는데 if(False),그러나 !을 만나서 if(TRUE) 이므로 내부를 실행함.if (!strncmp(str1, str2, 3))
puts("그러나 앞 세글자는 동일합니다.");
}
return0;
}