chapter01 C++ 시작

연습문제

1. 2

2. 4

3. 4

4. 2

5. 3

6. 2

7. 1

8. 4

9. c, 캡슐화

10. 2

11. 3

12. 

(1). TV 객체는 TV class를 통해 캡슐화된 틀에 의해서 만들어진 실체다. TV객체의 변수를 private으로 설정하고 TV객체의 함수를 public으로 설정하여 외부의 접근으로 부터 멤버변수를 보호할 수 있다.  

(2). >연산자는 정수의 비교로 사용되는것 뿐만아니라 다른 피연산자를 받아 다른 기능으로 작동할 수 있다. 

(3). 생물의 특성을 메뚜기라는 객체가 모두 상속받는다. 

13. 함수중복 function overloading

14. 4

15. 3

16. 1

17. 3

18. 컴파일된 obj파일에서 참조되어있는  c++라이브러리내용들을 모아 하나의 실행파일로 만드는 과정이다.

19. 4 

20. 1

21. 제네릭, 제네릭, 제네릭 프로그래밍, 절차지향, 객체지향

22. c++ 소스프로그램 작성 및 편집, 컴파일, 링킹, 실행, 디버깅등 c++프로그래밍 개발의 모든 단계를 지원하는 것. 예를들어 visual studio

실습문제

1. 그대로 함

2. 그대로 함. 근데 같은 솔루션안에 두개의 프로젝트를 만들고 그 안에 소스파일을 만든거라 각각 실행이안되는 문제 발생.

요렇게 됨

그때는 솔루션에 마우스오른쪽 버튼 눌러서 속성 들어가가지구

형광펜 친것 대로 원하는 프로젝트 설정해서 실행하면 됨. 

3.

#include <iostream>

int main()
{
	int sum = 0;
	for (int i = 1; i <= 10; i++)
		sum += i;
	std::cout << "결과는 "<< sum << "입니다.";
	return 0;
}

4.

#include <iostream>

int main()
{
	for (int i = 1; i <= 4; i++)
	{
		for (int j = 1;j<=i;j++)
		{
			std::cout << "*";
		}
		std::cout << "\r\n";
	}
	
}

 

chapter 13 파일처리와 전처리기 496p 실전예제

내답: 어딘가 엉성한 그녀의 코드

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>

void main()
{
	FILE* Cf = fopen("C:\\Windows\\win.ini", "rb");
	char str[1024];

	if (Cf)
	{
		int start = ftell(Cf); //0
		fseek(Cf, 0, SEEK_END);
		int end = ftell(Cf);//124
		fseek(Cf, 0, SEEK_SET);
		fread(str, 1, (end - start), Cf);

		FILE* Df = fopen("D:\\win.ini", "wb");
		fwrite(str, 1, (end - start), Df);
	}
}

해답: 사용메모리 최소화

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>
#include <string.h>

void main()
{
	FILE* fsrc = fopen("C:\\Windows\\win.ini", "rb");

	if (fsrc)
	{
		FILE* fdest = fopen("D:\\win.ini", "wb");
		if (fdest)
		{
			char buf[32];
			while (1)
			{
				int r = fread(buf, 1, sizeof(buf), fsrc);
				if (r)
				{
					fwrite(buf, 1, r, fdest);
				}
				else
					break;
			}
			fclose(fdest);
		}
		else
		{
			printf("Write Error: %d, %s", errno, strerror(errno));
		}
		fclose(fsrc);
	}
	else
		printf("Write Error: %d, %s", errno, strerror(errno));
}

 

502p chapter 13 파일처리와 전처리기 연습문제

1. #include

2. FILE* (파일포인터)

3. 3

4. 1

5. 2

6. 2

7. 파일크기가 2GB를 넘어가는 경우때문에

8. \n으로 구분하고 \n을 포함한다.

9. #include는 포함한 파일의 내용을 그대로 #include 지시문과 교체하기때문에 헤더파일에 함수나 객체를 정의하게 되면 재정의 오류가 난다.  

10.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>
#include <string.h>

int GetSize(const char* path)
{//경로를 인자로 받아 파일의 크기를 반환하는 함수
	FILE* f = fopen(path, "rb");
	int start = ftell(f);
	fseek(f, 0, SEEK_END);
	int end = ftell(f);
	if (end - start > 2000000)
		return -1;
	return end - start;
}


void main()
{
	printf("Byte: %d",GetSize("D:\\win.ini"));
}

11.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>
#include <string.h>

int GetLines(const char* path)
{// 몇 줄로 되어있는지 반환하는 함수
	FILE* f = fopen(path, "rb");
	char str[1024];
	int count = 0;
		fread(str, 1, sizeof(str), f);
		for(int i = 0; i < 1024; i++)
		{
			if (str[i] == '\n')
				count++;
		}
		return count;
}

void main()
{
	printf("줄 수: %d", GetLines("D:\\TestFile.txt")+1);
}

fread로 만들어봤는데 너무 구려서 다시 만들어봄. 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>
#include <string.h>

int GetLines(const char* path)
{// 몇 줄로 되어있는지 반환하는 함수
	FILE* f = fopen(path, "rb");

	int count = 0;
	while (f)
	{
		 int a = fgetc(f);
		 if (a == '\n')
			 count++;
		 else if (a == EOF)
			 break;
	}
	return count;
}

void main()
{
	printf("줄 수: %d", GetLines("D:\\win.ini") + 1);
}

훨씬 낫네...

12. 이코드의 단점은  fputs로 직접 텍스트를 입력해야 정상적으로 출력된다는것. 안그럼 오류난다 ㅎ 

그리고 나는 감으로 코딩을 하기 때문에 다시 풀수 있을것같지 않다.. 얻어걸린거 ㅅ같다....

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>
#include <string.h>


