[C++ 언어-기초실습-2] 알파벳 개수 세기
[C++ 언어-기초실습-2] 알파벳 개수 세기
- 다운 사이트 : https://sourceforge.net/projects/orwelldevcpp/
- 웹컴파일러 : https://www.tutorialspoint.com/compile_c_online.php
오늘의 C++ 실습은 영어 문장을 입력 받았을 때 그 문장에서 알파벳이 얼마나 쓰였는지 세는 프로그램을 실습하고자 합니다.
1. 알파벳 입력
알파벳 문장을 입력 했을 때 문장을 한번에 읽어와서 알파벳을 세고자 한다면 어떻게 해야 할까요.
char ch[100];
cin.getline(ch,100);
getline()함수로 해서 최대 100글자를 읽어오는데 여기서 문자의 끝은 enter가 됩니다. 즉, enter를 친 문장까지 읽어오게 됩니다.
2. 알파벳 비교
a - z : 97 - 122
A - Z : 65 - 90
알파벳의 범위는 위와 같습니다. 이 범위를 체크해서 쓰여진 알파벳의 개수를 세면 됩니다.
if(ch[i]>=65 && ch[i]<=90){ //대문자 비교
pos=ch[i]-65;
ck[pos]+=1;
}
else if(ch[i]>=97 && ch[i]<=122){ //소문자 비교
pos=ch[i]-97;
ck[pos]+=1;
}
이렇게 읽어온 ch[] 문자열에서 각 문자를 if문으로 비교하면 됩니다. 이때 문장안에 알파벳만 개수를 세어야 하기 때문에 알파벳 범위를 위와 같이 대문자인지 소문자인지 체크하게 됩니다.
참고로,
int ck[26]; //알파벳 카운터 배열
ck[]배열로 ck[0]은 'a'이고 chk[25]은 'z'로 알파벳의 위치를 지정해 놓았을 때
pos=ch[i]-65; //대문자
pos=ch[i]-97; //소문자
이렇게 위치를 잡습니다. 그리고 그 위치를 아래와 같이 +1씩 증가시키면 알파벳 개수를 누적 시킬 수 있습니다.
ck[pos]+=1;
그럼 이 로직을 완성해 볼까요.
3. 코딩
[전체소스]
#include <iostream>
#include <string.h>
using namespace std;
int main(int argc, char** argv) {
char ch[100];
int ck[26];
int pos;
cout<<"문장을 하나 입력하시오? ";
cin.getline(ch,100);
for(int i=0;i<26;i++){
ck[i]=0;
}
for(int i=0;i<strlen(ch);i++){
if(ch[i]>=65 && ch[i]<=90){
pos=ch[i]-65;
ck[pos]+=1;
}
else if(ch[i]>=97 && ch[i]<=122){
pos=ch[i]-97;
ck[pos]+=1;
}
}
cout<<"[ 알파벳 숫자 세기 ]"<<endl;
for(int i=0;i<26;i++){
if(ck[i]!=0) cout<<static_cast<char>(i+65)<<" : "<<ck[i]<<endl;
}
return 0;
}
보시면 쓰여진 알파벳 출력시키고 해당 알파벳을 카운트 한 숫자를 출력합니다. 여기서, 알파벳 출력은 대문자로 하는데 아까 -65을 해서 배열 ck[]는 0~25위치로 알파벳을 지정했기에 원상 복수하려면 다음과 같습니다.
static_cast<char>(i+65)
이렇게 해당 i의 알파벳 위치값에다 65을 더함으로 알파벳을 구할 수 있게 됩니다.
결과가 정상적으로 나온지 볼까요.
[결과]
보시는 것 처럼 알파벳의 개수를 정상적으로 출력 했네요. 참고로 '!'은 기호입니다. 알파벳 개수를 세는 프로그램이에 이 기호 문자는 무시해야 하겠죠. 그래서 위에서 if문으로 대문자와 소문자인지 체크문을 만들었죠. 알파벳을 제외한 다른 기호는 그냥 무시하고 넘어가도록요.
마무리
지루함을 달래기 위해 C++을 좀 더 이론 글을 써야 하는데 중간의 실습편으로 알파벳 개수 세기를 만들어 보았습니다. 이 코딩을 기준으로 알파벳에 관해 다른 응용을 만들어 보세요.
Thank you for your continued support towards JJM. For each 1000 JJM you are holding, you can get an additional 1% of upvote. 10,000JJM would give you a 11% daily voting from the 700K SP virus707 account.
Thank you