목적
  - 문자열에서 사전정렬을 이해한다.

문제

사용자 삽입 이미지

코드

#include <iostream>
#include <cstring>
#include <ctype.h>

using namespace std;

int main(void)
{
 char sIn[4][255] = {0};
 char sSwap[255] = {0};
 char cBuf = ' ';
 long lSwap = 0;
 long lValue[4] = {0};
 int i, j;
 i = j = 0;

 while(i < 4)
 {
  cout << i + 1 << "번째 문자열 입력 : ";
  cin.getline(sIn[i],255);

  while(cBuf != 0)
  {
   cBuf = sIn[i][j];

   if(cBuf != ' ')
   {
   
    if(islower(cBuf))
    {
     lValue[i] = (int)cBuf - 60;
     break;

    }

    if(isupper(cBuf))
    {
     lValue[i] = (int)cBuf - 55;
     break;

    }

    if(isdigit(cBuf))
    {
     lValue[i] = (int)cBuf - 48;
     break;
    }

   }
 
   j++;
  }
 
  cBuf = ' ';

  j = 0;
  i++;

 }

 i = 0;
 j = 0;
 
 while(i < 4)
 {
  j = i;
  while(j < 4)
  {
   if(lValue[i] < lValue[j])
   {
    lSwap = lValue[j];
    lValue[j] = lValue[i];
    lValue[i] = lSwap;

    strcpy(sSwap, sIn[i]);
    strcpy(sIn[i], sIn[j]);
    strcpy(sIn[j], sSwap);

   }

   j++;
 
  }

  i++;
 }

 i = 0;
 cout << endl << "크기순으로 정렬된 문자열 : " << endl;
 while(i<4)
 {
  cout << sIn[i] << endl;
  i++;

 }
 

 return 0;
}

해설
  - 코드가 약간 비효율적입니다.
  - 문제를 제대로 이해하시면 상당히 쉽습니다. 사전정렬을 하되 소문자 > 대문자 > 숫자 그룹별로 숫자가 크며, 사전순으로 알파벳 순서가지날수록 값이 커집니다. 이 숫자를 각 문자열의 첫째 글자만  맞춰서 문자열을 내림차순으로 맞춥니다.

  - 문제를 이해하지 못해서 값을 더하면 엉뚱한 결과가 나옵니다.
  - 예제에서 'V' > 'M' > 'I' > 'H' 이라서 순서가 실행결과 처럼 나왔습니다.
  - 첫째 글자가 검출되면 계산후 값을 저장하고 break로 탈출합니다.

참고
  - 해답에는 vector 알고리듬을 쓰던데 크게 차이는 없습니다.
  - 유사 문제 검색

Posted by 카켈




목적
  - 문자열을 동적 할당으로 입력받아 자소를 비교 한다.

문제

사용자 삽입 이미지
코드

#include <iostream>
#include <cstring>
#include <ctype.h>

using namespace std;

int main(void)

{
 char sIn[255] = {0};
 int i, iAlpha, iSpace, iSpecial, iMoum;
 i = iAlpha = iSpace = iSpecial = iMoum = 0;
 char cBuf;
 char* sString = NULL;

 cout << "문자열 입력 : ";
 cin.getline(sIn,255);

 sString = new char[strlen(sIn) + 1];
 strcpy(sString, sIn);

 while(sString[i] != 0)
 {
  if(isalpha(sString[i]))
   iAlpha++;

  if(isspace(sString[i]))
   iSpace++;

  if(ispunct(sString[i]))
   iSpecial++;
 
  cBuf = tolower(sString[i]);

  if(cBuf == 'a' || cBuf == 'e' || cBuf == 'i' || cBuf == 'o'
   || cBuf == 'u')
   iMoum++;

  i++;

 }

 cout << "문자열의 길이 : " << strlen(sString) << endl;
 cout << "알파벳문자 개수 : " << iAlpha << endl;
 cout << "공백문자   개수 : " << iSpace << endl;
 cout << "특수문자   개수 : " << iSpecial << endl;
 cout << "모음의     개수 : " << iMoum << endl;

 return 0;
}