int PrintLine(const char* path, int line)
{// 텍스트파일의 경로와 줄 번호를 인자로 받아서 해당 파일의 줄 번호에 해당하는 줄을 출력
	FILE* f = fopen(path, "wb+");
	// fgets는 파일 위치 표시자의 위치부터 한줄을 읽은후 문자배열에 저장...
	// 파일 위치 표시자 = '\n'의 다음 부터 그 다음 '\n'까지 읽는다. 

	fputs("logically\r\nThinking\r\nYou can do it", f);
	int seek = SEEK_SET;
	char str[128];
	for(int i =0; i<=line;i++)
	{
		fseek(f, 0, seek);
		fgets(str, sizeof(str), f);
		seek = SEEK_CUR;
		if (i==line)
		{
			printf("%s", str);
		}
	}
	fclose(f);
}

void main()
{
	PrintLine("D:\\TestFile.txt",1);
}

 

13. 하 문제가 몬 소린지 아예 모르겠음..

 

<달력출력>

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>
#include <string.h>
#include <time.h>

int GetWDay(int year, int month, int day)
{
	struct tm t;
	memset(&t, 0, sizeof(t));

	t.tm_year = year - 1900;
	t.tm_mon = month - 1;
	t.tm_mday = day;
	mktime(&t);

	return t.tm_wday;
}

int GetLastDay(int year, int month)
{
	int lastday[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };

	int Leap = 0;
	if (month == 2)
	{
		if (year % 400 == 0)
			Leap = 1;
		else if (year % 100 == 0)
			Leap = 0;
		else if (year % 4 == 0)
			Leap = 1;
	}

	return lastday[month - 1] + Leap;

}

void PrintCalendar(int year, int month)
{
	printf("          %d년 %d월\r\n", year, month);
	printf("  --------------------------\r\n");
	printf("  일  월  화  수  목  금  토\r\n");
	printf("  --------------------------");

	int wday = GetWDay(year, month, 1);
	int lastday = GetLastDay(year, month);

	for (int i = 0; i < wday + lastday; i++)
	{
		if (i % 7 == 0)
			printf("\r\n");

		int day = i - wday + 1;
		if (day > 0)
			printf("%4d", day);
		else
			printf("%s", "    ");
	}
}

int main()
{
	int year, month;

	do
	{
		printf("연도를 입력하세요 > ");
		scanf("%d", &year);
	} while (year < 1);

	do
	{
		printf("월을 입력하세요 > ");
		scanf("%d", &month);
	} while (month < 0);

	printf("\r\n");

	if (month == 0)
	{
		for (int i = 1; i <= 12; i++)
		{
			PrintCalendar(year, i);
			printf("\r\n\r\n");
		}
	}
	else
		PrintCalendar(year, month);
}

 

<문자열 검색>

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

int main()
{
	char path[256];
	char find[64];

	printf("파일 경로를 입력하세요 > ");
	scanf("%s", path);

	printf("찾을 문자열을 입력하세요 > ");
	scanf("%s", find);

	FILE* f = fopen(path, "rb");

	if (f)
	{
		int rownum = 0;
		int findnum = 0;
		char str[1024];
		while (1)
		{
			rownum++;

			int r = fgets(str, sizeof(str), f);//파일위치표시자의 현재위치에서 파일을 읽으므로
			// 이렇게 반복되면 자동으로 다음 줄을 읽게됨...
			if (r)
			{
				if (strstr(str, find))
				{
					printf("%d. %s", rownum, str);
					findnum++;
				}
			}
			else
			{
				break;
			}
		}
		fclose(f);

		if (!findnum)
			printf("Not Found!");
	}
	else
		printf("Read Error: %d, %s", errno, strerror(errno));
}

<로또번호 생성 프로그램>

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

int main()
{
	int count = 0;
	char lotto[45] = { 0 };

	srand(time(NULL));
	while (1)
	{
		int num = rand() % 45 + 1;

		if (!lotto[num - 1])
		{
			lotto[num - 1] = 1;
			count++;

			if (count == 6)
			{
				break;
			}
		}
	}

	for (int i = 0; i < 45; i++)
	{
		if (lotto[i])
			printf("%d ", i + 1);
	}
}

 

난생처음 c 프로그래밍 끝. 

'IT공부 > C언어' 카테고리의 다른 글

1/3 난생처음 C프로그래밍  (2) 2024.01.03
1/2 난생처음 C프로그래밍  (2) 2024.01.02
2024 1/1 난생처음 C프로그래밍  (0) 2024.01.01
12/31 난생처음 C 프로그래밍  (0) 2023.12.31
12/30 난생처음 C프로그래밍  (0) 2023.12.30

LAB 13-3

내답: 왜케.. 어렵냐.. 에휴 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <errno.h>
#include <string.h>

int main()
{
	FILE* f = fopen("C:\\Windows\\win.ini", "rb");

	char str[40] = { 0 };
	int end = 0;
	int count = 1;
	if (f)
	{
		while (1)
		{
			fseek(f, end, SEEK_SET);
			fgets(str, sizeof(str), f);
			printf("read: %s ", str);
			end = ftell(f);
			count++;
			if(count == 6 )
				break;
		}
		fclose(f);
	}
	else
		printf("Error: %d, %s", errno, strerror(errno));
}

해답:  내 코드 구려

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <errno.h>
#include <string.h>

int main()
{
	FILE* f = fopen("C:\\Windows\\win.ini", "rb");

	if (f)
	{
		char str[128];
		while (1)
		{
			int r = fgets(str, sizeof(str), f);
			if (r)
			{
				printf("%s", str);
			}
			else
			{
				break;
			}
		}
		fclose(f);
	}
	else
		printf("Error: %d, %s", errno, strerror(errno));
}

