U E D R , A S I H C RSS

새싹교실/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;
} 

도상희

복습
1~6. Koistudy.net 106~111번
->풀었음!


7. Koistudy.net 125, 152번(둘다 하기 힘들면 하나만) 3n+1
accept받은 걸 스샷으로 찍어도 좋아요 저번주에 accept받는데 실패하신 분들은 저나 다른분들에게 물어봐서 한번 해보도록 합시다^^
-> 못풀었음!

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 i,j;
	int arr[6][6]={0,};
	int num=0;

	for(i=0 ; i<6 ; i++){
		if(i%2==0){
			for(j=0 ; j<=i ; j++) arr[i][j]=++num;
		}else{
			for(j=i ; j>=0 ; j--) arr[i][j]=++num;
		}
	}

		for(i=0 ; i<6 ; i++){
			for(j=0 ; j<6 ; j++){
				if(arr[i][j] != 0) printf("%3d",arr[i][j]);
			}
			printf("\n");
		}
	
	return 0;
}


9. 2중포인터를 이용하여 3x3행렬을 두개 만들고, 두 배열의 합을 출력하는 프로그램을 짜보세요.
hint) Dp = (int**)malloc(sizeof(int*));
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(){
	int **p1;
	int **p2;
	int i,j;
	srand(time(NULL));
	p1=(int**)malloc(sizeof(int*)*3);
	p2=(int**)malloc(sizeof(int*)*3);
	for(i=0 ; i<3 ; i++){
		p1[i]=(int*)malloc(sizeof(int*)*3);
		p2[i]=(int*)malloc(sizeof(int*)*3);
	}
	
	for(i=0 ; i<3 ; i++){
		for(j=0 ; j<3 ; j++){
			p1[i][j]=1+rand()%9;
			p2[i][j]=1+rand()%9;
		}
	}
	for(i=0 ; i<3 ; i++){
		for(j=0 ; j<3 ; j++){
			printf("%3d",p1[i][j]);
		}
		printf("\n");
	}
	printf("\n");
	for(i=0 ; i<3 ; i++){
		for(j=0 ; j<3 ; j++){
			printf("%3d",p2[i][j]);
		}
		printf("\n");
	}
	printf("\n");
	for(i=0 ; i<3 ; i++){
		for(j=0 ; j<3 ; j++){
			p1[i][j]+=p2[i][j];
			printf("%3d",p1[i][j]);
		}
		printf("\n");
	}
	return 0;
}

10. 3회차 10번과제를 해결해와 주세요. 이번에는 반드시 과제의 스펙을 완수해와야합니다. 모르면 물어봐도되고, 다른 사람 코드를 참고해보아도 좋아요
LinearSearch를 구현해보세요. 배열은 1000개로 잡고, random함수를 이용해 1부터 1000까지의 숫자를 랜덤으로 배열에 넣은 후, 777이 배열내에 있었는지를 찾으면 됩니다. 프로그램을 실행시킬 때마다 결과가 달라지겠죠?
(rand()%1000을 한다면 1에서 1000까지의 숫자가 나올 것입니다.)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(){
	int arr[1000];
	int i;
	int count=0;
	srand(time(NULL));

	for(i=0 ; i<1000 ; i++){
		arr[i]=rand()%1000;
	}
	
	for(i=0 ; i<1000 ; i++){
		if(arr[i]==777){
			printf("%d번째에 777 존재\n",i+1);
			count++;
		}
	}
	printf("%d개 존재\n",count);
	if(count == 0){
		printf("777없음\n");
	}
	
	return 0;
}

11. 이번시간에 배웠던 내용을 바탕으로, int* a; int b; int **c;로 선언했을때 &c,c,*c,&a,a에 관해서 각각 설명하고, 어떤 것이 어떤 것과 일치하는 것인지를 이해할 수 있도록 쉬운말로 정리해보세요.
	int* a;
	int b=10;
	int** c;

	a=&b;
	c=&a;
	printf("%d\n",a);  //b의 주소
	printf("%d\n",&a); //a의 주소
	printf("%d\n",*a); //b의 값
	printf("%d\n",b); //b의 값
	printf("%d\n",&b); //b의 주소
	printf("%d\n",c); //a의 주소
	printf("%d\n",&c); //c의 주소
	printf("%d\n",*c); //b의 주소


12. 예제 코드가 어떤 행동을 수행하고, 왜 그런 값이 나오는지 설명해 봅시다.
int* a;
int b=5;
int** c;
 c=&a;
 a=&b;
 **c=9;
 printf("%d %d",*c,**c);

b가 9로 변함!


예습

1. LinkedList의 node를 선언하는 방법을 찾아보고, 왜 그런 형태인지 이해한만큼 써보자.

struct Node{
int data; //데이터를 담을 공간
struct Node *NextNode; //다음 노드에 대한 포인터
};