해설
  - 문자별료 배열 포인터를 지정 하여 자소별로 접근할수 있게 했습니다.
  - A E I O U / a e i o u 는 소문자로 일괄적으로 비교하여 비교하게 했습니다.

참고
  - 유사 문제 검색

Posted by 카켈




목적
   - 동적 할당을 이해하고 문자열에 적용 시킨다.

문제
사용자 삽입 이미지

코드

#include <iostream>
#include <cstring>

using namespace std;

int main(void)
{
 char sIn[255] = {0};
 char *sString = NULL;
 int i = 0;

 cout << "문자열 입력 : ";
 cin.getline(sIn,255);

 sString = new char[strlen(sIn) + 1];
 strcpy(sString, sIn);

 cout << "공백제외한 역순 출력 :";

 for(i = strlen(sString); i >= 0; i--)
 {
  if (sString[i - 1] != ' ')
   cout << sString[i];
 }
 
 cout << endl;

 sString = NULL;
 delete sString;

 return 0;
}

해설
  - sString 은 시작시 단일 문자를 저장하는 주소를 담는 4바이트 문자형 포인터입니다. sIn 에 값이 들어 오면 길이를 확인하여 동적으로 sString 를 늘려 줍니다. 프로그램 상에서 동적으로 늘렸기 떄문에 마칠때 delete 로 삭제를 해줍니다.

참고
  - 유사 문제 검색
Posted by 카켈




목적
  - 문자열을 다룰줄 안다.

문제

사용자 삽입 이미지

코드

#include <iostream>

using namespace std;

int main(void)
{
 char sStrA[255] = {0};
 char sStrB[255] = {0};

 cout << "첫번째 문자열 : ";
 cin.getline(sStrA,255);

 cout << "두번째 문자열 : ";
 cin.getline(sStrB,255);
 
 cout << "병합된 문자열 : ";
 if (strlen(sStrA) <= strlen(sStrB))
  cout << sStrA << sStrB << endl;

 else
  cout << sStrB << sStrA << endl;

 return 0;
}



해설
  - 자료의 효율성은 없지만 최대한 편리하게 작성 했습니다.
  - strlen 함수로 문자의 길이를 비교 하고 첫번째 문자열이 두번째 문자열 작거나 같다면 그대로 출력하고 그렇지 않고 두번째 문자열이 더 짧다면 바꿔서 출력하는 알고리듬을 가지고 있습니다.

참고
  - 유사 문제 검색

Posted by 카켈



목표
  - 문자의 속성을 알고 비교 한다.

문제
사용자 삽입 이미지
코드

#include <iostream>
#include <ctype.h>

using namespace std;

int main(void)
{
 char sIn[255] = {0};
 int iCount, iUpper, iLower, iSpace, iEtc, iNumber;
 iCount = iUpper = iLower = iSpace = iEtc = iNumber = 0;

 cout << "문자열을 입력하세요 : ";
 cin.getline(sIn,255,'\n');

 while(sIn[iCount] != 0)
 {
  if(isupper(sIn[iCount]))
   iUpper++;
 
  else
  {
   if(islower(sIn[iCount]))
    iLower++;
   else
   {
    if(isspace(sIn[iCount]))
     iSpace++;
    else
    {
     if(isdigit(sIn[iCount]))
      iNumber++;
     else
      iEtc++;

    }
     
   }
  }

  iCount++;

 }

 cout << "대문자 개수 : " << iUpper << endl;
 cout << "소문자 개수 : " << iLower << endl;
 cout << "숫자의 개수 : " << iNumber << endl;
 cout << "공백의 개수 : " << iSpace << endl;
 cout << "기타문자 수 : " << iEtc << endl;
 cout << "총문자의 수 : " << iCount << endl;


 return 0;
}


해설
  - isdigit 는 숫자인지 아닌지 알아내는 함수 입니다.

참고
  - 유사 문제