근데 이렇게 하면 결괏값이 책이랑 다른뎅..... ㅠㅠ

LAB 13-4 

내답: 굉장히 원시적임

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
#ifndef ENG
	printf("%s", "난생처음 C 프로그래밍");
#else
	printf("%s", "C programming for the first time in my life");
#endif
}

해답:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
#ifdef ENG
	const char* title = "C programming for the first time in my life";
#else
	const  char* title = "난생처음 C 프로그래밍";
#endif

	printf("%s", title);
}

chapter12 구조체 연습문제 454p 

1. struct [tagname] , typedef

2. 피연산자

3. 구조체 객체, 구조체 포인터, 멤버

4. 패딩, sizeof

5. 공용체, 공용체, union

6. 일반변수는 타입한개만을 정의할수 있고, 구조체는 각각 다른 여러개의 타입을 한번에 정의할 수 있다. 또한 일반변수는 타입만큼이 크기인데 구조체는 패딩이 있어 타입들을 다 더한 크기보다 크다. 

7. 20 8

8. 4, 구조체는 비교연산자의 피연산자로 불가 

9. 2, 구조체는 함수의 인자로 사용될경우 값전달방식으로 동작해서 멤버들의 값이 그대로 복사되어 별개의 객체가 됨.

10. 2,3,4,7

11

(1). 

(2).

(3). 내 코드 구리겠지..? 구릴거야...

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>
typedef enum
{
	TAEKWONV,
	MAZINGER,
	MECHANDV,
	GRANDIZER
}RType;

typedef struct
{
	RType type;
	int height;
	int weight;
	int hpower;
}Robot;

void ShowRobot(Robot* robot)
{
	for (int i = 0; i < 4; i++)
	{
		switch ((robot + i)->type)
		{
		case TAEKWONV:
			printf("이름: 태권브이\r\n"); break;
		case MAZINGER:
			printf("이름: 마징가\r\n"); break;
		case MECHANDV:
			printf("이름: 메칸더브이\r\n"); break;
		case GRANDIZER:
			printf("이름: 그랜다이저\r\n"); break;
		}
		printf("신장: %d\r\n", (robot + i)->height);
		printf("무게: %d\r\n", (robot + i)->weight);
		printf("마력: %d\r\n", (robot + i)->hpower);
		printf("---------------\r\n");
	}
}

void ShowAvg(Robot arr[4])// 포인터 Robot* arr 임
{
	double Ave_Height = (double)(arr->height + arr[1].height + arr[2].height + arr[3].height) / 4;
	double Ave_Weight = (double)(arr->weight + arr[1].weight + arr[2].weight + arr[3].weight) / 4;
	double Ave_Hpower = (double)(arr->hpower + arr[1].hpower + arr[2].hpower + arr[3].hpower) / 4;
	printf("평균 신장: %f\r\n", Ave_Height);
	printf("평균 무게: %f\r\n", Ave_Weight);
	printf("평균 마력: %f\r\n", Ave_Hpower);
}

void main()
{
	Robot* pack = malloc(sizeof(Robot) * 4);	
	pack->type = TAEKWONV;
	pack->height = 18;
	pack->weight = 80;
	pack->hpower = 3000;

	(pack+1)->type = MAZINGER;
	(pack + 1)->height = 17;
	(pack + 1)->weight = 70;
	(pack + 1)->hpower = 2500;

	(pack + 2)->type = MECHANDV;
	(pack + 2)->height = 20;
	(pack + 2)->weight = 120;
	(pack + 2)->hpower = 3500;

	(pack + 3)->type = GRANDIZER;
	(pack + 3)->height = 22;
	(pack + 3)->weight = 150;
	(pack + 3)->hpower = 5000;

    ShowRobot(pack);

	ShowAvg(pack);

	free(pack);	
}

 

'IT공부 > C언어' 카테고리의 다른 글

1/4 난생처음 C 프로그래밍  (2) 2024.01.04
1/2 난생처음 C프로그래밍  (2) 2024.01.02
2024 1/1 난생처음 C프로그래밍  (0) 2024.01.01
12/31 난생처음 C 프로그래밍  (0) 2023.12.31
12/30 난생처음 C프로그래밍  (0) 2023.12.30
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<malloc.h>

typedef struct
{
	char gender;
	char name[9];
	int age;
	int salary;
	int serial;
	char enabled;
}PersonInfo;

int g_Index = 0;
int g_Serial = 0;
PersonInfo* g_Arr[1024];
void Register(PersonInfo* pPerson)
{
	pPerson->serial = g_Serial++;
	pPerson->enabled = 1;
	g_Arr[g_Index++] = pPerson;
}

int main()
{
	PersonInfo* p = malloc(sizeof(PersonInfo));

	printf("성별(1:남성, 2:여성)을 입력하세요 > ");
	scanf("%c", &p->gender);

	printf("이름을 입력하세요 > ");
	scanf("%s", p->name);

	printf("나이를 입력하세요 > ");
	scnaf("%d", &p->age);

	printf("연소득(만원)을 입력하세요 > ");
	scanf("%d", &p->salary);
}

LAB 12-4 

내답: 답도 아님 다 틀림 뭐 어떻게 하는지 하나도 모르겠음. 어렵다...

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<malloc.h>

typedef struct
{
	char gender;
	char name[9];
	int age;
	int salary;
	int serial;
	char enabled;
}PersonInfo;

int g_Index = 0;
int g_Serial = 0;
PersonInfo* g_Arr[4];