2. Circular Queue가 무엇인지 찾아보자.
원형 큐란 큐의 배열(arrangement)을 원형으로 표현하며 큐를 구성하는 배열의 처음과 끝을 이어놓은 형태의 큐를 말합니다.
큐를 위한 버퍼와, 시작과 끝을 나타내는 두개의 값을 사용하게 된다.
자료를 넣을때는 인덱스의 해당하는 위치에, 꺼낼때는 시작 점을 나타내는 인덱스의 위치에 해당되는 버퍼의 위치에서 하게 된다.
작업이 일어났을때는 작업에 해당하는 카운트를 증가시킴으로써 다음 번에 자료를 넣을때 다음 위치에서 이뤄나도록 하는 것이다. 인덱스 버퍼의 끝이 도달했을때는 다시 버퍼의 맨 앞을 가르켜 처음으로 돌아가게 하면 된다.


3. typedef가 무엇인지 알아보고, 간단한 예제를 써보자.
typedef 명령문은 기존에 있는 자료형을 사용자가 원하는 이름으로 사용할 수 있게끔 선언하는 명령문
<typedef 의 사용법>
typedef <자료형> <선언명>;

<typedef 의 사용 예>
typedef int AA;
AA num=500;



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

struct student{
	char name[20];
	int num;
	int age;
};

int main(){
	int i;
	struct student aclass[3]={{"곽길문",201001,24},
				  {"한송이",201002,23},
				  {"황혜림",201003,22}};

	for(i=0 ; i<3 ; i++){
		printf("%s %d %d\n",aclass[i].name,aclass[i].num,aclass[i].age);
	}
	return 0;
}


한송이


1~6 성공:D
10.3회차 10번과제를 해결해와 주세요. 이번에는 반드시 과제의 스펙을 완수해와야합니다. 모르면 물어봐도되고, 다른 사람 코드를 참고해보아도 좋아요
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(void){
	int i,ran,arr[1000]={0};
	
	srand(time(NULL));

	for(i=0;i<1000;i++){
		ran = 1+rand()%1000;
	}
		if(arr[i]==777){
			printf("777이I arr[%d]에 있습니다",i);
		}

		else
			printf("777이I 없습니다.");
		

		
	return 0;
}



12.예제 코드가 어떤 행동을 수행하고, 왜 그런 값이 나오는지 설명해 봅시다.
int* a;
int b=5;
int** c;
c=&a;
a=&b;
  • *c=9;
    printf("%d %d",*c,**c);

*c는 이상한값, **c는 9

예습


1.LinkedList의 node를 선언하는 방법을 찾아보고, 왜 그런 형태인지 이해한만큼 써보자.
NODE*CreateNode(char name [])
{
NODE*NewNode = (NODE*)malloc(sizeof(NODE));

Strcpy(NewNode->Name,name);
NewNode->NextNode = NULL;

Return NewNode;
}

NODE* 를 반환하는 CreateNode다. NewNode라는 포인터를 생성후 그 해당하는 주소에 malloc함수로 공간을 할당하고 있다.
Malloc으로 할당한 공간은 해당 함수가 끝나도 해제되지 않는다. 이건 속성이 다른 메모리 공간에 할당 했기 때문이다.(?????)



2. Circular Queue가 무엇인지 찾아보자.
큐를 구현하는 가장 일반적인 방법은 스택과 마찬가지로 배열을 이용하는 방법이다. 그러나 단순배열로 할경우 배열의 크기가 지정되어 있는 상태에서 데이타가 계속 추가되게 되면 어느 시점에서 overflow 가 발생하게 됨으로 데이타가 배열의 크기를 초과하게 되면, 초과된 데이타는 0번째 배열로 들어가게 해야 한다. 이러한 구조가 환형구조와 같다고 해서 보통 환형큐(circular queue) 라고 한다


3. typedef가 무엇인지 알아보고, 간단한 예제를 써보자.
1)기존 자료형의 이름을 프로그램 내부에서 다른 이름으로 사용할 수 있게 하는 것
Typedef 기존_자료형_이릉 새로운_자료형_이름;
예) typedef unsigned char uchar;
2)헤더파일에서 typedef사용하기
Typedef는 공통적으로 사용하는 헤더파일에 선언을 해주어야 모든 소스파일에서 사용할수 있다
//typedef를 사용하면 새로운 자료형을 기존의 자료형처럼 사용할 수 있다.

#include<stdio.h>
typedef int Num;
int main(){
	Num a=10;
	int b=20;

	printf("sum = %d\n",a+b);

	return 0;
}

typedef을 정의하면 int나 char 등의 자료형을 자신이 원하는 명칭으로 바꾸어서 사용이 가능하다.
먼저 typedef을 전역 변수 지역에 선언 해준다. 예제에서는 int형을 NUM으로 명칭을 바꾼 것이다.

그리고 보통 자료형 int 처럼 사용하면 된다. NUM을 이용한 변수 값과, int를 이용한 변수의 값을 서로 연산을 해보면 정확하게 값이 나온다.

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

int main(void){
	
	struct student{
		char name[10];
		int age;
	};
	struct student s[4];
	int i;

	strcpy(s[0].name,"한송이");
	s[0].age = 23;

	strcpy(s[1].name,"도상희");
	s[1].age = 24;

	strcpy(s[2].name,"곽길문");
	s[2].age = 24;

	strcpy(s[3].name,"황혜림");
	s[3].age = 22;

	for(i=0;i<4;i++){
	printf("이름 : %s\n",s[i].name);
	printf("나이 : %d\n",s[i].age);
	}

	return 0;
}



Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2012-06-04 13:50:21
Processing time 0.7985 sec