Posted by 카켈



목적
  - 클래스를 이해한다.

문제
사용자 삽입 이미지

코드





해설
  - 클래스를 사용하여 문제를 풀었습니다.
  - Stu.h Stu.cpp 2004_final_1.cpp 이렇게 구성되어 있으며 클래스내 맴버 구성은 아래와 같습니다.
  - m_Add() 맴버 함수는 맴버 변수에 저장될 자료의 추가를 m_Print() 맴버함수는 맴버 변수를 출력하고 m_Check() 는 y / n 값을 받아 y 이면 종료를 다른 값이면 n 을 받아 리턴하여 반복 할것인지 판정하는 함수 입니다.

  - Visual C++ 에서 프로그램상 클래스를 추가하는 방법입니다. 조금은 복잡하지만 이걸 알아 두면 나중에 복잡한 클래스 코드를 쉽게 구현할수 있습니다.

    Workspace 창에 보면 ClassView 이라는 창이 있습니다. 그곳에서 프로젝트 명을 오른쪽 버튼을 클릭 New Class... 를 선택하세요

사용자 삽입 이미지
 


    클래스의 종류와 이름을 선택하세요 여기서는 Generic Class 만 선택할수 있습니다. 상속이나 기타 다른 설정은 여기서 할 필요 없습니다.

사용자 삽입 이미지

    맴버 함수와 변수를 만들고 선택하세요. m_Add() m_Print() m_Check() 는 외부 main 함수 내에서 쓰기 때문에 public 으로 선언하시고 맴버 변수인 spName, spSid, spDepart 는 맴버 함수들에 의해서만 쓰여질 것이기 때문에 private 로 하시면 됩니다.

사용자 삽입 이미지

사용자 삽입 이미지
   
사용자 삽입 이미지

 코드를 완성하세요. 위에 쓰여진대로 쓰시거나 원하시는 코드를 넣으시면 됩니다. 단 쓰여질 범위는 클래스를 정의하는 cpp 파일에서 하시는게 좋습니다. 기본 마법사 툴에서 그렇게 하게 제공합니다.

사용자 삽입 이미지

    완성된 클래스의 형태입니다. 이렇게 하시면 Stu 라는 객체가 완성이 되는 것입니다.

사용자 삽입 이미지

파일 구조는 아래와 같습니다.
사용자 삽입 이미지

    잊지 마셔야 할 것은 그 함수를 쓰거나 자료형을 쓸려면 꼭 include 시켜줘야 하는 것입니다. 컴파일러는 프로젝트내에 파일이 열려있다는 사실만으로는 그 파일이 필요한지 그 자료형이 필요해서 자동으로 넣어 주지는 않습니다.

참고
  - 유사 문제

Posted by 카켈




목적
  - ctype.h 를 쓰지 않고 문자의 속성을 구분하고 변경할줄 안다.
  - ASCII 코드표를 이해한다.

문제

사용자 삽입 이미지
코드

#include <iostream>

using namespace std;

int main(void)

{
 char sIn[255] = {0};
 char sOut[255] = {0};
 int i, j;
 i = j = 0;

 cout << "문자열을 입력하세요 : ";
 cin.getline(sIn,255,'\n');

 while(sIn[i] != 0)
 {
  if(sIn[i] >= 65 && sIn[i] <= 90)
  {
   sOut[j] = sIn[i] + 32;
   j++;
  }

  else
  {

   if(sIn[i] >= 97 && sIn[i] <=122)
   {
    sOut[j] = sIn[i] - 32;
    j++;
   }

   else
   {
    sOut[j] = sIn[i];
    j++;
   }

  }

  i++;
 }


 cout << "변환된 문자열 : " << sOut << endl;
 i = j = 0;

 cout << "공백문자 제거 : ";

 while(sOut[i] != 0)
 {
  if(sOut[i] == ' ');
  else
   cout << sOut[i];

  i++;
 }

 cout << endl;

 return 0;
}