void Register(PersonInfo* pPerson)
{
	pPerson->serial = g_Serial++;
	pPerson->enabled = 1;
	g_Arr[g_Index++] = pPerson;
	if (!((g_Index+1) % 4))
		PersonInfo* g_Arr[g_Index/4] = realloc(g_Arr[0], sizeof(PersonInfo*) * 4 * (g_Index / 4));
	
}

int main()
{
	PersonInfo* p = malloc(sizeof(PersonInfo));

	printf("성별(1:남성, 2:여성)을 입력하세요 > ");
	scanf("%c", &p->gender);

	printf("이름을 입력하세요 > ");
	scanf("%s", p->name);

	printf("나이를 입력하세요 > ");
	scanf("%d", &p->age);

	printf("연소득(만원)을 입력하세요 > ");
	scanf("%d", &p->salary);

	Register(p);
}

해답:이중포인터등장, 포인터는 첨자연산자로 배열처럼 사용할 수 있다. 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<malloc.h>

typedef struct
{
	char gender;
	char name[9];
	int age;
	int salary;
	int serial;
	char enabled;
}PersonInfo;

int g_PIIndex;
int g_PISize = 4;
int g_Serial;
PersonInfo** g_pPI;

void Register(PersonInfo* pPerson)
{
	if (!g_pPI)
		g_pPI = malloc(sizeof(PersonInfo*) * g_PISize);// void 포인터형 반환 

	pPerson->serial = g_Serial++;
	pPerson->enabled = 1;

	if (g_PIIndex > g_PISize)
	{
		g_PISize += 4;
		g_pPI = realloc(g_pPI, sizeof(PersonInfo*) * g_PISize);
	}

	g_pPI[g_PIIndex++] = pPerson;

}

int main()
{
	PersonInfo* p = malloc(sizeof(PersonInfo));

	printf("성별(1:남성, 2:여성)을 입력하세요 > ");
	scanf("%c", &p->gender);

	printf("이름을 입력하세요 > ");
	scanf("%s", p->name);

	printf("나이를 입력하세요 > ");
	scanf("%d", &p->age);

	printf("연소득(만원)을 입력하세요 > ");
	scanf("%d", &p->salary);

	Register(p);
}

LAB 12-5 438P

내답:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<malloc.h>

typedef union {
	char str[5];
	int num;
}hash;

void GetHash(hash* h)
{

	printf("%s HASH: %d", h->str, h->num);
}

int main()
{
	hash h;
	scanf("%s", h.str);
	GetHash(&h);
}

해답: 포인터를 배열로 써먹은것.  값을 넣고 그것을 그대로 int로 출력한 것. 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<malloc.h>

typedef union
{
	char str[5];
	int hash;
}HType;

int GetHash(const char* str)
{
	HType h;
	for (int i = 0; i < 4; i++)
	{
		h.str[i] = str[i];
	}
	h.str[4] = '\0';

	return h.hash;
}
int main()
{
	printf("%s Hash: %d\r\n", "ABCD", GetHash("ABCD"));
	printf("%s Hash: %d", "0123", GetHash("0123"));
}

LAB 12-6

내답: 실패! 열거체 선언하는건 알겠는데 열거체변수가 생소하고,,, 열거이름이 곧 식별숫자가 되는건가? 그럼 scanf로 입력받을때는 %d로 받아야하나 %s로 받아야하나? 실행해보면 문자로 입력해도 %d로만 입력이 가능한데... 그리고 모르겠어서 힌트를 좀 봤따.. 어렵다...

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<malloc.h>

typedef enum
{
	Hamburger,
	Pizza,
	Chicken,
	Spagetti
}Menu;

void Order(Menu* m)
{
	switch (*m)
	{
	case Hamburger: 
		printf("Hamburger");
	case Pizza:
		printf("Pizza");
	case Chicken:
		printf("Chicken");
	case Spagetti:
		printf("Spagetti");
	}
}

int main()
{ 
	Menu m = 0;
	printf("메뉴를 주문하시오: ");
	scanf("%d", m);
	Order(&m);
}

해답: switch 문 다 까묵었네~~. 열거체는 값으로 숫자대신 열거이름을 쓸수있다는 것!

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<malloc.h>

typedef enum
{
	HAMBURGER,
	PIZZA,
	CHICKEN,
	SPAGHETTI
}Menu;

void Order(Menu m)
{
	switch (m)
	{
	case HAMBURGER: 
		printf("Hamburger"); break;
	case PIZZA:
		printf("Pizza"); break;
	case CHICKEN:
		printf("Chicken"); break;
	case SPAGHETTI:
		printf("Spagetti"); break;
	}
}

int main()
{ 
	Order(HAMBURGER);
}

실전예제 448p 

내답: 결국.. 했다!!!

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<malloc.h>

typedef struct
{
	char gender;
	char name[9];
	int age;
	int salary;
	int serial;
	char enabled;
}PersonInfo;

typedef enum
{
	male =1,
	female 
}gender;

int g_serial;
int g_Index;
int g_Size = 4;
PersonInfo** g_arr;

void Register(PersonInfo* pPerson)
{
	
	pPerson->serial = g_serial++;
	pPerson->enabled = 1;
	
	if (g_Index == 0)
	{
		g_arr = malloc(sizeof(PersonInfo*) * 4);
	}
	g_arr[g_Index] = pPerson ;
	g_Index++;
	if (g_Index+1 > g_Size)
	{
		g_Size += 4;
		g_arr = realloc(g_arr, sizeof(PersonInfo*) * g_Size);
	}
	
}

void Statistics()
{
	double ave_age = 0;
	double ave_salary = 0;
	for (int i = 0; i < g_Index; i++)
	{ 
		ave_age += (double)g_arr[i]->age;
		ave_salary += (double)g_arr[i]->salary;
	}

	printf("평균나이: %f\r\n", ave_age / (g_Index));
	printf("평균연소득; %f", ave_salary/ (g_Index));
}

