" async="async"> ', { cookie_domain: 'auto', cookie_flags: 'max-age=0;domain=.tistory.com', cookie_expires: 7 * 24 * 60 * 60 // 7 days, in seconds }); 책 알려주는 남자 :: 책 알려주는 남자

11장 Exercise


1. (a) 처럼 바꾸시오

(a) list[6] -> *(list+6)
(b) name[3] ->*(name+3)
(c) *(cost+8) -> cost[8]
(d) message[0] -> *message

비고) a+i는 &a[i]와 같고, *(a+i)는 a[i]와 동일하다


2. 알맞은 문장 넣기

char code;
char *p;        // char형 포인터 p선언
p=&code;     // 포인터에 변수 code의 주소 대입
*p='a';          // 포인터를 통하여 변수 code에 'a' 대입하기


3. int a[]={10, 20, 30, 40, 50}으로 정의되었다고 가정할 때, *(a+2)의 값은?     ③30


4. 아래의 문장이 실행되었을 때 다른 문장들과 실행 결과가 다른것은?         ③*p++

int i;
int *p=&i;

비고) ③*p++은 p가 가르키는 i값을 가져오고 p를 1증가시키는 것이다.
        ①②④ i를 1 증가한다.
        int *p=&i;  =  int *p;  +  p=&i;


5. 다음 프로그램의 출력은?                                5, 6

 int x=6;
int *p=&x;
printf("%d\n", --(*p));
printf("%d\n", (*p)++);


6. 다음 프로그램의 출력은?                             1008, 2008

int *p = (int *)1000;
double *q = (double *)2000;
printf("%d\n", p+2);
printf("%d\n", q+1);

비고) 결과값 : x+sizeof(x)*integer


7. 다음 프로그램의 출력은?                         0, 1, 2   

int list[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int *p;
p=list;
printf("%d\n", *list);
printf("%d\n", *p+1);
printf("%d\n", *p+2);

비고) %d대신 %x로 바꾸고 *을 제거하면 주소들이 출력된다.


8. double형 배열을 매개 변수 a로 전달받는 함수 print_array()의 헤더를 다음과 같은 방법으로 작성하라. 반환값은 없다.

 (a) b를 배열로 선언 

 print_array(double a[]);

 (b) b를 포인터로 선언

 print_array(double *a); 


9. 다음 프로그램에서 ip의 값이 변경되지 않는 이유는 무엇인가?

void f(int *p)
{
static int data 5;
p=&data;
}

int main()
{
int*ip=NULL;
f(ip;)
}


모든 변수는 메모리에 값을 저장한다. 주소로 각각의 위치를 구별하여 저장하며 포인터 변수는 메모리의 주소를 지정하는 값을 가진다. 정적변수 역시 메모리에 배치되고 주소값을 가진다. 그러나 기계어 코드에 주소값을 고정하여 액세스된다. 즉 정적변수를 가르키는 포인터는 가르키는 주소값이 정적변수에 의해 고정되어 변경되지 않게 된다.


블로그 이미지

얼음꿀차

책을 한 번 읽긴 읽어야겠는데 막상 읽자니 뭘 읽을지 고민되는 당신을 위해 읽을만한 책들을 알려드립니다!

,

11장 Summary


메모리는 이터를 기준으로 주소가 매겨진다

포인터는 메모리의 주소를 저장할 수 있는 변수이다

변수 x의 주소를 추출하려면 printf("x의 주소: %p", &x);라고 하면 된다.

int *p의 의미는 정수를 가르키는 포인터이다

int 형 포인터 p가 가리키는 위치에 100을 저장하는 문장은 *p=100;이다

포인터가 아무것도 가리키고 있지 않는 경우에는 NULL값을 넣어두는 편이 좋다

배열 a에서 a는 첫번째 원소(=a[0])의 주소이다.         
                    ★열의 이름은 첫번째 원소를 가르키는 포인터(포인터상수)와 같다

P가 포인터라면 p[2]는 수식 *(p+2)와 같다
                    ★a+i는 &a[i]와 같고, *(a+i)는 a[i]와 동일하다

*p++의 의미는 p가 가르키는 값을 가져온 후에 p를 증가한다.

   ★(*p)++ : p가 가르키는 값을 가져온 후에 가르키는 값을 증가한다.
       *++p : p를 증가시킨 수에 p가 가르키는 값을 가져온다
       ++*p : p가 가르키는 값을 증가시킨 후에 가져온다

사칙 연산 중에서 포인터에 대하여 적용할 수 있는 연산에는 덧셈과 뺄셈 이 있다.

int형 포인터 p가 80번지를 가리키고 있었다면 (p+1)은 84번지를 가리킨다

함수 호출시 인수 전달 방법 중에서 기본적인 방법은 "에 의한 호출"이다.