해설
  - ASCII 코드를 이해한다면 ctype.h 의 tolower() 나 toupper() isspace() 함수를 간단하게 구현할수 있습니다.

참고
  -유사문제

Posted by 카켈




목적
  - 단항 연산자에 대해 연습한다.
  - 문자열을 입력 및 조합한 후 출력한다.

문제
사용자 삽입 이미지
코드

#include <iostream>

using namespace std;

int main(void)
{
 char sIn_a[255] = {0};
 char sIn_b[255] = {0};
 int i, j;
 i = j = 0;

 cout << "첫번째 문자열 입력 : ";
 cin.getline(sIn_a,255,'\n');
 cout << "두번째 문자열 입력 : ";
 cin.getline(sIn_b,255,'\n');

 cout << "첫번째 문자열 : ";
 while(sIn_a[i] != 0)
 {
  cout << sIn_a[i];
  i++;

 }

 cout << endl;

 cout << "두번째 문자열 : ";
 while(sIn_b[j] != 0)
 {
  cout << sIn_a[j];
  j++;

 }

 cout << endl;

 cout << "병합된 문자열 : ";
 cout << sIn_a[i] << sIn_b[j] << endl;

 cout << "뒤집힌 문자열 : ";
 
 while(j-- > 0)
   cout << sIn_b[j];

 while(i-- > 0)
   cout << sIn_a[i];
 
 cout << endl;

 return 0;

}


해설
  - 이전 문제들에도 문자열 병합과 출력이 있어서 약간의 변형을 했습니다. cstring / string.h 를 쓰지 않고 병합 출력을 하였습니다.

단항 연산자(unary operator)는 피연산자가 하나면 되는 연산자 입니다. 피연산자는 변수여야 하며(그 자체로는 변하지 않는 l-value) 앞에 붙었느냐 아니면 뒤에 붙었느냐에 따라 달라 집니다.
[피연산자]++ => 쓰는 라인에서는 증가가 없지만 다음 줄에서는 [피연산자]가 1 증가 합니다.
[피연산자]-- => 쓰는 라인에서는 증가가 없지만 다음 줄에서는 [피연산자]가 1 감소 합니다.
++[피연산자] 쓰는 라인에서는 증가가 되며 그 줄 부터 [피연산자]가 1 증가 합니다.
--[피연산자] 쓰는 라인에서는 감소가 되며 그 줄 부터 [피연산자]가 1 감소 합니다.

자세한 사항은 키로그를 참조 하시기 바람니다.

참고
  - 유사 문제
  - http://www.winapi.co.kr/clec/cpp3/28-3-2.htm : 증감 연산자



Posted by 카켈




목적
  - 문자열을 다룬다.
문제
사용자 삽입 이미지

코드

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
 char sIn[255] = {0};
 int i = 0;

 cout << "문자열을 입력하세요 : ";
 cin.getline(sIn,255,'\n');
 i = strlen(sIn);

 while(i >= 0)
 {
  cout << sIn[i - 1];
  i--;
 }

 cout << endl;

 return 0;
}


해설
  - cin 의 getline 매소드 (맴버함수) 는 문자열을 받아 들이는 함수입니다.

참고
  - 유사 문제

Posted by 카켈




목적
  - 문자열을 조작할 줄 안다.

문제
사용자 삽입 이미지

코드

#include <iostream>
#include <cstring>
#include <ctype.h>

using namespace std;

int main(void)
{
 char sIn[255] = {0};
 char *spA, *spB, *spC;
 spA = spB = spC = NULL;

 cout << "첫번째 문자열을 입력하세요 : ";
 cin.getline(sIn,255,'\n');

 spA = new char[strlen(sIn) + 1];
 strcpy(spA, sIn);

 cout << "두번째 문자열을 입력하세요 : ";
 cin.getline(sIn,255,'\n');

 spB = new char[strlen(sIn) + 1];
 strcpy(spB, sIn);

 spC = new char[strlen(sIn) + strlen(sIn) + 1];
 strcpy(spC, spA);
 strcat(spC, spB);

 cout << "첫번재 문자열 : " << spA << endl << "두번째 문자열 : " << spB << endl;
 cout << "병합된 문자열 : " << spC << endl;
 cout << "변환후 문자열 : ";

 for(int i = 0; i < strlen(spC); i++)
 {
  if(islower(spC[i])) cout << (char)toupper(spC[i]);
  else cout << (char)tolower(spC[i]);

 }
 
 cout << endl;

 spA = spB = spC = NULL;
 delete spA, spB, spC;

 return 0;
}

