본문 바로가기
College Computer Science/C Language

[C 프로그래밍 실습] 반복 / 포인터 기초 (Lab 03)

by 2den 2020. 10. 27.
728x90

<Lab 03 문제 유형 요약>

 

  • Program 1 : while(1) 반복문, break
  • Program 2 : for 반복문, continue, break
  • Program 3 : while 반복문
  • Program 4 : while, for 반복문 / 비트 연산자 (>>) 사용하여 정수 32비트로 출력
  • Program 5 : 16진수 비트 연산 (&, |, ^)
  • Program 6 : int형 포인터
  • Program 7 : char형 포인터, 포인터 이동 / 16진수 바이트 단위 출력
  • Program 8 : double형 포인터
  • Program 9 : 8바이트 double형 변수 4바이트 int형 포인터로 나눠 int형 변수 저장
  • Program 10 : 문자열 포인터 / 대문자, 소문자, 숫자, 특수문자 개수 구하기

 

 


 

Program 1

 

표준입력으로 받은 두개의 양의 정수의 합을 계산하여 출력하는 프로그램을 작성하시오.  
양의 정수가 아니면 다시 입력 받도록 하시오.

 

  • 입력은 정수만 입력 된다고 가정한다.

#include <stdio.h>

int main()
{
	int a, b;

	while (1)
	{
		printf("두개의 양의 정수를 입력하시오 >>");
		scanf("%d %d", &a, &b);

		if (a > 0 && b > 0) {
			printf("두 정수의 합은 %d 입니다.\n", a + b);
			break;
		}

		printf(">> 양의 정수가 아닙니다. 다시 입력하시오.\n");
	}

	return 0;
}

 

 

 

Program 2

 

1부터 100까지 정수 중에서 소수(prime number)를 출력하는 프로그램을 작성하시오.

 

  • 소수는 약수가 1과 자신 뿐인 수
  • 2에서부터 자기 자신까지 수로 나누어 떨어지지 않는 수
#include <stdio.h>

int main()
{
	int j;

	for (int i = 1; i < 101; i++)
	{
		if (i == 1) continue;
		else if (i == 2) {
			printf("%d ", i);
			continue;
		}

		for (j = 2; j < i; j++)
		{
			if (i % j == 0) break;
		}

		if (j == i) printf("%d ", i);
	}

	return 0;
}

 

 

 

Program 3

 

표준입력으로 입력한 정수에서 각각의 자리에 해당하는 수를 반대로 출력하는 프로그램을 반복문을 이용하여 작성하시오.

#include <stdio.h>

int main()
{
	int input = 0, output = 0;
	
	printf("반대로출력할정수를입력 >> ");
	scanf("%d", &input);

	while (1)
	{
		output = output * 10 + input % 10;
		input /= 10;
		if (input == 0) break;
	}

	printf("입력한수를반대로출력 >>> %d \n", output);
	return 0;
}

 

 

 

Program 4

 

정수를 입력 받아 32비트의 비트 정보를 모두 출력하는 프로그램을 작성하시오.

 

  • 입력 받은 정수가 0이면 종료하고 0이 아니면 프로그램을 계속 수행한다.

#include <stdio.h>

int main()
{
	int input;

	while (1)
	{
		printf("정수를 입력하시오 >> ");
		scanf("%d", &input);

		if (input == 0) break;

		for (int i = 0; i < 32; i++)
		{
			printf("%d", (input >> (31 - i)) & 1);
		}
		printf("\n\n");
	}

	return 0;
}

 

 

 

Program 5

 

두개의 16진수를 입력으로 받아 비트 연산을 수행하는 계산기 프로그램을 쓰시오. 연산자는 &, |, ^ 이다. 

 

  • 16진수는 4자리로 입력하고 4자리보다 크면 다시 입력 받도록 한다.

#include <stdio.h>

int main()
{
	int a, b;
	char c;

	while (1)
	{
		printf("16진수(4자리) 두개를 입력하시오 >> ");
		scanf("%x %x", &a, &b);

		if (a > 0xffff || b > 0xffff)
		{
			printf("??? 다시~\n");
			continue;
		}

		int i = 1;
		while (i)
		{
			printf("연산자를 입력하시오[&, |, ^] : ");
			scanf(" %c", &c);

			switch (c)
			{
			case '&':
				printf("연산 결과: 0x%x", a & b);
				i = 0;
				break;
			case '|':
				printf("연산 결과: 0x%x", a | b);
				i = 0;
				break;
			case '^':
				printf("연산 결과: 0x%x", a ^ b);
				i = 0;
				break;
			default:
				printf("??? 연산자 다시~\n");
				break;
			}
		};

		printf("\n\n");
	}

	return 0;
}

 

 

 

Program 6

 