값에 의한 호출(call-by-value)은 복사본이 전달되고
   이 방법만 C에서 지원한다.
 
★참조에 의한 호출(call-by-reference)은 원본이 전달되고
   포인터를 이용해 간접구현이 가능하다.

블로그 이미지

얼음꿀차

책을 한 번 읽긴 읽어야겠는데 막상 읽자니 뭘 읽을지 고민되는 당신을 위해 읽을만한 책들을 알려드립니다!

,

10장 Programming


1.

#include <stdio.h>


void main()

{

int i;

int days[]={31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

for(i=0; i<12; i++)

printf("%02d은 %d일까지 있습니다.\n", i+1, days[i]);

}



2.

#include <stdio.h>

#include <stdlib.h>

#include <time.h>


void main()

{

srand((unsigned)time(NULL));

int i,j, least, temp, array[10];

for(i=0; i<9; i++)

array[i] = rand()%100;

for(i=0; i<9; i++)

{

least = i;

for(j=i+1; j<10; j++)

if(array[j] < array[least])

least = j;

temp = array[i];

array[i] = array[least];

array[least] = temp;

}

for(i=0; i<10; i++)

printf("%d ", array[i]);

printf("\n");

printf("최소값은 %d이고 최대값은 %d입니다.", array[0], array[9]);

}



3.

#include <stdio.h>

#define SIZE 2


int array_equal(int a[], int b[], int size)

{

int i, result=0;

for(i=0; i<SIZE; i++)

{

if(a[i]==b[i]) result += 1;

else  result += 0;

}

return result;

}


void main()

{

int a[]={1, 2};

int b[]={1, 2};

if(array_equal(a, b, SIZE)==SIZE)

printf("원소가 같다.\n");

else

printf("원소가 다르다.\n");

}



4.

#include <stdio.h>
#define SIZE 2

void array_copy(int a[], int b[], int size)
{
int i;
for(i=0; i<SIZE; i++)
{
b[i]=a[i];
printf("%d ", b[i]);
}
}

void main()
{
int a[]={1, 2};
int b[SIZE];
array_copy(a, b, SIZE);
}

5.

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define SIZE 10


void main()

{

srand((unsigned)time(NULL));

int i, max=0, a[SIZE]={0};        // 0으로 초기화 하지 않으면 쓰레기값이 들어간다

for(i=0; i<100; i++)

a[rand()%SIZE]++;

printf(" 난수 빈도수\n");

printf("===============\n");

for(i=0; i<SIZE; i++)

{

printf("%3d  %4d\n", i, a[i]);

if(a[i]>a[max])

max=i;

}

printf("가장 많이 생성된 수는 %d이다", max);

}


6.

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define ROW 3

#define COL 5


void main()

{

srand((unsigned)time(NULL));

int i, j, sum=0, a[ROW][COL]={0};

for(i=0; i<ROW; i++)

{

for(j=0; j<COL; j++)

printf("%4d ", a[i][j]=rand()%100);

printf("\n");

}

printf("\n");

for(i=0; i<ROW; i++)

{

for(j=0; j<COL; j++)

sum+=a[i][j];

printf("%d행의 합은 %d입니다.\n", i+1, sum);

}

sum=0;

printf("\n");

for(j=0; j<COL; j++)

{

for(i=0; i<ROW; i++)

sum+=a[i][j];

printf("%d열의 합은 %d입니다.\n", j+1, sum);

}

}


7.

#include <stdio.h>

#define ROW 10

#define COL 3


void main()

{

int i, n, result=0, a[ROW][COL]={0};

for(i=0; i<ROW; i++)

{

a[i][1]=i+1;

a[i][2]=(i+1)*(i+1);

a[i][3]=(i+1)*(i+1)*(i+1);

}

printf("정수를 입력하시오: ");

scanf("%d", &n);

for(i=0; i<ROW; i++)

{

if(n==a[i][3])

{

printf("%d의 세제곱근은 %d", n, a[i][1]);

result=1;

break;

}

}

if (result==0)

printf("해당 정수의 세제곱근은 배열에 없습니다.");

}


8.

#include <stdio.h>      // 함수 통합

#include <stdlib.h>

#include <time.h>

#include <math.h>

#define SIZE 10


void main()

{

srand((unsigned)time(NULL));

int i, sum=0, a[SIZE]={0};

float mean, sd;

for(i=0; i<SIZE; i++)

{

printf("데이터를 입력하시오: %d\n", a[i]=rand()%100);

sum+=a[i]; 

}

printf("\n");

mean = sum/SIZE;

printf("평균값은 %f\n", mean);

sum=0;

for(i=0; i<SIZE; i++)

sum+=(a[i]-mean)*(a[i]-mean);

sd = sqrt(sum/SIZE);

printf("표준편차값은 %f\n", sd);

}


============================================

#include <time.h>        // 함수 분할

#include <math.h>

#define SIZE 10


float mean(int a[], int n);

void sd(int a[], int n, float mean);


void main()

{

srand((unsigned)time(NULL));

int i, a[SIZE]={0};

float m;

for(i=0; i<SIZE; i++)

printf("데이터를 입력하시오: %d\n", a[i]=rand()%100);

m=mean(a, SIZE);

sd(a, SIZE, m);

}


float mean(int a[], int n)

{

int i, sum=0;

float mean;

for(i=0; i<SIZE; i++)

sum+=a[i];

mean=sum/SIZE;

printf("평균값은 %f\n", mean);

return mean;

}


void sd(int a[], int n, float mean)

{

int i, sum=0;

float sd;

for(i=0; i<SIZE; i++)

sum+=(a[i]-mean)*(a[i]-mean);

sd = sqrt(sum/SIZE);

printf("표준편차값은 %f\n", sd);

}



9.

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define ROW 5

#define COL 3


void exam(int grade[][COL]);


void main()

{

srand((unsigned)time(NULL));

int i, j, grade[ROW][COL]={0};

printf("학번  #1  #2  #3\n");

for(i=0; i<ROW; i++)

{

for(j=0; j<COL; j++)

grade[i][j]=rand()%101;

printf("%3d  %3d %3d %3d\n", i+1, grade[i][0], grade[i][1], grade[i][2]);

}

printf("\n");

exam(grade);

}


void exam(int grade[][COL])

{

int i, j, min, max;

for(i=0; i<ROW; i++)

{

min=0, max=0;

for(j=0; j<COL; j++)

{

if(grade[i][j]<grade[i][min])

min=j;

else if (grade[i][j]>grade[i][max])

max=j;

}

printf("%d번 학생의 최대 점수는 %d, 최소 점수는 %02d 이다.\n", i+1, grade[i][max], grade[i][min]);

}

}


10.

#include <stdio.h>


void vector_add(double x[], double y[], double z[])

{

int i;

for(i=0; i<3; i++)

{

z[i] = x[i] + y[i];

printf("%4lf ", z[i]);

}

printf("\n");

}


void vector_dot(double x[], double y[])

{

int i;

double sum=0;

for(i=0; i<3; i++)

sum += x[i]*y[i];

printf("%lf", sum);

}

void main()

{

double x[3]={1, 2, 3};

double y[3]={4, 5, 6};

double z[3]={0};

vector_add(x, y, z);

vector_dot(x, y);

}



11.

#include <stdio.h>


void main()

{

int n, a[]={1, 2, 3, 4, 5, 4, 3, 2, 1, 2};

while(1)

{

printf("찾고자 하는 상품 번호를 입력하시오(종료: -1) : ");

scanf("%d", &n);

if(n==-1) return 0; 

printf("%d번 상품은 %d번 장소에 있습니다.\n", n, a[n-1]);

}

}


12.

#include <stdio.h>


void scalar_mult (int a[][3], int scalar)

{

int  i, j;

for(i=0; i<3; i++)

{

for(j=0; j<3; j++)

printf("%2d ", a[i][j]*scalar);

printf("\n");

}

}


void transpose(int a[][3], int b[][3])

{

int i, j;

for(i=0; i<3; i++)

{

for(j=0; j<3; j++)

{

b[i][j] = a[j][i];

printf("%2d", b[i][j]);

}

printf("\n");

}

}


int main(void) 

{

int a[][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

int b[][3]={0};

scalar_mult(a, 2);

printf("\n");

transpose(a, b);

return 0;

}


13.★★★

#include <stdio.h>


void main()

{

int i, n, binary[32]={0}, count=0;

printf("10진수를 입력하시오 : ");

scanf("%d", &n);

for(i=0; i<32 && n>0; i++)

{

binary[i]=n%2;

n=n/2;

count++;

}

printf("변환된 2진수 값: ");

for(i=count-1; i>=0; i--)

printf("%d", binary[i]);

}



14.★★★

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define ROW 20

#define COL 20


int main()

{

srand((unsigned)time(NULL));

int i, j, n, m;

int visit, count=0;

int tile[ROW][COL]={0}; 

n=ROW/2, m=COL/2;

tile[n][m]=1;

while(1){

visit=0;

for(i=0; i<ROW; i++)

{

for(j=0; j<COL; j++)

{

if(tile[i][j]==1)

visit++;

}

}

if(visit==ROW*COL) break;

switch(rand()%8){

case 0 : 

if(n==0) break;

tile[n--][m]=1; 

count++; 

break;

case 1 : 

if(n==0 || m==COL-1) break;

tile[n--][m++]=1; 

count++; 

break;

case 2 : 

if(n==0 || m==COL-1) break;

tile[n][m++]=1; 

count++; 

break;

case 3 : 

if(n==ROW-1 || m==COL-1) break;

tile[n++][m++]=1; 

count++; 

break;

case 4 : 

if(n==ROW-1) break;

tile[n++][m]=1; 

count++; 

break;

case 5 : 

if(n==ROW-1 || m==0) break;

tile[n++][m--]=1; 

count++; 

break;

case 6 : 

if(m==0) break;

tile[n][m--]=1; 

count++; 

break;

case 7 : 

if(n==0 || m==0) break;

tile[n--][m--]=1; 

count++; 

break;

}

}

printf("딱정벌레의 총 이동수는 %d입니다.", count);

return 0;


15.

#include <stdio.h>

#define SIZE 100


void main()

{

int seive[SIZE]={0};  

int i, j;

for(i=2; i<SIZE; i++)

{

for(j=i+1; j<SIZE; j++)

{

if(j%i==0)

seive[j]=1;

}

}

for(i=2; i<SIZE; i++)

{

if(seive[i]==0)

printf("%d ", i);

}

}

블로그 이미지

얼음꿀차

책을 한 번 읽긴 읽어야겠는데 막상 읽자니 뭘 읽을지 고민되는 당신을 위해 읽을만한 책들을 알려드립니다!

,

LAB WEEK#8 Array

프로그래밍 2018. 11. 5. 20:39

LAB.W08(Array1)_1105.pptx


1.

#include <stdio.h>

#define SIZE 10


void main()

{

char an1;

int i, an2, arr[10]={0};

while (1) {

printf("Do you want to make a reservation?(y or n)");

scanf("%c", &an1);

if(an1 == 'y')

{

printf("---------------------------------\n");

printf("1 2 3 4 5 6 7 8 9 10\n");

printf("---------------------------------\n");

for (i=0; i<SIZE; i++)

printf("%d ", arr[i]);

printf("\n");

printf("Which seat do you want to take?");

scanf("%d", &an2);

fflush(stdin);

if(arr[an2-1]==0)

{

arr[an2-1]=1;

printf("Seat NO%d has reserved for you!\n", an2);

}

else if (arr[an2-1]==1)

printf("NO%d has already taken. You can choose another one!\n", an2);

}

else if (an1 == 'n')

break;

}


2.

#include <stdio.h>

#define SIZE 10


void main()

{

int x, i, arr[10]={0};

do {

printf("Which candidates do you want to vote?(END:-1): ");

scanf("%d", &x);

arr[x-1]++;

} while(x!=-1);

printf("No. Result\n");

for(i=0; i<SIZE; i++)

printf("%d %d\n", i+1, arr[i]);

}



3.

#include <stdio.h>


int array_equal(int a[], int b[], int size)

{

int i, sum=0;

for(i=0; i<5; i++)

{

if(a[i]==b[i])

sum+=0;

else

sum+=1;

}

if(sum==0) return 1;

else return 0;

}


int main(void) 

{

int result;

int a[5] = {1, 2, 3, 4, 5};

int b[5] = {1, 2, 3, 4, 6};


result = array_equal(a, b, 5);


printf("RESULT: %d\n", result);

return 0;

}



4.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 10

void main()
{
srand((unsigned)time(NULL));
int i, max=0, temp, k, arr[SIZE]={0};
for(i=0; i<100; i++)
{
k=rand()%10;
arr[k]++;
}
for(i=0; i<SIZE; i++)
{
if(arr[i]>arr[max])
{
temp = max;
max = i;
i = max;
}
printf("%d  %d\n", i, arr[i]);
}
printf("==========\n");
printf("가장 많이 나온 번호는 %d 입니다.", max);
}


5.

#include <stdio.h>


void scalar_mult (int a[][3], int scalar)

{

int  i, j;

for(i=0; i<3; i++)

{

for(j=0; j<3; j++)

printf("%2d ", a[i][j]*scalar);

printf("\n");

}

}


void transpose(int a[][3], int b[][3])

{

int i, j;

for(i=0; i<3; i++)

{

for(j=0; j<3; j++)

{

b[i][j] = a[j][i];

printf("%2d", b[i][j]);

}

printf("\n");

}

}


int main(void) 

{

int a[][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

int b[][3]={0};

scalar_mult(a, 2);

printf("\n");

transpose(a, b);

return 0;

}



'프로그래밍' 카테고리의 다른 글

Assignment #51 ~ #60  (0) 2018.12.19
LAB WEEK#7 Function  (0) 2018.10.31
블로그 이미지

얼음꿀차

책을 한 번 읽긴 읽어야겠는데 막상 읽자니 뭘 읽을지 고민되는 당신을 위해 읽을만한 책들을 알려드립니다!

,