int main()
{
	int choice;
	int count =0;
	PersonInfo* p;
	while (1)
	{
		printf("1: 개인 정보 입력, 2: 통계 처리 중 선택하세요 > ");
		scanf("%d", &choice);

		if (choice == 1)
		{
			if (count == 0)
			{
				p = malloc(sizeof(PersonInfo));
			}
			else 
			{
				p = realloc(p, sizeof(PersonInfo) *(count+1));
			}
				printf("성별(1:남성, 2:여성)을 입력하세요 > ");
				scanf("%d", &(p + count)->gender);

				printf("이름을 입력하세요 > ");
				scanf("%s", (p + count)->name);

				printf("나이를 입력하세요 > ");
				scanf("%d", &(p+count)->age);

				printf("연소득(만원)을 입력하세요 > ");
				scanf("%d", &(p+count)->salary);

				Register(p+count);
				count++;
		}
		else
		{
			Statistics(); break;
		}
	}
}

해답:그대로 썼는데 왜 실행이 안되징...?

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<malloc.h>

typedef struct
{
	gender gender;
	char name[9];
	int age;
	int salary;
	int serial;
	char enabled;
}PersonInfo;

typedef enum
{
	male =1,
	female 
}gender;

int g_Serial;
int g_PIIndex;
int g_PISize = 4;
PersonInfo** g_pPI;

void Register(PersonInfo* pPerson)
{
	if (!g_pPI)
		g_pPI = malloc(sizeof(PersonInfo*) * g_PISize);

	pPerson->serial = g_Serial++;
	pPerson->enabled = 1;

	if (g_PIIndex > g_PISize)
	{
		g_PISize += 4;
		g_pPI = realloc(g_pPI, sizeof(PersonInfo*) * g_PISize);
	}

	g_pPI[g_PIIndex++] = pPerson;
}

void ShowStatistics()
{
	int TotalAge = 0, TotalSalary = 0;
	for (int i = 0; i < g_PIIndex; i++)
	{
		TotalAge += g_pPI[i]->age;
		TotalSalary += g_pPI[i]->salary;
	}

	printf("평균나이: %f\r\n", (double)TotalAge / g_PIIndex);
	printf("평균연소득; %f", (double)TotalSalary/ g_PIIndex);
}

int main()
{
	int menu;
	do
	{
		printf("1:개인정보입력, 2:통계 처리 중 선태갛세요 > ");
		scanf("%d", &menu);

		if (menu == 1)
		{
			PersonInfo* p = malloc(sizeof(PersonInfo));

			printf("성별(1:남성, 2:여성)을 입력하세요 > ");
			scanf("%d", &p->gender);

			printf("이름을 입력하세요 > ");
			scanf("%s", p->name);

			printf("나이를 입력하세요 > ");
			scanf("%d", &p->age);

			printf("연소득(만원)을 입력하세요 > ");
			scanf("%d", &p->salary);

			Register(p);
		}
	} while (menu == 1);
	ShowStatistics();
}

 

'IT공부 > C언어' 카테고리의 다른 글

1/4 난생처음 C 프로그래밍  (2) 2024.01.04
1/3 난생처음 C프로그래밍  (2) 2024.01.03
2024 1/1 난생처음 C프로그래밍  (0) 2024.01.01
12/31 난생처음 C 프로그래밍  (0) 2023.12.31
12/30 난생처음 C프로그래밍  (0) 2023.12.30

LAB11-3

내답:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<malloc.h>

int main()
{
	int* p  = calloc(2, sizeof(int));
	int N = 0;
	while (1)
	{
		for (int i = 0;; i++)
		{
			printf("저장할 수를 입력하세요 > ");
			scanf("%d", &p[i]);
			if (p[i] == 0)
				return ;
			else
				N++;

			for (int j = 0 ; j < N; j++)
			{
				printf("%d ", p[j]);
			}
			printf("\r\n");
			
			if (!(N % 2))
				p = realloc(p, sizeof(double) * N);			
		}
	}
}

해답:

int main()
{
	int index = 0;
	int size = 2;
	int* p = malloc(size * sizeof(int));

	while (1)
	{
		if (index >= size)
		{
			size += 2;
			p = realloc(p, size * sizeof(int));
		}

		int n;
		printf("저장할 수를 입력하세요 > ");
		scanf("%d", &n);

		if (n)
		{
			p[index++] = n;
			for (int i = 0; i < index; i++)
				printf("%d", p[i]);

			printf("\r\n");
		}
		else
			break;
	}
	free(p);
}

402p 실전예제

내답: 코드가 덕지덕지

char* CatenateString(const char* str1, const char* str2)
{
	int s1,s2,i=0,j=0;
	while (1)
	{
		if (str1[i] == '\0')
		{
			s1 = i;
			printf("%d \r\n", s1);
			break;
		}
		i++;
	}
	while (1)
	{
		if (str2[j] == '\0')
		{
			s2= j;
			printf("%d \r\n", s2);
			break;
		}
		j++;
	}
	char* str = malloc(sizeof(char) * (s1 + s2 + 1));
	for(int a = 0; a<s1;a++)
		str[a] = str1[a];
	for (int b = s1, k = 0; k <= s2; b++)
	{
		str[b] = str2[k];
		k++;
	}
	return str;
}
int main()
{

	char* str = CatenateString("난생처음", "C 프로그래밍");
	printf("%s", str);

	free(str);
}

해답: 전체적인 논리는 똑같고 해답이 좀 더 깔끔하고 정제됨.

