[42Seoul] CPP Module 00 - ex00

수빈·2021년 12월 30일
0

42CPP

목록 보기
2/11
post-thumbnail

EX00: Megaphone

[C++ 의 표준출력 std::cout 의 연습]

to_upper 프로그램 만들기

  • 제출할 디렉토리: ex00/
  • 제출할 파일: Makefile, megaphone.cpp
  • 금지 함수: 없음

다음과 같은 동작을 하는 프로그램을 쓰세요

  • 대문자로 바꾸기
  • if (argc == 1) 출력 * LOUD AND UNBEARABLE FEEDBACK NOISE *
  • 출력시 argv 간 띄어쓰기 추가하지 않음
  • 마지막줄 개행

과제를 작성하기 전 C++의 표준 입출력을 알아야 한다.

1. C++ 표준 입출력

#include <iostream>

int main()
{
  std::cout << "Hello, World!!" 
	std::cout << std::endl;
  return (0);
}

C에서 사용한 stdio.h와 달린 C++에서는 iostream를 사용한다. .h를 안 붙인다는 차이가 있으며 함수 작성에 가장 기본적인 헤더.

iostream은 C++의 입출력을 담당하는 헤더이며 객체지향언어인 C++처럼 iostream에 있는 입출력 함수들 역시 객체로 정의되어 있다. (iostream의 구성 요소 정리)

💡 C++ 프로그램은 입력 시 버퍼를 만들고 Enter를 누르면 입력 버퍼를 삭제, 출력 시 개행 문자를 받으면 출력 버퍼를 지운다고 한다.

출처

2. namespace

C++ 표준 라이브러리에 존재하는 모든 변수나 객체는 std 표준 네임 스페이스에 포함된다. 표준 출력 cout 객체를 사용하기 위해서는 std::cout처럼 네임 스페이스를 붙여 사용해야 한다.

네임 스페이스는 정의된 객체나 함수의 소속을 의미한다. a()b()에 각각 abc 객체를 선언했을 때 a::abc, b::abc로 접두어만 다르게 해 사용할 수 있다는 뜻

int doSomething(int x, int y)
{
	return x + y;
}
int doSomething(int x, int y)
{
	return x - y;
}
#include <iostream> 
#include "foo.h" 
#include "goo.h" 
int main() 
{ 
	std::cout << doSomething(4, 3);
	return 0; 
}

>> c:\VCProjects\goo.h(4) : error C2084: function 'int __cdecl doSomething(int,int)' already has a body

예제처럼 같은 프로그램에 이 둘을 같이 포함하면 이름과 매개 변수가 같은 함수가 같은 스코프에 있음으로써 이름 충돌이 발생한다.

namespace Foo
{
	int doSomething(int x, int y)
	{
		return x + y;
	}
}
namespace Goo
{
	int doSomething(int x, int y)
	{
		return x - y;
	}
}

이제 Foo안에 doSomething()이, Goo안에 doSomething()이 있다.

각 네임 스페이스 안에 있는 식별자를 찾기 위해서는 스코프 분석 연산자(::)가 필요하다.
이 연산자를 사용하려면 식별자 이름 앞에 사용할 네임 스페이스를 붙이면 된다. Foo::doSomething(x, y), Goo::doSomething(x, y)

#include <iostream> 

int main() 
{ 
	std::cout << Foo::doSomething(4, 3); << '\n'
	std::cout << Goo::doSomething(4, 3); << endl (둘 다 개행 출력임)
	return 0; 
}

참고

Makefile

NAME = megaphone

CPPC = clang++
CPPFLAGS = -Wall -Wextra -Werror
RM = rm -f
MAIN = megaphone.cpp

$(NAME): $(MAIN)
	$(CPPC) $(MAIN) $(CPPFLAGS) -o $(NAME)

all : $(NAME)
clean: $(RM) $(NAME)
re:	clean all

.PHONY: all clean re

CPPC, CPPFLAGS 매크로명은 여기에서 다른 의미로 쓰이는 것 같아서 다음 과제부터는 이렇게 안 써야지..

megaphone.cpp

#include <iostream>

char	CharUpper(char c)
{
	if ('a' <= c && c <= 'z')
		return (c - ('a' - 'A'));
	return (c);
}

int		main(int argc, char **argv)
{
	int		i;
	int		j;
	
	std::cout << "0";
	(void) argc;
	if (!argv[1])
		std::cout << "* LOUD AND UNBEARABLE FEEDBACK NOISE *";
	for (i = 1; argv[i]; i++)
	{
		for (j = 0; argv[i][j]; j++)
			std::cout << CharUpper(argv[i][j]);
	}
	std::cout << std::endl;
	return (0);
}

원래 42 norminette 규정으로 for문은 사용하지 못하고 while문으로 반복문을 작성했는데 cpp는 규정이 따로 없어서 for문에 익숙해질겸 작성하였음

profile
42Seoul -soooh ~ 2022.04

0개의 댓글