다음을 참고로 int 형 포인터에 관한 프로그램을 작성하시오.

 

  • 두 정수를 저장하기 위해 변수를 선언하여 각각 10, 20을 저장하고, 두 변수의 주소 값을 저장하는 포인터 두 개를 선언하여 저장
  • 다음 변수 sum과 이중 포인터 변수 dp를 선언한 후 dp와 p1, p2 그리고 sum 만을 사용하여 data1에는 100을 data2에는 200을 저장한 후 위의 두 변수의 합을 변수 sum에 저장하여 출력
#include <stdio.h>

int main()
{
	int data1 = 10, data2 = 20;
	int* p1 = &data1, * p2 = &data2;
	int sum = 0;
	int** dp;

	dp = &p2;
	*p1 = 100;
	**dp = 200;
	sum = *p1 + *p2;

	printf("%d", sum);

	return 0;
}

 

 

 

Program 7

 

다음과 같이 int 형 변수 value에 0x2F24263F를 정의한 후, char * 변수 pc를 선언하고, pc 변수를 이용하여 value의 저장 값을 각각 byte 단위로 인지하여 각각의 문자를 출력하는 프로그램을 작성하시오.

 

  • value n = 0x2F24263F;
  • 각각 2F는 문자 ‘/’, 24는 ‘$’, 26은 ‘&’, 3F는 ‘?’이며, 순서는 이의 역순으로 출력, 즉 ? & $ / 순으로 출력하며, 각각의 주소 값도 출력하도록 한다.
#include <stdio.h>

int main()
{
	int value = 0x2F24263F;
	char* pc = &(char)value;

	// little endian
	for (int i = 0; i < 4; i++) {
		printf("%c ", *(pc + i));
	}
	printf("\n");

	return 0;
}

 

 

 

Program 8

 

다음을 참고로 표준입력으로 받은 double 형의 두 실수의 사칙연산을 수행하는 프로그램을 작성하시오.

 

  • 두 개의 double 형 변수와 포인터 변수를 선언 double x, y;
  • 포인터 변수를 이용하여 표준 입력을 받아 두 실수에 대한 사칙연산을 수행 double *px; double *py;

#include <stdio.h>

int main()
{
	double x, y;
	double* px = &x;
	double* py = &y;

	printf("두 실수 입력: ");
	scanf("%lf %lf", px, py);

	printf("%.2lf + %.2lf = %.2lf\n", *px, *py, *px + *py);
	printf("%.2lf - %.2lf = %.2lf\n", *px, *py, *px - *py);
	printf("%.2lf * %.2lf = %.2lf\n", *px, *py, *px * *py);
	printf("%.2lf / %.2lf = %.2lf\n", *px, *py, *px / *py);

	return 0;
}

 

 

 

Program 9

 

다음을 참고로 표준입력으로 받은 int 형의 두 정수의 사칙연산을 수행하는 프로그램을 작성하시오.

 

  • double 형 변수의 8바이트 저장 구조를 각각 4바이트의 저장 구조로 생각해서 표준입력으로 받은 두 정수를 저장
  • 두 정수에 대하여 사칙연산을 수행
  • double input; int *p = (int *)&input;

#include <stdio.h>

int main()
{
	double input;
	int* p = (int*)&input;

	printf("두 정수 입력: ");
	scanf("%d %d", p, p + 1);

	printf("%d + %d = %d\n", *p, *(p + 1), *p + *(p + 1));
	printf("%d - %d = %d\n", *p, *(p + 1), *p - *(p + 1));
	printf("%d * %d = %d\n", *p, *(p + 1), *p * *(p + 1));
	printf("%d / %d = %d\n", *p, *(p + 1), *p / *(p + 1));

	return 0;
}

 

 

 

Program 10

 

다음과 같이 주어진 문자열의 대문자, 소문자, 숫자, 특수문자가 각각 몇 개인지 구하는 프로그램을 쓰시오.

 

  • char *str = "abC*12dE3%4";
  • 아래 출력 예를 참고하여 출력 결과를 나타내시오.
  • 문자열 연산 library 함수를 사용 금지

#include <stdio.h>

int main()
{
	char* str = "abC*12dE3%4";
	int integer = 0, capital = 0, small = 0, character = 0;

	printf("문자열 ");

	for (int i = 0; *(str + i); i++)
	{
		if ('0' <= *(str + i) && *(str + i) <= '9') integer++;
		else if ('A' <= *(str + i) && *(str + i) <= 'Z') capital++;
		else if ('a' <= *(str + i) && *(str + i) <= 'z') small++;
		else character++;

		printf("%c", *(str + i));
	}

	printf("\n");
	printf("대문자는 %d개\n", capital);
	printf("소문자는 %d개\n", small);
	printf("숫자 %d개\n", integer);
	printf("특수문자 %d개\n", character);
	printf(">>> 전체 문자수는 %d개입니다.\n", capital + small + integer + character);

	return 0;
}

 

728x90

댓글