본문 바로가기
흔한 학교 생활/든든한 C 프로그래밍

[C언어] 든든한 C 프로그래밍 3판 10장 워크북 답 풀이

by 흔한 학생 2023. 7. 9.
반응형

1. level 1-1

실행결과를 기술하라

dnum의 주소를 포인터 dp에 저장

*dp=1.5; 로 1.5가 저장되었고 다음 코드로 1.5가 다시 더해져 dnum의 값은 3.0이 된다.

dnum: 3.0, *dp: 3.0

 

2. level 1-2

문자 배열에 저장된 문자열을 포인터를 사용해 한 문자씩 출력하는 프로그램

 

사실 printf 할때 언제* 붙이고 안붙이는지 잘 모르겠다

문자 배열에는 *ptr 을 쓰는구나

그리고 while 문 안에 코드 두 줄이 들어가있는데 한줄만 썼다

#include <stdio.h>
#include <string.h>
#pragma warning(disable:4996)

int main()
{
	char msg[100] = "Hello World !!!";
	char* ptr;

	printf("msg : %s \n", msg);

	ptr = msg; //포인터 변수에 msg 배열 주소 저장
	while (*ptr)
	{
		printf("%c ", *ptr++);
	}
	printf("\n");

	return 0;
}

결과

msg : Hello World !!!
H e l l o   W o r l d   ! ! !

3. level 2-1

str 문자배열의 문자열을 tmp 문자배열에 복사하는 프로그램

(strcpy()사용 불가, 문자열 복사 시 포인터 변수 활용)

 

마찬가지로 while문에 두 줄을 넣어야하는데 한 줄로만 완성했다.

마지막 *to에 \0 으로 null 문자를 추가할 때 "\0" 으로 대입해 실행에 실패했다.

*to = '\0'; 로 작은 따옴표를 이용해야했다.

#include <stdio.h>
#include <string.h>
#pragma warning(disable:4996)

int main()
{
	char str[50] = "Multi Campus.", tmp[50];
	char* from, * to;

	from = str;
	to = tmp;

	while (*from)
	{
		*to++ = *from++;
	}
	*to = '\0'; //NULL 문자 추가

	printf("str: %s, tmp: %s \n", str, tmp);

	return 0;
}

결과

str: Multi Campus., tmp: Multi Campus.

반응형

4. level 2-2

str 배열에 저장된 문자열을 역순으로 출력하는 프로그램

 

이번에도 역시 while문의 두줄짜리 문제를 한 줄로만 해결했다

 

ptr에 시작 주소를 str의 마지막 문자의 주소로 저장해야하는 문제다.

이때 다른 방법이 기억나지 않아 그냥 &str[12] 로 주소를 지정해줬다...

다른 방법 있으면 댓글 바람

#include <stdio.h>
#include <string.h>
#pragma warning(disable:4996)

int main()
{
	char str[50] = "Multi Campus.", tmp[50];
	char* ptr;

	printf("str : %s \n", str);

	printf("str 역순 : ");
	ptr = &str[12]; //시작주소 저장
	while (ptr>=str) //반복할 조건
	{
		printf("%c ", *(ptr--));
	}
	printf("\n");

	return 0;
}

 

결과

str : Multi Campus.
str 역순 : . s u p m a C   i t l u M

5. level 3-1

#include <stdio.h>
#include <string.h>
#pragma warning(disable:4996)

int main()
{
	double dNum[5], dSum = 0.0;
	double* ptr;
	int i, size;

	size = sizeof(dNum) / sizeof(dNum[0]);
	ptr = dNum;
	for (i = 0; i < size; i++)
	{
		printf("%d, 실수 입력? ", i + 1);
		scanf("%lf", ptr + i);
		dSum += *(ptr + i);
	}
	printf("\n입력된 dNum 배열 데이터 \n");
	for (i = 0; i < size; i++)
		printf("%.2lf, ", dNum[i]);
	printf("\ndNum 배열의 합: %.2lf \n", dSum);

	return 0;
}

결과

1, 실수 입력? 5.1
2, 실수 입력? 6.1
3, 실수 입력? 7.1
4, 실수 입력? 8.1
5, 실수 입력? 9.1

입력된 dNum 배열 데이터
5.10, 6.10, 7.10, 8.10, 9.10,
dNum 배열의 합: 35.50

6. level 3-2

실행결과를 기술하라

 

msg 배열에는 C Programming. 이 들어있다.

func1 함수를 실행하고 msg를 printf 한다.

func1 함수는 주소를 받아 배열의 문자가 알파벳 대문자일 경우 소문자로 바꿔준다.

 

따라서 결과는

c progrmming.

이다.

 

7. level 3-3

실행결과를 기술하라

 

num 배열에 100, 200,...500 을 저정하고 Func1 함수를 실행했다.

Func1 함수는 배열을 받아 주소 사이즈를 출력한다.

그리고 다섯번 반복하며 배열을 출력한다.

 

따라서 결과는

tmp sizeof : 8
100, 200, 300, 400, 500,

이다.

 

○문제에서 i를 왜 선언했는지 모르겠다. int i 는 필요없다.

반응형