상세 컨텐츠

본문 제목

C 스터디 과제 4

PROGRAMMING/C Mentoring

by koharin 2019. 5. 6. 22:00

본문

728x90
반응형

진도: 7. 문자열과 배열

이번에 배운 내용은 중요하므로 어렵고 논리적인 문제보다는

각 파트에 대한 연습이 필요하다고 생각해서 낸 문제들이다.

이번 과제는 실습문제를 풀면서 문자열 처리함수, scanf, printf 함수만이 아닌 다른 입출력 함수의

연습이 목적이다.

 

[실습 01] 입력받은 문자열을 역순으로 출력하는 프로그램 

 

조건: "문자열 입력: " 부분을 제외하고는 scanf와 printf 함수를 사용하지 않는다.

=> 다른 입출력 함수 사용을 연습하기 위해!

 

 

#include<stdio.h>
#include<string.h>
void main(void)
{
	char str[100];
	int i, len;

	printf("문자열 입력: ");
	gets(str);

	len = strlen(str); //str 길이 구하기, 길이이므로 integer형

	for (i = len - 1; i >= 0; i--) 
	{
		putchar(str[i]);
	}
	puts("\n");
}

 

for문은 항상 증가하는 것이 익숙했을 것.

따라서 역순 출력을 문제로 냈다.

역순 출력은 주의해야 할 것이 인덱스 범위가 0 ~ SIZE-1 이므로

초기식의 인덱스 i가 len - 1부터 시작해야 한다. 

조건식은 처음 원소 위치까지이므로 0 이하까지!

 

문자열 배열에 원소에 문자 하나하나 들어있으므로 

putchar 함수로 간편하게 출력한다. 

(형식문자열을 사용하는 것보다 간략하고 간단하다.)

 

(마지막 newline을 출력하는 puts 함수는 없어도 된다.)

 

scanf 함수와 printf 함수의 사용이 익숙하겠지만(멘토도 그렇다...)

사실 gets, puts, getchar, putchar 함수가 더 간편하다.

따라서 사용 방법만 익히면 어려움 없이 사용하면 된다.

 

 

[실습 02] 2차원 배열의 사용

 

2차원 배열로 선언된 int형 배열의 원소를 입력받고,

각 줄의 원소를 역순으로 출력하는 프로그램

 

조건:

-int형 배열 num 선언

-제 1 크기는 최대 10이고, 3개의 원소씩 갖는다.

-각 행에서 원소를 입력받고 뉴라인 두 줄을 출력할 때 printf문을 사용하지 않음

-출력 시의 각 뉴라인도 printf 함수 사용 X

-한 문장으로 표현

 

 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define SIZE 3
#define MAX 10
void main(void)
{
	int num[MAX][SIZE], i, j, n; //주의: num[][SIZE] = {0};으로 선언해서 0으로 초기화해놓으면 런타임 에러가 생긴다. 따라서 제 1 크기도 max를 지정해놓아야 한다.

	printf("n 입력: "); //같이 나란히 써서 입력받기 위해 printf 함수 사용
	scanf("%d", &n); //문자, 문자열 제외하고는 입력받을 때 scanf 함수 사용

	for (i = 0; i <= n - 1; i++)
	{
		printf("num[%d] 원소 추가\n", n);
		for (j = 0; j <= SIZE - 1; j++)
		{
			printf("num[%d][%d] = ", i, j);
			scanf("%d", &num[i][j]);
		}
		puts("\n");
	}

	puts("[num 역순 출력]");

	for (i = 0; i <= n-1; i++)
	{
		printf("num[%d] 원소: ", i);
		for (j = SIZE - 1; j >= 0; j--) //실습 01에서처럼 역순으로 출력하기 위해 SIZE-1부터 시작, i--
		{
			printf("%d ", num[i][j]); 
		}
		puts("\n");
	}
}

 

puts(“\n”);

puts 함수 특성 상 뉴라인을 출력하므로 

puts  함수 안에 뉴라인을 포함하면 두 줄의 뉴라인을 출력할 수 있다.

 

중첩 for문 사용

바깥 for문은 줄을 나타낸다. 제 1 크기 부분의 인덱스

i번째 줄에 대하여 0,1,2 인덱스(j)의 원소의 값을 입력받는다.

출력시에는 바깥 for문은 똑같지만, 원소를 각 줄마다 역순 출력하므로

실습 01 문제처럼 for문을 만들어준다.

 

실습 중에 런타임 에러가 생길 수 있다. (조건을 줬기  때문에 안 생길수도...)

런타임 에러: Stack around the variable '변수이름' was corrupted.

 

사용자가 선언한 배열보다 큰 값을 넣으려고 할 때,

원래 의도한 크기의 자료형보다 더 큰 자료형의 데이터를 넣으려고 했을 때,

오타로 인해 의도치 않은 데이터가 들어갔을 때 발생

arr[][SIZE]={0};로 선언해서 문제가 생긴 것이다.

 

따라서 0으로 초기화하지 않고 제 1 크기의 MAX를 설정해놓는다. (그래야 오류가 안 생김)

 

해결: arr[MAX][SIZE];

이런 문제가 안 생기도록 제 1 크기를 최대 10으로 설정했다. 

(제 1 크기가 있으면 0으로 초기화 안 해도 되므로)

 

[실습 03] 문자열 처리 함수

 

 

 

 

문자열 처리 함수의 사용을 연습하는 문제.

아주 간단하게 어려움 없이 풀 수 있었을 것이다.

 

 

#include<stdio.h>
void main(void)
{
	char str1[30], str2[30];

	printf("str1 입력: ");
	scanf("%s", str1);
	printf("str2 입력: ");
	scanf("%s", str2);

	puts("[strcmp 사용]");
	if (strcmp(str1, str2) == 0)
	{
		puts("같습니다");
	}
	else
	{
		puts("다릅니다.");
	}
	printf("\n");
	puts("[strcat 사용]");
	strcat(str1, str2);
	puts(str1);
	puts(str2);
	puts("\n");
	puts("[strcpy 사용]");
	strcpy(str2, str1);
	puts(str2);
}

 

 

 

728x90
반응형

'PROGRAMMING > C Mentoring' 카테고리의 다른 글

C 스터디 과제5  (0) 2019.05.13
C 스터디 과제 03  (0) 2019.04.09
C 스터디 과제02  (0) 2019.04.04
C 스터디 과제01  (0) 2019.04.04

관련글 더보기