해설
  - tolower 나 toupper 의 리턴형은 int 이므로 강제 형변환(캐스트) 했습니다.
  - 동적 할당으로 sIn 문자열을 용량을 할당받은 공간에 포인터로 받아 저장했습니다.
  - 동적 할당을 받았으면 반환 하는 걸 잊지 말아야 합니다.

참고
  - 유사 문제

Posted by 카켈





목적
- 문자열을 병합한다.
- 대소문자를 변형 시킨다.
- 동적할당에 대해 이해한다.
- 키보드로 문자열을 받아 출력한다.

문제

사용자 삽입 이미지
풀이

#include <iostream>
#include <cstring>
#include <ctype.h>

using namespace std;

int main(void)
{
 char sIn[255] = {0};
 int iCount = 0;
 char *cpA, *cpB, *cpC;
 cpA = cpB = cpC = NULL;

 cout << "첫번째 문자열을 입력하세요 : ";
 cin.getline(sIn,255,'\n');
 cpA = new char[strlen(sIn) + 1];
 strcpy(cpA, sIn);

 cout << "두번째 문자열을 입력하세요 : ";
 cin.getline(sIn,255,'\n');
 cpB = new char[strlen(sIn) + 1];
 strcpy(cpB, sIn);

 cpC = new char[strlen(cpA) + strlen(cpB) + 1];
 strcpy(cpC, cpA);
 strcat(cpC, cpB);

 cout << "병합된 문자열 : " << cpC << endl;
 cout << "대소문자 변환후 문자열 : ";

 for(iCount = 0; iCount < strlen(cpC); iCount++)
 {
  if(islower(cpC[iCount])) cout << (char)(toupper(cpC[iCount]));
  else cout << (char)tolower(cpC[iCount]);

 }

 cout << endl;

 cout << "순서 뒤바뀐 문자열 : ";
 for(iCount = strlen(cpC) - 1; iCount >= 0; iCount--)
 {
  if(islower(cpC[iCount])) cout << (char)(toupper(cpC[iCount]));
  else cout << (char)tolower(cpC[iCount]);

 }

 cout << endl;

 return 0;
}


해설
  - 메모리를 동적으로 받아 넣기 위해서 문자열 포인터를 썼습니다.
  - new 명령어를 통해 새로운 공간을 받아 넣습니다. 그 크기는 입력 변수에 받은 길이 + 1 [NULL 문자] 입니다.
  - strcat 나 strcpy 에서는 NULL 문자를 붙여 넣거나 복사를 시도하면 연산 오류가 생깁니다.
  - cout 에서는 형에서 비교적 자유롭게 출력이 가능하므로 int 형으로 리턴이 되는 tolower 나 toupper 를 정수로 나오지 않게 하기 위해 char 형으로 강제 형변환 시켰습니다.

참고
  - 구글 검색 : 동적 할당
  - 유사 문제

Posted by 카켈



1. 목적

  - 문자열 배열에 속한 문자값을 이해한다.

2. 문제
(점수 : 30 점)
  - string.h 를 활용하지 않고 문자열을 입력 받아서 문자의 크기를 비교하여라.
  - 대문자 > 소문자 > 띄어 쓰기 이며 크기값은 ASCII 코드 값을 의미 한다.
  - 출력 화면
