U E D R , A S I H C RSS

새싹교실/2012/AClass/4회차 (rev. 1.6)

새싹교실/2012/AClass/4회차

4회차 과제 업로드

  • 코드는 {{{ }}} 안에 넣으면 됩니다.

곽길문

11.이번시간에 배웠던 내용을 바탕으로, int* a; int b; int **c;로 선언했을때 &c,c,*c,&a,a에 관해서 각각 설명하고, 어떤 것이 어떤 것과 일치하는 것인지를 이해할 수 있도록 쉬운말로 정리해보세요.
-이중포인터는 포인터의 주소값을 갖는 것입니다. 그거에 따라서 &c는 자기 자신 주소를 의미하는 것이고 c는 포인터 a의 주소값을 말합니다. *c또한 a의 주소값입니다 . &a는 a의 주소값, a는 a가 b를 가리키는 것이라면 b의 주소값을 말합니다.

12.예제 코드가 어떤 행동을 수행하고, 왜 그런 값이 나오는지 설명해 봅시다.
int* a;
int b=5;
int** c;
c=&a;
a=&b;
  • *c=9;
    printf("%d %d",*c,**c);
-결과 : 3210468 9
-해설 : 우선 int형 자료형을 가진 데이터의 주소를 가리키는 포인터로 a지정, b의 값에 5를 지정, 포인터의 주소를 가리키는 c를 지정하였다. a의 주소를 이중 포인터 c에 주었다. b의 주소는 포인터 a에 할당하였다. 그리고 이중포인터c에 값을 9로 주었다. 이것은 원래의 a의 주소값을 갖고 있던 c에 9를 대체해준 것이다. 따라서 프린트 *c,**c를 하면 a의 주소와 9가 출력이 된다.


1.5.1.2 예습




2.Circular Queue가 무엇인지 찾아보자.
-원형 큐로 기본 큐와 마찬가지로 첫 번째 데이터가 추가되는 순간 큐의 처음과 끝부분이 그 데이터를 가리키게 된다. 처음을 F 끝부분을 가리키는 것을 R이라하면 꽉찬 경우나 텅빈경우에 F가 R의 한칸 앞을 가리키는 것은 같기 때문에 F,R의 위치만을 가지고 꽉 찬경우와 텅 빈 경우를 구분할 수 가 없다. 따라서 이와 같은 문제를 해결하는 방법은 많겠지만 그 중 하나는 배열을 꽉 채우지 않고 배열의 길이가 N이라면 N-1만큼만 채워 졌을 때 꽉 찬 것으로 간주하는 방법이다. 이렇게 하면 저장 공간 하나를 낭비하게 된다. 하지만 이로 인해서 문제 하나가 해결이 되는 셈이다.

3.typedef가 무엇인지 알아보고, 간단한 예제를 써보자.
- c언어에서는 char,int,float 와 같은 많은 수의 기본 데이터 형과 배열, 포인터, 구조체 등의 유도된 데이터형으로부터 새로운 데이터형을 만들 수 있는데, 사용자 측면에서 새로운 데이터 형을 정의 할 수 있도록 typedef선언을 제공한다. typedef은 #define과 달리 이미 존재하는 c언어의 데이터 형만을 취하여 정의하고 typedef은 프리프로세서에 의해 처리되는 것이 아니라 c컴파일러에 의해 처리된다. 또한 #define보다 다양한 형태의 치환이 가능하다.

< 일반 형식 : typedef 기존 데이터형 새로운 데이터형; >

예제 :
#include <stdio.h>
void main()
{
typedef char *YOU;

YOU name ="color";
YOU color = "red, blue, yellow, black";

printf("name=%s \n",name);
printf("color=%s \n",color);

}

결과 :
name =color
color =red, blue, yellow, black

해설 :
typedef문에서 기존 데이터형 char를 새로운 데이터형 이름으로 *YOU를 정의했고 YOU name이라 정의하면 이는 char *name로 나타낸것과 같다.

4.구조체를 사용하여 student 구조체를 하나 만들고, student 구조체 배열을 만들어 0~3번째 배열에 AClass반 학생들의 정보를 적당히 넣고, 그것을 출력해보자.
구조체 내부에 char 배열을 사용해서 이름을 넣어도 좋고, 학번을 int형으로 넣어도 좋다.
-.. 왜 에러가 뜰까..
#include<stdio.h>

struct Student
{

int age;
char name[];

};

int main()
{
int i;
struct Student stu4={24,"길±æ문¹�"},{24,"상≫o희En"},{23,"송¼U이AI"},{22,"혜Cy림¸²"};



for(i=0;i<4;i++){


printf("age : %d\n name : %s \n",stui.age,stui.name);

}

return 0;
}

-나머지는 월요일 저녁까지 올리겠습니다

황혜림


8.다음 형태로 출력되는 프로그램을 짜 보세요.
저번주 과제 8번에 실패하신 분들은 해당 문제를 푸셔도 됩니다. 아직 이해가 잘 안가시면 저나 다른분들에게 물어봐요
1
3 2
4 5 6
10 9 8 7
11 12 13 14 15
21 20 19 18 17 16
#include <stdio.h>

