알고리즘

C 과제 1/2

haesa_s 2021. 1. 11. 23:20

# 문제1

[문제]

두 개의 문자열 s1, s2를 입력 받고, s1과 s2에 같은 index에 있는 문자들을 비교해서 같으면 O, 다르면 X를 출력하시오.

          - 문자열의 길이는 모두 30을 넘지 않음

          - 문자 비교 중 공백일 경우 X를 출력함

          - 포인터 사용

 

[코드]

#include<stdio.h>

int main()
{
	char s1[31] = { 0 }, s2[31] = { 0 };
	char *p1 = &s1, *p2 = &s2;

	scanf(" %s", &s1);
	scanf(" %s", &s2);

	while (!(*p1 == '\0' && *p2 == '\0'))
	{
		if (*p1 == *p2)
			printf("O");
		else
			printf("X");

		p1++;
		p2++;
	}

	return 0;
}

[코드설명]

s1배열과 s2배열을 0으로 초기화하고, 문자열을 입력 받는다. p1과 p2는 각각 s1과 s2를 가리키고 있다. 두 포인터가 '\0'이 아니면 *p1과 *p2값을 비교하여 같으면 O, 다르면 X를 출력하고, p1과  p2의 값을 증가시킨다.

 

[실행 결과]

 

 

 

# 문제 2

[문제]

문자열 S와 숫자 N을 입력받고, 다음과 같은 규칙으로 문자열을 바꾼다.

          - 맨 앞글자는 문자열의 맨 뒤로 이동한다.

          - 맨 앞을 제외한 나머지 문자들은 한 칸씩 앞으로 이동한다.

          - 이 규칙을 함수로 구현한다.

문자열 S를 N번 바꾼 결과를 출력하시오.

          - 문자열의 길이는 30을 넘지 않고, N은 100보다 작은 양의 정수이다.

 

[코드]

#include<stdio.h>
#include<string.h>

void str_change(char *s, int length);

int main()
{
	char S[30] = { 0 };
	int N, slen;

	scanf("%s", &S);
	scanf("%d", &N);

	slen = strlen(S);

	for (; N > 0; N--)
		str_change(S, slen);

	printf("%s\n", S);
	return 0;
}

void str_change(char *s, int length)
{
	char *temp;
	int i;

	*(s+length) = *s;

	for (i = 0, temp = s+1; i < length; i++, temp++)
		*(s + i) = *temp;

	s[length] = '\0';
}

[코드설명]

  ① main

S배열을 0으로 초기화하고, 문자열 S와 N을 입력 받는다. 그리고 str_change에 넘겨줄 인자를 위해 strlen(S)으로 S배열의 문자열 길이를 알아낸다. 그 후 for문으로 str_change(S, slen)를 N번 반복한다. 반복이 끝나면 S문자열을 출력한다.

 

  ② str_change

main()에서 문자열과 문자열의 길이를 인자로 받고 문자열의 배열을 바꾼다.

문자열 맨 앞에 있는 문자를 맨 뒤로 옮기고, for문으로 전체 문자열을 앞으로 하나씩 당겼다.

temp는 for문에서 문자를 앞으로 하나씩 당길 때, 옮겨질 문자를 가리키는 포인터로 사용했다. 마지막 문자까지 옮겨진 후에는 문자열의 맨 끝에 '\0'을 넣어서 문자열을 완성시킨다.

 

[실행 결과]