char* CatenateString(const char* str1, const char* str2)
{
	int len1 = 0;
	while (str1[len1] != '\0')
		len1++;
	int len2 = 0;
	while (str2[len2] != '\0')
		len2++;

	int index = 0;
	char* pStr = malloc(len1 + len2 + 1);

	for (int i = 0; i < len1; i++)
	{
		pStr[index++] = str1[i];
	}
	
	for (int i = 0; i < len2; i++)
	{
		pStr[index++] = str2[i];
	}

	pStr[index] = '\0';
	return pStr;

	}
int main()
{

	char* str = CatenateString("난생처음", "C 프로그래밍");
	printf("%s", str);

	free(str);
}

chapter 11 포인터 심화 연습문제 

1.문자열배열

2. 0

3. int* arg(포인터)

4.

int GetWordCount(const char* str)
{
	int count,i = 0;
	while (1)
	{
		if (str[i] == ' ' || str[i] == '\t' || str[i] == '\n')
		{
			count = i;
			return count;
		}
		i++;
	}
}

int main()
{
	char arr[] = "C프로그래밍\n";
	printf("문자열의 단어 수: %d", GetWordCount(arr));
}

5.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<malloc.h>

char* Insert(const char* str, int pos, const char* added)
{ //문자열의 특정위치에 문자열을 삽입하는 함수 
	int countStr = 0, countAdd = 0;
	while (1)
	{
		if (str[countStr] == '\0')
		{
			printf("%d\r\n", countStr);
			break;
		}
		countStr++;
	}
	while (1)
	{
		if (added[countAdd] == '\0')
		{
			printf("%d\r\n", countAdd);
			break;
		}
		countAdd++;
	}
	if (countStr < pos)
		return NULL;
	//arr2문자열 만큼 뒤로 문자열을 더 늘려주어야 함. 
	char* pSum = malloc(sizeof(char) * (countStr + countAdd+1));
	//차례대로 str문자열 대입해주다가 pos번째에서 added문자열 배열해주고 str나머지 문자열 배열

	for (int i = 0; i < countStr; i++)
	{
		pSum[i] = str[i];
		if (i + 1 == pos)
		{
			int j = 1, k = 1;
			for (; j < countAdd + 1; j++)
			{
				pSum[i + j] = added[j - 1];
			}
			for (; i + k < countStr + countAdd; j++)
			{
				pSum[i + j ] = str[i + k];
				k++;
			}
			break;
		}
	}
	return pSum;
}

int main()
{
	char arr1[] = "rara's programming";
	char arr2[] = "C";
	printf("문자열: %s", Insert(arr1,7,arr2));
}

6.

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

char* FindPhoneNumber(const char* str)
{ // 문자열에서 핸드폰 번호 형식을 찾아서 문자열을 반환하는 함수
	//010 으로 시작하는것을 찾고 010 이후로 10자리문자열 반환해야함
	int count = 0;
	char* Phone = malloc(sizeof(char) * 13);
	while (1)
	{
		if (str[count] == '0')
		{
			if (str[count + 1] == '1')
			{
				if (str[count + 2] == '0')
				{
					for (int i = 0; i < 13; i++)
					{
						Phone[i] = str[count + i];
						if (i == 12)
							Phone[i + 1] = '\0';
					}
					printf("핸드폰: %s \r\n", Phone);
					break;
				}
			}
		}
		count++;
	}
	return Phone;
}

int main()
{
	char arr[] = "rara의 전화번호: 010-0000-0000";
	printf("원래 : %s\r\n", arr);
	printf("문자열: %s", FindPhoneNumber(arr));
}

 

'IT공부 > C언어' 카테고리의 다른 글

1/3 난생처음 C프로그래밍  (2) 2024.01.03
1/2 난생처음 C프로그래밍  (2) 2024.01.02
12/31 난생처음 C 프로그래밍  (0) 2023.12.31
12/30 난생처음 C프로그래밍  (0) 2023.12.30
12/29 난생처음 c 프로그래밍  (0) 2023.12.29

chapter 10 포인터 기초 연습문제 

1. 시작주소, 크기, 해석

2. &참조연산자, *간접연산자

3.  8바이트,TYPE

4. 4,8

5. TYPE만큼 더

6. p+N

7. *p + 1

8. 2

9. 1,4,8

10.

void* Swap(int* p1, int* p2)
{
	int swap;
	swap = *p1;
	*p1 = *p2;
	*p2 = swap;
}
int main()
{
	int p1 = 1;
	int p2 = 2;

	Swap(&p1, &p2);
	printf("%d, %d", p1,p2 );
}

11.

void* MaxAddress(void* p1, void* p2)
{
	if (p1 > p2)
		return p1;
	else
		return p2;
}
int main()
{
	int* a = NULL;
	int* b = 10;
	printf("메모리주소 a: %p, b: %p\r\n", &a, &b);
	printf("메모리 주소가 더 큰 주소: %p" ,MaxAddress(&a, &b));
}

LAB 11-1 

내답:

int mystrlen(const char* str)
{
	int sum = 0;
	//문자열을 받아서 길이를 반환하는 함수
	for (int i = 0; ; i++)
	{
		
		if (str[i] == '\0')
		{
			break;
		}
		sum++;
	}
	printf("문자열의 길이: %d", sum);
}

해답: 오 훨씬 간단..하고..좋..다...

int mystrlen(const char* str)
{
	for (int i = 0; ; i++)
	{
		if (str[i] == '\0')
			return i;
	}
}

LAB 11-2

내답:

void Sort(int arr[], int count)// int* arr
{
	int temp;
	//배열 포인터로 뭘 할 수 있는데 
	for (int i = 0; i < count; i++)
	{
		for (int j = i+1; j < count; j++)
		{
			if (arr[i] > arr[j])
			{
				temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
			}
		}
	}

}

