연재 완료/C Lang 예제코드 모음

C언어 연습문제 풀이 CH8 (1 ~ 11)

라이피 (Lypi) 2018. 5. 24. 23:39
반응형

1. 배열 arr에 {1,3,5,7,9}를 대입하고, 배열요소의 총합을 구하는 프로그램을 포인터를 이용해서 작성하라.

#include <stdio.h>


int main()
{
	int arr[5] = { 1,3,5,7,9 };
	int* iptr = arr;
	int num = sizeof(arr) / sizeof(arr[0]);
	int sum = 0;

	for (int i = 0; i < num; i++) {
		printf("%d", *iptr);
		sum += *iptr++;
		if (i != num) {
			printf(" + ");
		}
		else {
			printf(" = ");
		}
	}

	printf("%d\n", sum);

}


2. 2차원 배열 matrix[5][5]를 선언하고 포인터변수를 이용하여 모든 요소를 0으로 초기화하고... (하략)

#include <stdio.h>
#include <stdlib.h> // system("cls"); 사용

const int C = 5;
const int L = 5;

void init_mat(int *mat);
void print_mat(int *mat);
void sp1_mat(int *mat);
void sp2_mat(int *mat);

int main()
{
	int matrix[C][L];
	
	int select;

	init_mat(&matrix[0][0]);
	print_mat(&matrix[0][0]);

	do {
		printf("1. 예제1 출력 \n");
		printf("2. 예제2 출력 \n");
		printf("3. 초기화 \n");
		printf("4. 작업종료 \n");
		printf("원하는 작업을 선택하세요. \n"); scanf_s("%d", &select);

		switch (select) {
		case 1:
			system("cls");
			init_mat(&matrix[0][0]);
			sp1_mat(&matrix[0][0]);
			print_mat(&matrix[0][0]);
			break;

		case 2:
			system("cls");
			init_mat(&matrix[0][0]);
			sp2_mat(&matrix[0][0]);
			print_mat(&matrix[0][0]);
			break;

		case 3:	
			system("cls");
			init_mat(&matrix[0][0]);
			print_mat(&matrix[0][0]);
			break;

		case 4:
			break;

		default:
			printf("잘못 입력하셨습니다. 다시 입력하세요. \n");
			break;
		}
	} while (select != 4);
}

//int* m_pt = &matrix[0][0];
//int* m_pt = matrix; 가 안되는 이유는 무엇인가?

void init_mat(int *mat) {
	for (int i = 0; i < C*L; i++) {
		*mat++ = 0;
	}

}

void print_mat(int *mat) {
	printf("\n");
	int k = 0;
	for (int i = 0; i < C*L; i++) {
		printf("%2d ", *mat++);
		k++;
		if (k == C) {
			printf("\n");
			k = 0;
		}
	}
	printf("\n");
}

void sp1_mat(int *mat) {
	int k = 0;
	int l = 4;
	int n = 1;

	for (int i = 0; i < C*L; i++) {
		if (i % 5 >= l) {
			*mat = n;
			n++;
		}
		mat++;
		k++;
		if (k == 5) {
			k = 0;
			l--;
		}
	}
}

void sp2_mat(int *mat) {
	int k = 0;
	int l = 4;
	int n = 1;

	for (int i = 0; i < C*L; i++) {
		if (i % 5 <= l) {
			*mat = n;
			n++;
		}
		mat++;
		k++;
		if (k == 5) {
			k = 0;
			l--;
		}
	}
}

// 코드가 너저분... 나중에 정리하자...


3. 다음 코드를 컴파일하고 어떻게 출력되는지 알아보라.

#include <stdio.h>

int main()
{
	char c;
	const char *p;
	p = "WELCOME TO";
	c = 'C';

	printf("%s %s %c %s \n", p, "Visual-", c, "!!!");
}


4. 변수 c에 문자 'A'를 입력한 후 변수 c의 내용과 포인터값(주소)을 출력하는 프로그램을 작성하라.

#include <stdio.h>

int main()
{
	char c = 'A';

	printf("vlaue of c : %c , adress of c : %x \n", c, (unsigned)&c);
}


5. 아래와 같이 변수가 선언되었다고 가정할 때 a) 부터 d)까지 기술된 각 공간의 내용은 무엇인가?


int a[2][3] = { {-3,14,5}, {1,-10,8} };

int *b[] = { a[0], a[1] };

int *p = b[1];


a) *b[1] : 1

b) *(++p) : -10

c) *(*(a+1)+1) : -10

d) *(--p-2) : 14

#include <stdio.h>

int main()
{
	int a[2][3] = { {-3,14,5}, {1,-10,8} };
	int *b[] = { a[0], a[1] };
	int *p = b[1];

	printf("*b[1] : %d \n", *b[1]);
	printf("*(++p) : %d \n", *(++p));
	printf("*(*(a + 1) + 1)) : %d \n", *(*(a + 1) + 1));
	printf("*(--p - 2) : %d \n", *(--p - 2));
}


