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

문제

사용자 삽입 이미지
코드

#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>
#include <vector>

using namespace std;

int main(void)
{
 vector<double> stlVector;
 int i = 0;
 char *sName, *sId;
 char sIn[255] = {0};
 double dIn, dTotal;
 dIn = dTotal = 0.0;
 sName = sId = NULL;

 cout << "학번 : ";
 cin.getline(sIn,255);
 sId = new char[strlen(sIn) + 1];
 strcpy(sId, sIn);

 cout << "이름 : ";
 cin.getline(sIn,255);
 sName = new char[strlen(sIn) + 1];
 strcpy(sName, sIn);

 cout << "네 과목의 성적 : ";
 for(i = 0; i <= 3; i++)
 {
  cin >> dIn;
  stlVector.push_back(dIn);
  dTotal += stlVector[i];

 }
 
 cout << sId << ' ' << sName << " 의 평균 점수는 " << dTotal / i << " 입니다." << endl;
 delete sName, sId;

 return 0;
}

해설
   - vector STL 자료형은 이전 문제에서 자세히 다루었습니다. 참고 하시기 바랍니다.
  - 나머지 부분은 크게 어렵지 않습니다.
  - 문자열 포인터를 생성후 동적으로 입력 받은 글자의 길이만큼 새로 생성하여 추가하는 방식을 썼습니다. 생성 및 삭제에 new / delete 명령어가 쓰입니다.

참고
  - vector STL 다루었던 문제

Posted by 카켈




목적
  - 클래스의 생성자를 이해하고 동적으로 생성한다.
  - 복사 생성자에 대해 이해한다.

문제

사용자 삽입 이미지

코드




해설
  - 이번 문제에선 복사 생성자가 그다지 역할을 하지 않았습니다. 포인터를 쓰기 때문에 의무적으로 적은 거 뿐입니다. 만약 할당 연산자나 복사시 이 생성자는 서로 다른 주소로 자료를 저장하기 위해서 필수적으로 적어 두셔야 합니다.

  - new 로써 동적으로 포인터에 배열을 붙여서 접근을 할수 있습니다. 프로그램 종료시 delete 하여 자원의 낭비를 줄입니다.

  - 마찬가지로 생성시 new 로 문자열을 늘렸기 때문에 소멸시에 delete 로써 문자열을 삭제 합니다. 이는 파괴자(소멸자)에서 그 역할을 할수 있기 기술합니다.

  - CStu[0]->m_ViewProfie() 에서 -> 연산자는 (*CStu[0]).m_ViewProfile() 과 같습니다. 우선순위로 인해 괄호를 넣기가 번거로워서 -> 연산자를 추가했습니다.

참고
  - 객체지향적 프로그래밍은 C++ 기초 다음 단계이므로 차근 차근 공부 하시면 이해하기가 쉽습니다. 구조체를 먼저 이해하시고 클래스를 배우신후 private / public / protect 형 그리고 맴버함수와 변수 생성자와 파괴자 상속과 연산자, 가상함수... 이런식으로 계속 배우시면 됩니다.

  - 유사 문제 검색

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. 문제 (점수 : 15 점)
  - -50 ~ 100 사이의 임의이 값을 5만개 생성하여 배열에 저장하되 배열은 동적 메모리에 할당하여 사용하라.
  - 각 범위 ( -50~0 / 1~50 / 51~100 ) 에 따른 개수와 생성된 난수의 평균 또한 구하여라
  - 출력 화면

-50 ~   0 범위의 개수 : 16823 개
  1 ~  50 범위의 개수 : 16724 개
 51 ~ 100 범위의 개수 : 16453 개

생성된 난수의 평균 : 24.963620
Press any key to continue


3. 이해
  - 난수를 만들 줄 아는가?
  - 동적 할당에 대해 이해하고 생성할줄 아는가?