int main()
{
	int a[6][6];
	int i,j;
	int count=1;

	for(i=0;i<6;i++)
	{
		if(i%2!=0)
		{
			for(j=i;j>=0;j--)
			{
				a[i][j]=count;
				count++;
			}
		}
		else
		{
			for(j=0;j<=i;j++)
			{
				a[i][j]=count;
				count++;
			}
		}
	}
	for(i=0;i<6;i++)
	{
		for(j=0;j<=i;j++)
		{
			if(a[i][j]<10)
				printf("%d  ",a[i][j]);
			else
				printf("%d ",a[i][j]);
		}
		printf("\n");
	}
	return 0;
} 
9.2중포인터를 이용하여 3x3행렬을 두개 만들고, 두 배열의 합을 출력하는 프로그램을 짜보세요.
hint) Dp = (int**)malloc(sizeof(int*));

10.3회차 10번과제를 해결해와 주세요. 이번에는 반드시 과제의 스펙을 완수해와야합니다. 모르면 물어봐도되고, 다른 사람 코드를 참고해보아도 좋아요
//10.LinearSearch를 구현해보세요. 배열은 1000개로 잡고, random함수를 이용해 1부터 1000까지의 숫자를 랜덤으로 배열에 넣은 후, 777이 배열내에 있었는지를 찾으면 됩니다.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void random(int a[]);
int main()
{
	int x;
	int a[1000];
	int i;
		
	srand(time(NULL));
	
	for(i=0;i<1000;i++)
	{
		x=1+rand()%1000;
		a[i]=x;
//		printf("%d ",a[i]);
	}
//	printf("\n");
	random(a);
	
	return 0;
}

void random(int a[])
{
	int find[1000]={0};
	int i;

	for(i=0;i<1000;i++)
	{
		if(a[i]==777)
			find[i]=i;	
		
		if(find[i]!=0)
			printf("777은 %d번째에 있습니다\n",find[i]);
	}
	
} 
11.이번시간에 배웠던 내용을 바탕으로, int* a; int b; int **c;로 선언했을때 &c,c,*c,&a,a에 관해서 각각 설명하고, 어떤 것이 어떤 것과 일치하는 것인지를 이해할 수 있도록 쉬운말로 정리해보세요.
&c : c의 주소
c : c의 값(a의 주소)
*c : c가르키는 곳의 값(b의 주소)
&a : a의 주소
a : a의 값(b의 주소)
c==&a
*c==a==&b
12.예제 코드가 어떤 행동을 수행하고, 왜 그런 값이 나오는지 설명해 봅시다.
int* a;
int b=5;
int** c;
c=&a; // c에 a의 주소 넣어 줌
a=&b; // a에 b의 주소 넣어 줌
**c=9; // c의 방(?)에 9를 넣어 줌
printf("%d %d",*c,**c); // *c에는 a의 주소가 들어 가있고 **c에는 b의 값이 들어가 있다.


1.5.1.2 예습

LinkedList의 node를 선언하는 방법을 찾아보고, 왜 그런 형태인지 이해한만큼 써보자.
-struct Node{
char Name20;
struct Node *Next;
};
- 데이터를 넣을 Name이라는 변수와 다음 노드를 가리킬수 있도록 하는 Next포인터 변수를 선언했다.

Circular Queue가 무엇인지 찾아보자.
- 배열 기반의 큐가 원형으로 이루어진 상태.
- 원형으로 이루어져 있기 때문에 큐가 가득 찼을때나 완전히 비어있을때 Front와 Rear의 index는 동일하므로 Empty인지 Full인지 구분할 수 없다.

typedef가 무엇인지 알아보고, 간단한 예제를 써보자.
- 기존에 존재하는 자료형에 새로운 이름을 부여하는 것
typedef struct
{
char *name;
int age;
char sex;
}Student;

구조체를 사용하여 student 구조체를 하나 만들고, student 구조체 배열을 만들어 0~3번째 배열에 AClass반 학생들의 정보를 적당히 넣고, 그것을 출력해보자.
구조체 내부에 char 배열을 사용해서 이름을 넣어도 좋고, 학번을 int형으로 넣어도 좋다.
이 과제가 무슨 말인지 이해가 안되는 경우 반드시 저에게 물어보고, 과제를 해야합니다.
#include <stdio.h>

typedef struct 
{
	char *name;
	int age;
	char sex;
	
}Student;
int main()
{
	Student Std[4];
	int i;

	Std[0].name="곽길문";
	Std[0].age=24;
	Std[0].sex='F';
	Std[1].name="도상희";
	Std[1].age=24;
	Std[1].sex='F';
	Std[2].name="한송이";
	Std[2].age=23;
	Std[2].sex='F';
	Std[3].name="황혜림";
	Std[3].age=22;
	Std[3].sex='F';
	

	printf("이름\t나이\t성별\n");
	for(i=0;i<4;i++)
	{
		printf("%s\t%d\t%c\n",Std[i].name,Std[i].age,Std[i].sex);
	}
	return 0;
} 

도상희


Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:29:45
Processing time 0.0333 sec