int main()
{ 
	int arr[6] = { 3,2,6,9,1,8 };
	Sort(arr, 6);
	for (int i = 0; i < 6; i++)
	{
		printf("%d ", arr[i]);
	}
}

해답: 똑같음.. 헤헤

 

'IT공부 > C언어' 카테고리의 다른 글

1/2 난생처음 C프로그래밍  (2) 2024.01.02
2024 1/1 난생처음 C프로그래밍  (0) 2024.01.01
12/30 난생처음 C프로그래밍  (0) 2023.12.30
12/29 난생처음 c 프로그래밍  (0) 2023.12.29
12/28 난생처음 c 프로그래밍  (0) 2023.12.28

LAB10-2

내 답:

int main()
{
	int arr[32];
	char* p = (char*)arr; 
	for (int i = 0; i < 128; i++)
	{
		p[i] = 0b11111111;
	}
	for (int i = 0; i < 32; i++)
	{
		printf("%d, ", arr[i]);

	}
}

해답: 증감연산자 사용

int main()
{
	int arr[32];
	char* p = (char*)arr; 
	for (int i = 0; i < sizeof(arr); i++)
	{
		*p = 0b11111111;
		p++;
	}
	for (int i = 0; i < 32; i++)
	{
		printf("%d", arr[i]);
	}
}

 

다시 LAB 9-5 332p

내답:

int Sum = 0;
static int arr[1024];

int add(int arg, int count)
{
	arr[count] = arg;
	Sum += arg;
	for (int i = 0; i <= count; i++)
	{
		if (arr[i] > 0)
			printf("%d", arr[i]);
		else if (arr[i] < 0)
			printf("%d", -arr[i]);

		if (i == count)
		{
			printf(" = %d\r\n",Sum);
		}
		else
		{
			if (arr[i+1] > 0)
			{
				printf(" + ");
			}
			else if (arr[i+1] < 0)
			{
				printf(" - ");
			}
		}
	}
}


int main()
{
	int arg;
	int count = 0;
	while (1)
	{
		printf("더할 수를 입력하세요 > ");
		scanf("%d", &arg);
		if (arg == 0)
			break;
		add(arg,count);
		count++;
	}
}

해답:

정적지역변수를 써서 add함수가 끝나도 메모리에 살아있도록 함. 그래서 반복해서 호출되어도 그 값이 여전히 유지되도록 함. 

int g_Sum;

void add(int n)
{
	static int s_Index;
	static int s_Arr[1024];

	g_Sum += n;
	s_Arr[s_Index] = n;
	s_Index++;
	
	printf("%d", s_Arr[0]);
	for (int i = 1; i < s_Index; i++)
	{
		if (s_Arr[i] > 0)
			printf("+ %d", s_Arr[i]);
		else if (s_Arr[i] < 0)
			printf("- %d", -s_Arr[i]);
	}
	printf(" = %d\r\n", g_Sum);
}

int main()
{
	while (1)
	{
		int n;
		printf("더할 수를 입력하세요 > ");
		scanf("%d", &n);

		if (n)
			add(n);
		else
			break;
	}
}

실전예제 334p

내답:

int Sum;

void add(int n)
{
	static int Index_plus = 0;//양수
	static int Index_minus = 0;//음수

	static int Arr_plus[1024];//양수배열
	static int Arr_minus[1024];//음수배열
	//양수는 양수배열에, 음수는 음수배열에
	//양수배열 먼저출력 음수뱌열 나중출력
	//음수배열 출력시 - (2)= -2 이런식으로 출력 
	//음수배열 출력해도 앞의 양수배열 다 출력

	Sum += n;
	if (n > 0)
	{
		Arr_plus[Index_plus] = n;
		Index_plus++;
	}
	else if (n < 0)
	{
		Arr_minus[Index_minus] = n;
		Index_minus++;
	}

	if (Arr_plus[0] > 0 && Arr_minus[0] == 0 )
	{
		printf(" ( ");

		for (int i = 0; i < Index_plus; i++)
		{
			printf("%d ", Arr_plus[i]);
			if (Arr_plus[i + 1] > 0)
				printf("+");
		}
		printf(" ) ");
	}
	else if (Arr_minus[0] < 0 && Arr_plus[0] ==0)
	{
		printf("- (");

		for (int i = 0; i < Index_minus; i++)
		{
			printf("%d ", -Arr_minus[i]);
			if(Arr_minus[i+1]<0)
				printf("+ ");
		}
		printf(") ");
	}
	else if(Arr_plus[0]>0 && Arr_minus[0]<0)
	{
		printf("(");
			for (int i = 0; i < Index_plus; i++)
			{
				printf("%d ", Arr_plus[i]);
				if (Arr_plus[i + 1] > 0)
					printf("+ ");
			}

		printf(") - ( ");

		for (int i = 0; i < Index_minus; i++)
		{

			printf("%d ", -Arr_minus[i]);
			if (Arr_minus[i + 1] < 0)
				printf("+ ");
		}
		printf(" ) ");

	}
	printf(" = %d\r\n", Sum);
}

int main()
{
	while (1)
	{
		int n;
		printf("더할 수를 입력하세요 > ");
		scanf("%d", &n);

		if (n)
			add(n);
		else
			break;
	}
}

해답: 해답이 훨씬 간단하고 좋아... 2시간 걸렸는데 ㅠㅠㅠㅠ에효

int g_Sum;