4. 코드

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{

 int *gen;
 int cMinus, cZero, cFifty, i;
 long total;
 total = cMinus = cZero = cFifty = i = 0;

 srand((unsigned)time(NULL));
 rand();

 gen = (int*)calloc(50000,sizeof(gen));

 while(i<50000)
 {
  gen[i] = (rand() % 151) - 50;
  total += gen[i];
  if(gen[i] >= -50 && gen[i] <= 0) cMinus++;
  if(gen[i] >= 1 && gen[i] <= 50) cZero++;
  if(gen[i] >= 51 && gen[i] <= 100) cFifty++;

  i++;

 }

 printf("-50 ~   0 범위의 개수 : %d 개\n",cMinus);
 printf("  1 ~  50 범위의 개수 : %d 개\n",cZero);
 printf(" 51 ~ 100 범위의 개수 : %d 개\n",cFifty);

 printf("\n생성된 난수의 평균 : %f\n",(float)total/50000);

 gen = NULL;
 free(gen);
 return 0;
}


5. 해설
  - 이전에 공부 한 것이 있어서 쉽게 동적 할당에 대해 접근 할수 있었습니다.
  - calloc 함수로 간단하게 생성했습니다. 보통은 malloc 을 씁니다만 초기화 때문에 calloc 을 썼습니다.
  - 마지막엔 NULL 에 맞추고 free 함수로 동적 할당된 자원을 반환 합니다. 그렇지 않으면 메모리 누수가 발생합니다. 요즘은 메모리 자원이 풍부하여 부족될 일은 자주 없지만 free 함수나 delete (C++) 로 비우는 에티켓이 필요합니다.

6. 참고
  - 유사 문제

Posted by 카켈



1. 목적

  - 필요한 만큼 자료를 정의 하는 동적 할당에 대해 이해한다.
  - 구조체에 따른 자료 구조를 이해한다.

2. 문제 (점수 : 40 점)

 - 학생에 대한 정보(이름,성적)을 구조체로 하여 성적을 입력후 평균을 구하는 프로그램을 작성한다.
  - 키보드로 학생 정보를 입력받는다.
  - 실행화면

학생의 수 : 4
1 번째 학생의 이름과 성적 : 홍길동 67.89
2 번째 학생의 이름과 성적 : 장길산 46.75
3 번째 학생의 이름과 성적 : 너바보 23.79
4 번째 학생의 이름과 성적 : 나잘난 99.84

입력된 학생들에 대한 정보
홍길동 : 67.89
장길산 : 46.75
너바보 : 23.79
나잘난 : 99.84

학생들의 평균 성적 : 59.57
Press any key to continue

3. 이해
  - 구조체를 정확히 이해하는가?
  - 동적할당을 할수 있는가?
 
4. 코드

#include <stdio.h>
#include <stdlib.h>

int main()
{
 struct stu_data
 {
  char name[6];
  float score;
 };

 int i,count;
 float total;
 struct stu_data* stu = NULL;
 
 i = 1;
 count = 0;
 total = 0.0;
 
 printf("학생의 수 : ");
 scanf("%d", &count);

 stu = calloc(count, sizeof(stu));
 while(i<=count)
 {
  printf("%d 번째 학생의 이름과 성적 : ", i);
  scanf("%s %f", stu[i-1].name, &(stu[i-1].score));
  i++;

 }
 
 i = 0;
 
 printf("\n입력된 학생들에 대한 정보\n");
 while(i<count)
 {
  printf("%s : %0.2f\n",stu[i].name, stu[i].score);
  total += stu[i].score;
  i++;
 }

 printf("\n학생들의 평균 성적 : %0.2f\n", total/count);

 stu = NULL;
 free(stu);

 return 0;
}

5. 해설
  - calloc 함수는 C 언어에서 메모리를 할당 받아 변수에게 주는 함수 입니다. malloc 과 유사합니다.
  - while 문으로 자료를 입력 받고 출력합니다.
  - NULL 로 맞춘후에 free 함수로 비우게 합니다.

6. 참고
  - http://www.winapi.co.kr/clec/cpp1/10-3-4.htm : 재할당(malloc, calloc 연관)
  - 네이버 지식인
  - 유사 문제

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