6. 아래와 같이 변수가 선언되었다고 가정할 때 a) 부터 e)까지 기술된 각 공간의 내용은 무엇인가?


int ar[] = { 10, 15, 4, 25, 3, -4 };

int *p;

p = &ar[2];


a) *(p+1) : 25

b) p[-1] : 15

c) (ar-p) : -2

d) ar[*p++] : 3

e) *(ar+ar[2]) : 3

#include <stdio.h>

int main()
{
	int ar[] = { 10, 15, 4, 25, 3, -4 };
	int *p;
	p = &ar[2];

	printf("*(p+1) = %d \n", *(p + 1));
	printf("p[-1] = %d \n", p[-1]);
	printf("(ar-p) = %d \n", (ar - p));
	printf("ar[*p++] = %d \n", ar[*p++]);
	printf("*(ar+ar[2]) = %d \n", *(ar + ar[2]));
}


7.  정수 데이터 x와 y를 서로 바꾸어 넣는 함수 Swap(px,py)를 작성하라. (하략)

#include <stdio.h>

void Swap(int* px, int* py);

int main()
{
	int n, m;
	printf("Input n : "); scanf_s("%d", &n);
	printf("Input m : "); scanf_s("%d", &m);
	
	printf("Input Value -> n = %d, m = %d \n", n, m);
	Swap(&n, &m);
	printf("After Value -> n = %d, m = %d \n", n, m);

}

void Swap(int* px, int* py)
{
	*px ^= *py;
	*py ^= *px;
	*px ^= *py;
}


8. 문자열 Str에 저장된 메모리 주소와 내용을 화면에 출력하는 함수 StrAddress()를 작성하라.

#include <stdio.h>

void StrAddress(char* str);

int main()
{
	char str[] = "Funny";
	StrAddress(str);
}

void StrAddress(char* str)
{
	while (*str != '\0') {
		printf("Address : %x => %c \n", str, *str);
		str++;
	}
}


9. printf("words = %s", words);와 같은 동작을 하는 함수 output을 작성하라. 

#include <stdio.h>
#include <stdarg.h>

void output(const char* types, ...);

int main()
{
	char words[] = "intranet";
	output("words = %s", words);

}

void output(const char* types, ...)
{
	va_list ap;
	
	const char *pch = types;
	
	const char *spch;

	va_start(ap, types);

	while (*pch) {
		if (*pch == '%') {
			switch (*(++pch)) {
			case 's':
				spch = va_arg(ap, char*);
				while (*spch) {
					putchar(*spch);
					*spch++;
				}
				pch++;
			}
		}
		putchar(*pch);
		++pch;
	}

	va_end(ap);
}

// 정리한 내용에 없던 가변인수 함수를 사용했다.


10. 문자열 String의 뒤에 있는 공백 문자를 없애는 프로그램을 작성하라.

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

void DeleteBlank(char* str);

int main()
{	
	
	char str[] = "De le te!                         ";
	printf("Before String : %s, String length : %d\n", str, strlen(str));
	DeleteBlank(str);
	printf("After String : %s, String length : %d\n", str, strlen(str));
}

void DeleteBlank(char* str)
{
	int temp = 0;

	while (*str != '\0') {
		str++;
	}

	while (*--str == ' ') {
		*str = '\0';
		str--;
	}
}

//*str을 '\0'까지 보냈으면 한칸 당겨서 계산해야지 뭘 했던 것인가...


11. 입력받은 문자열이 회문인지 아닌지 확인하는 프로그램을 작성하라.

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

int palindrome(char* str);

int main()
{	
	char str[200];

	printf("문자열을 입력하세요 : "); scanf_s("%s", str, 200);

	printf("%s \n", palindrome(str) ? "회문입니다." : "회문이 아닙니다.");


}

int palindrome(char* str)
{
	char buff[100];
	int Num = (strlen(str) / 2);
	//strlen()은 unsigned를 리턴한다. 그래서 반복문의 조건으로 달 때 signed와 결과가 다르다.  

	if (strlen(str) % 2 == 0) {
		int i = 0;
		for (i; i < Num; i++) {
			buff[i] = *str++;
		}

		i--;
		for (i; i > 0; i--) {
			if (buff[i] != *str++) {
				return 0;
			}
		}
		return 1;
	} 
	else {
		int i = 0;
		for (i; i < Num; i++) {
			buff[i] = *str++;
		}
		i--;
		str++;
		for (i; i > 0; i--) {
			if (buff[i] != *str++) {
				return 0;
			}
		}
		return 1;
	}
	
}


반응형