1차)
첫번째 문자열을 입력하세요 : Hello
두번째 문자열을 입력하세요 : Hello World
Hello World 가 더 크다.
Press any key to continue
2차)
첫번째 문자열을 입력하세요 : ABCDEF
두번째 문자열을 입력하세요 : AABCDE
ABCDEF 가 더 크다.
Press any key to continue
3차)
첫번째 문자열을 입력하세요 : abd c
두번째 문자열을 입력하세요 : abc d
두 문자열은 동일하다.
Press any key to continue

3. 이해
  - ASCII 코드 값을 실제 계산을 할줄 아는가?
  - 문자열을 받아서 배열로 저장할 수 있는가?

4. 코드

#include <stdio.h>

int main()
{
 char in_a[255] = {0};
 char in_b[255] = {0};
 long scr_a, scr_b;
 int i;
 scr_a = scr_b = i = 0;
 
 printf("첫번째 문자열을 입력하세요 : ");gets(in_a);
 printf("두번째 문자열을 입력하세요 : ");gets(in_b);

 while(in_a[i] != 0 || in_b[i] != 0)
 {
  scr_a += (int)in_a[i];
  scr_b += (int)in_b[i];
  i++;

 }

 if(scr_a > scr_b) printf("%s 가 더 크다.\n",in_a);
 if(scr_a < scr_b) printf("%s 가 더 크다.\n",in_b);
 if(scr_a == scr_b) printf("두 문자열은 동일하다.\n");

 return 0;
}


5. 해설
  - 두 문자열이 NULL 될때 까지 ASCII 코드 값의 합을 저장하는 내용입니다. 0 으로 초기화 시켰기 때문에 한 문장이 끝났을때에 뒷자리를 계속 더해도 0 이기 때문에 계속 더할수 있습니다.
  - ASCII 코드 값을 int 형으로 형변환 시켜 더하면 크기에 따른 숫자 값을 입력 받아 쓸수가 있습니다.

6. 참고
  - 유사 문제
Posted by 카켈




1. 목적

  - 문자열에 대한 추가적인 이해를 한다.

2. 문제 (점수 : 25 점)
  - 문자열을 입력받아 처음에는 대문자로 변환하고 다음에는 크기 순으로 내림차순 정렬하여 출력하여라.
  - 출력 화면

문자열을 입력하세요 : Here I Stand For You !!
입력된 문자열 : Here I Stand For You !!
변환된 문자열 : HERE I STAND FOR YOU !!
정렬된 문자열 : YUTSRROONIHFEEDA!!
Press any key to continue


3. 이해
  - 문자열과 각 문자의 특성을 이해하는가?
  - 내림차순에 대한 정렬의 개념을 아는가?

4. 코드

#include <stdio.h>
#include <ctype.h>

int main()
{
 char in[255] = {0};
 char out[255] = {0};
 char swap;
 int i, j, length;
 i = j = length = 0;
 
 printf("문자열을 입력하세요 : ");
 gets(in);
 printf("입력된 문자열 : ");puts(in);
 printf("변환된 문자열 : ");while(in[length] != 0)
 {
  putchar(toupper(in[length]));
  length++;
 
 }

 i = 0;
 j = 0;

 while(in[i] != 0)
 {
  if( !(isspace(in[i])) )
  {
   out[j] = toupper(in[i]);
   j++;

  }

  i++;

 }

 printf("\n정렬된 문자열 : ");
 for(i = 0; i < length; i++)
 {
  for(j = i; j < length; j++)
  {
   if(out[i] < out[j])
   {
    swap = out[i];
    out[i] = out[j];
    out[j] = swap;

   }

  }
 }

 puts(out);

 return 0;
}


5. 해설
  - 이전 문제에서 띄워 쓰기를 없애는 기능을 추가했습니다. isspace 함수가 띄워쓰기(엔터/탭/스페이스) 값을 구별하는 역할을 합니다.
  - 내림차순은 큰 값에서 작은 값으로 내려가는 의미로 쓰입니다. 당연히 작은값 - 큰값으로 되어 있다면 그 위치를 바꿔줌으로써 정렬을 완성 시킵니다.

6. 참고
  - 유사 문제