void add(int n)
{
	static int s_plusIndex;
	static int s_plusArr[256];

	static int s_minusIndex;
	static int s_minusArr[256];

	g_Sum += n;

	if (n > 0)
	{
		s_plusArr[s_plusIndex] = n;;
		s_plusIndex++;
	}
	else if (n < 0)
	{
		s_minusArr[s_minusIndex] = n;
		s_minusIndex++;
	}

	if (s_plusIndex > 0)
	{
		printf("( %d ", s_plusArr[0]);
		for (int i = 1; i < s_plusIndex; i++)
			printf("+ %d ", s_plusArr[i]);

		printf(")");
	}

	if (s_minusIndex > 0)
	{
		printf(" - ( %d ", -s_minusArr[0]);
		for (int i = 1; i < s_minusIndex; i++)
			printf("+ %d", -s_minusArr[i]);

		printf(")");
	}
	printf(" = %d\r\n", g_Sum);
}

int main()
{
	while (1)
	{
		int n;
		printf("더할 수를 입력하세요 > ");
		scanf("%d", &n);

		if (n)
			add(n);
		else
			break;
	}
}

chapter 10 포인터 337p 연습문제

1. 생명주기, 가시범위

2. extern

3. static

4. 0

5. 2

6. 1

7. 생명주기: 프로그램 처음~끝, 가시범위 : 소스파일

8. 생명주기: 프로그램 처음~끝. 가시범위: 함수블록

9. 프로그램이 시작되어 변수가 생성되는 시점부터 자동으로 0으로 초기화

10. 성능과 효율성. 전역,정적 객체는 오직 프로그램 시작시에 한번만 호출되지만, 지역객체는 호출되는 만큼 객체가 생성되므로 자동으로 초기화하면 성능이 떨어질수도 있다....

11.

static even_count;
static odd_count;

void Even(int a)
{
	even_count++;
	printf("짝수 입력, 총 짝수 횟수: %d\r\n", even_count);
}

void Odd(int a)
{
	odd_count++;
	printf("홀수 입력, 총 홀수 횟수: %d\r\n", odd_count);
}
int main()
{
	int a;
	while (1)
	{
		printf("정수를 입력하세요 > ");
		scanf("%d", &a);
		if (a == 0)
			return 0;

		if (a % 2 == 0)
			Even(a);
		else
			Odd(a);
	}
}

12.

static int count;
void step() 
{
	count++;
	printf("Total Steps: %d\r\n", count);
}
int main()
{
	for (int i = 0; i < 3; i++)
	{
		step();
	}
}

실전예제 372p

내답:

void* mymemset(void* dest, int c, size_t count)
{
	for (int i = 0; i < count; i++)
	{
		((char*)dest)[i] = c;
	}
}

해답:

void* mymemset(void* dest, int c, size_t count)
{
	char* p = dest;
	for (int i = 0; i < count; i++)
	{
		p[i] = c;
	}
}

 

LAB9-3

내답:

int wallet = 0;//잔고
int inout;//입금출금

int In(int inout)// 입금시 잔고 출력
{
	wallet += inout;
	return wallet;
}
int Out(int inout)// 출금시 잔고출력
{
	wallet += inout;
	return wallet;
}
int main()
{ // 입출금 처리 프로그래밍
	do
	{
		printf("입출금액을 입력하세요 > ");
		scanf("%d", &inout);
		if (inout > 0)
		{
			printf("입금: %d원, 잔고: %d원\r\n", inout, In(inout));
		}
		else if (inout < 0)
		{
			printf("출금: %d원, 잔고: %d원\r\n", -inout, Out(inout));
		}
		else
		{
			return 0;
		}
	} while (inout);

}

해답:

int g_Balance = 0;//잔고

void Deposit(int amount)// 입금시 잔고 출력
{
	g_Balance += amount;
	printf("입금: %d원, 잔고: %d원\r\n", amount, g_Balance);
}
void Withdraw(int amount)// 출금시 잔고출력
{
	g_Balance -= amount;
	printf("출금: %d원, 잔고: %d\r\n", amount, g_Balance);
}
int main()
{ // 입출금 처리 프로그래밍
	int amount;

	while(1)
	{
		printf("입출금액을 입력하세요 > ");
		scanf("%d", &amount);

		if (amount > 0)
			Deposit(amount);
		else if (amount < -0)
			Withdraw(-amount);
		else
			break;
	}
}

전체적으로 비슷하고 해답이 더 깔끔함

LAB 9-4

내 답:

// 입출금 처리 프로그램
int wallet = 0; //잔고
int allDeposit = 0;//총입금액
int allWithdraw = 0; //총출금액

void Deposit(int money)
{
	allDeposit += money;
	wallet += money;
	printf("입금: %d원, 총입금액: %d원, 잔고: %d원\r\n", money, allDeposit, wallet);
}
void Withdraw(int money)
{
	allWithdraw += money;
	wallet += money;
	printf("출금: %d원, 총출금액: %d원, 잔고: %d원\r\n", -money, -allWithdraw, wallet);

}
int main()
{
	int money;
	while(1)
	{
		printf("입출금액을 입력하세요 > ");
		scanf("%d", &money);
		if (money > 0)
			Deposit(money);
		else if (money < 0)
			Withdraw(money);
		else return 0;
	}

}

해답:

int g_Balance = 0;

void Deposit(int amount)
{
	static int s_Total = 0;

	g_Balance += amount;
	s_Total += amount;
	printf("입금: %d원, 총입금액: %d원, 잔고: %d원\r\n",amount,s_Total,g_Balance);
}

void Withdraw(int amount)
{
	static int s_Total = 0;
	
	g_Balance -= amount;
	s_Total += amount;
	printf("입금: %d원, 총입금액: %d원, 잔고: %d원\r\n", amount, s_Total, g_Balance);
}

int main()
{
	int amount;
	while(1)
	{
		printf("입출금액을 입력하세요 > ");
		scanf("%d", &amount);

		if (amount > 0)
			Deposit(amount);
		else if (amount < 0)
			Withdraw(-amount);
		else
			break;
	}
}

+ Recent posts