Posted by 카켈




1. 목적
  - 문자열 배열을 글자 단위로 처리 한다.

2. 문제 (점수 : 15 점)
  - 키보드로 문자열을 입력 받되 strlen() 함수를 쓰지 않고 문자의 개수를 출력하며 반대로도 출력한다.
  - 출력 화면

문자열을 입력하세요 : C Programming Language
문자열의 길이 : 22
역순으로 출력 : egaugnaL gnimmargorP C
Press any key to continue

3. 이해
  - 문자열 배열을 정확히 이해하는가?
  - 문자가 저장되는 방식을 이해하는가?
  - 문자를 불러낼수 있는가?

4. 코드

#include <stdio.h>

int main()
{
 char in[255] = {0};
 int length = 0;
 printf("문자열을 입력하세요 : ");
 gets(in);

 while(in[length] != 0) length++;

 printf("문자열의 길이 : %d\n",length);
 printf("역순으로 출력 : ");

 while(length > 0)
 {
  putchar(in[length-1]);
  length--;
 }

 
 putchar('\n');

 return 0;
}

5. 해설
  - 문자열은 문자형 자료를 배열형으로 저장했기 때문에 자유롭게 불러 쓸수 있으며 저장할수 있습니다.
  - 0 값이 NULL 문자로써 문자의 끝을 의미하기 때문에 문자의 경계를 짓는데 중요한 계념을 가집니다.
  - 문자에 대해 잘 다룰수 있으면 string.h 에 있는 함수를 쓰지 않고도 기초적인 문자열을 다룰수 있습니다.

6. 참고
  - http://winapi.co.kr/clec/cpp1/3-5-3.htm : 문자열

Posted by 카켈



1. 목적
  - 문자열에 대한 계념을 잡는다.
  - 문자의 속성에대해 이해한다.

2. 문제 (점수 : 20 점)
  - 문자열을 입력 받아서 대문자는 소문자로 소문자는 대문자로 변환시키는 프로그램을 작성한다.
  - 문자열의 길이 또한 출력한다.
  - 출력화면

문자열을 입력하세요 : Hello ^^ Nice to meet YOU !!
입력된 문자열 : Hello ^^ Nice to meet YOU !!
문자열의 길이 : 28
변환된 문자열 : hELLO ^^ nICE TO MEET you !!
Press any key to continue

3. 이해
  - 문자열을 입력 받을수 있는가?
  - 문자의 속성을 이해하고 변경 할수 있는가?

4. 코드

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

int main()
{
 char in[255];
 int i = 0;
 printf("문자열을 입력하세요 : ");
 gets(in);

 printf("입력된 문자열 : %s\n", in);
 printf("문자열의 길이 : %d\n", strlen(in));
 printf("변환된 문자열 : ");

 while(in[i] != 0)
 {
  if(islower(in[i])) putchar(toupper(in[i]));
  else putchar(tolower(in[i]));
  i++;
 }
 
 putchar('\n');

 return 0;
}

5. 해설
  - 문자열을 받을수 있는 길이를 255 칸으로 한정합니다.
  - gets 으로 문자열을 받습니다. scanf 로 할수 있지만 띄워 쓰기 같은 문자(Whitespace)를 인식
    못하기 때문에 문제가 됩니다.
  - toupper 와 tolower 함수는 각각 대문자와 소문자로 바꾸는 함수 이며 islower 함수는 소문자인지
    아닌지 확인하는 함수 입니다.
  - strlen 함수는 문자열의 길이를 출력하는 함수 입니다.

6. 참고
   - 유사 문제


Posted by 카켈



1. 목적

  - 문자/문자열에 대해 자유롭게 다룰줄 안다.
  - 내림차순의 알고리듬을 이해한다.
  - 문자열을 입력받을줄 안다.
 
2. 문제
  - 이전 문제에서 발전하여 2 문장을 입력받아 조작하여 출력한다.
  - 문자 속성 변경 함수는 ctype.h 에서 문자열 조작 함수는 string.h 에서 받아 쓴다.
  - 영어(알파벳)만 받아서 가공한다.
  - 대문자를 소문자로, 두 문장을 합치기, 알파벳 순으로 큰 값에서 낮은 값으로 3가지 출력을 한다.
  - 출력 예

두개의 문자열을 입력하세요.
첫번째 문자열 : Http://Signal.Korea.Ac.Kr/~ychlee
두번째 문자열 : Http://Cakel.Tistory.com
============================================
새로운 문자열 1 : HttpSignalKoreaAcKrychlee
새로운 문자열 2 : HttpCakelTistorycom
============================================
병합된 문자열 1 : HttpSignalKoreaAcKrychleeHttpCakelTistorycom
대문자로만 변환 : httpsignalkoreaackrychleehttpcakeltistorycom
정렬된 문자열   : yyttttttssrrrppooonmlllkkkiihhhgeeeeccccaaaa
============================================
Press any key to continue

3. 이해
  - 문자와 문자열의 차이를 알고 제대로 썼을까?
  - 이전 문제를 정확히 알고 있었는가?
  - 간단한 알고리듬을 구현할수 있나?

4. 해결코드

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

int main()
{
 char input_1[255], input_2[255], output_1[255], output_2[255];
 char concat[255], sort[255];
 int i = 0;
 int j = 0;
 int length = 0;
 char swap;

 printf("두개의 문자열을 입력하세요.\n");
 printf("첫번째 문자열 : "); gets(input_1);
 printf("두번째 문자열 : "); gets(input_2);
 printf("============================================\n");

 while(input_1[i])
 {
  if ( isalpha(input_1[i]) )
  {
   output_1[j] = input_1[i];
   j++;
  }
  i++;

 }
 output_1[j] = NULL;
 i = 0; j = 0;

 while(input_2[i])
 {
  if ( isalpha(input_2[i]) )
  {
   output_2[j] = input_2[i];
   j++;
  }
  i++;

 }
 output_2[j] = NULL;
 i = 0; j = 0;

 printf("새로운 문자열 1 : %s\n", output_1);
 printf("새로운 문자열 2 : %s\n", output_2);
 printf("============================================\n");

 strcpy(concat,output_1);
 strcat(concat,output_2);

 
 printf("병합된 문자열 1 : %s\n", concat);
 printf("대문자로만 변환 : ");

 while(concat[length])
 {
  sort[length] = tolower(concat[length]);
  putchar(sort[length]);
  length++;

 }
 
 sort[length] = NULL;
 putchar('\n');
 
 for(i = 0; i < length; i++)
 {
  for(j = i + 1; j < length ; j++)
   if(sort[i] < sort[j])
   {
    swap = sort[j];
    sort[j] = sort[i];
    sort[i] = swap;
   }

 }
 
 printf("정렬된 문자열   : %s\n",sort);
 printf("============================================\n");

 return 0;
}

5. 코드해설
  - 이전 문제에서 썼던 islower, toupper 함수를 그대로 활용합니다.
  - 우선 isalpha 함수를 써서 영어인지 받고 난뒤에 저장을 합니다.
  - 두 문장을 합치는 strcat 함수는 string.h 에 저장되어 있습니다.
  - 내림차순 정렬 알고리듬은 앞에 해당하는 문자가 뒤의 값보다 작을 경우(먼저 나오는 문자) swap
    알고리듬을 써서  바꾸는 방식입니다. 간단하게 구현가능해서 함수로 구현하지 않고 inline 으로
    구현했습니다.
  - scanf 로 문장을 받을수 있지만 띄워쓰기에서 문제가 발생하므로 gets 함수를 썼습니다.

6. 추가정보
  - http://www.cplusplus.com/reference/clibrary/cctype/ : ctype 제공 함수(toupper, isalpha, tolower 함수)
  - http://www.winapi.co.kr/clec/cpp1/12-1-2.htm : strcat 함수

Posted by 카켈
이전페이지 1 다음페이지