C
C 8일차 정리
다차원 배열
#정의
배열을 입체적으로 표현한 모양
#형식
자료형 배열명[첨자1][첨자2]
사용이유
1.그림을 표현하기 위해 사용함
(그림, 게임 맵 이외에는 잘 안사용됨)
2.for문을 더 자세히 살펴보기 위해서.
3.표
#--> 이중 배열 예제
#include "stdafx.h"
#include <stdio.h>//
void main()
{
int a[3][3]={11,12,13,21,22,23,31,32,33};
int i,j;
for(i=0;i<3;++i){
for(j=0;j<3;++j)
printf(" 배열 요소 a[%d][%d]:%d",i,j,a[i][j]);
printf("\n");
}
}
-----실행결과
배열 요소 a[0][0]:11 배열 요소 a[0][1]:12 배열 요소 a[0][2]:13
배열 요소 a[1][0]:21 배열 요소 a[1][1]:22 배열 요소 a[1][2]:23
배열 요소 a[2][0]:31 배열 요소 a[2][1]:32 배열 요소 a[2][2]:33
계속하려면 아무 키나 누르십시오 . . .
-------------
#--->이중 배열 예제 2
int a[3][3]={
{11,12,13},
{21,22,23},
{31,32,33}
};
-----실행결과
배열 요소 a[0][0]:11 배열 요소 a[0][1]:12 배열 요소 a[0][2]:13
배열 요소 a[1][0]:21 배열 요소 a[1][1]:22 배열 요소 a[1][2]:23
배열 요소 a[2][0]:31 배열 요소 a[2][1]:32 배열 요소 a[2][2]:33
계속하려면 아무 키나 누르십시오 . . .
-------------
#-->5*5배열 데이터입력
void main()
{
int num_arr[5][5];
int i,j,cnt=1;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
num_arr[i][j]=cnt++;//cnt를 입력한 후 cnt에 +1을 함.
}
for(i=0;i<5;i++)
{
for(j=0;j<5;j++){printf("%d \t",num_arr[i][j]);}
printf("\n");
}
}
-----실행결과
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
계속하려면 아무 키나 누르십시오 . . .
-----------
#--->Quiz
25 24 23 22 21
20 19 18 17 16
15 14 13 12 11
10 9 8 7 6
5 4 3 2 1
--------------
void main()
{
int num_arr[5][5];
int i,j,cnt=25;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
num_arr[i][j]=cnt--;
}
for(i=0;i<5;i++)
{
for(j=0;j<5;j++){printf("%d \t",num_arr[i][j]);}
printf("\n");
}
}
-----------------
#---------quiz2
21 22 23 24 25
16 17 18 19 20
11 12 13 14 15
6 7 8 9 10
1 2 3 4 5
---------------->
void main()
{
int num_arr[5][5]={0};
int i,j,cnt=25;
for(i=0;i<5;i++)
{
for(j=4;j >= 0;j--)
num_arr[i][j]=cnt--;
}
for(i=0;i<5;i++)
{
for(j=0;j<5;j++){printf("%d \t",num_arr[i][j]);}
printf("\n");
}
}
-----------------
#--------->quiz3
1 10 11 20 21
2 9 12 19 22
3 8 13 18 23
4 7 14 17 24
5 6 15 16 25
--------------->
void main()
{
int num_arr[5][5]={0};
int i,j,k,cnt=1;
for(i=0;i<5;i++)
{
for(j=0,k=4;j < 5;j++,k--)
if(i%2==0){
num_arr[j][i]=cnt++;}
else {num_arr[k][i]=cnt++;}
}
for(i=0;i<5;i++)
{
for(j=0;j<5;j++){printf("%d \t",num_arr[i][j]);}
printf("\n");
}
}
------------------------
#------->quiz4
[ 1][ 2][ 3][ 4][ 5]
[ 2][ 3][ 4][ 5][ 1]
[ 3][ 4][ 5][ 1][ 2]
[ 4][ 5][ 1][ 2][ 3]
[ 5][ 1][ 2][ 3][ 4]
------------->
void main()
{
int num_arr[5][5]={0};
int i,j,cnt=1;
for(i=0;i<5;i++)
{cnt=i+1;
for(j=0;j < 5;j++){
if(cnt == 6){cnt=1;} //(c++%5) <= c++뒤에 %5
num_arr[i][j]=cnt++;}
}
for(i=0;i<5;i++)
{
for(j=0;j<5;j++){printf("[%2d]",num_arr[i][j]);}
printf("\n");
}
}
--------------------
#########################쌤 답안
#include "stdafx.h"
#include <stdio.h>
int main(int argc, char* argv[])
{
int num_arr[5][5];
int i, j , cnt =1;
/*
for(i=0;i<5;i++){
if( i % 2 == 1){
for(j=4;j>=0;j--)
num_arr[j][i]=cnt++;
}
else
for(j=0;j<5;j++)
num_arr[j][i]=cnt++;
}*/
for(i=0;i<5;i++){
for(j=0;j<5;j++){
num_arr[i][j] = (i+j) % 5+1;
}
}
for(i=0;i<5;i++){
for(j=0;j<5;j++){
printf("[%2d]",num_arr[i][j]);
}
printf("\n");
}
return 0;
}
###############################
#----->quiz5 달팽이 배열
심리마술
1 3 5 7
9 11 13 15
17 19 21 23
25 27 29 31
2 3 6 7
10 11 14 15
18 19 22 23
226 27 30 31
4 5 6 7
12 13 14 15
20 21 22 23
28 29 30 31
8 9 10 11
12 13 14 15
24 25 26 27
28 29 30 31
16 17 18 19
20 21 22 23
24 25 26 27
28 29 30 31
2 , 3 , 5 , 9 , 17 => 2^0~4
----------------------------------------
#수의 체계
모든 자연수는 2의 승수로 표현가능
Quiz
1) 1000만원을 연이율 24.5%의 정기예금으로 5년간 복리로 에치할 때 매년 원리금 합계를 구하는 프로그램을작성하라.
2) 체조 경기장에서 한 선수의 경기 내용을 7인의 재정관이 재정하여 최고 점수와 최소 점수를 삭제한 5명의 채점관 점수의 평균을 구하시오
3) 0~100 사이의 값을 10개를 입력하여 10 단위로 분포도를 구하시오
4) 5*5를 이용한 숫자 입력(달팽이)
@포인터
#정의
주기억장치의 특정 주소를 받는 변수
크기는 4byte(0x0012a047)
#형식
자료형*포인터 변수명;
자료형은 포인터변수와 연결할 변수와 같은 자료형이어야 한다.
#사용예
int a=10;//a변수 메모리 할당
int *pa; //pa변수 메모리 할당
pa=&a; // a의 주소를 pa에 저장
★★ &(엔퍼센트)가 주소다 int *까지가 자료형이다.
%p 포인트의 주소를 출력하는 것.
//주소를 공유하는 다른 변수, &주소를 저장하고 *로 불러옴.
#--> 포인터 예제.
#include "stdafx.h"
#include <stdio.h>//
void main()
{
char ch1= 'A', ch2;
char*ptr; //*붙으면 그 주소를 따라가 저장된 값을 불러온다.
ptr=&ch1;
ch2=*ptr;
printf("\n 변수 ch1의 주소는 %p번지 이다.",&ch1);//%p는 주소를 16진수로 표현해라.
printf("\n 변수 ptr의 내용은 %p번지 이다.",&ptr);
printf("\n 변수 *ptr의 내용은 %c이다.",&ptr);
printf("\n 변수 ch2의 내용은 '%c'이다.",&ch2);
}
----------실행결과
변수 ch1의 주소는 0012FF63번지 이다.
변수 ptr의 내용은 0012FF48번지 이다.
변수 *ptr의 내용은 H이다.
변수 ch2의 내용은 'W'이다.계속하려면 아무 키나 누르십시오 . . .
-----------------
#--->포인터 예제 2
void main()
{
int num1=10,num2;
int *ptr;
ptr=&num1;
num1++;
num2=5;
ptr=&num2;
*ptr=*ptr+num1+num2;
printf("num1=%d, num2=%d, *ptr=%d\n", num1, num2, *ptr);
}
-------실행결과
num1=11, num2=21, *ptr=21
계속하려면 아무 키나 누르십시오 . . .
--------
#----->포인터 예제3
void main()
{
p=&a
int* ptr;
*ptr= 10;
printf("%d\n", *ptr); //쓰레기값이 가르키는 곳이 정상적인 위치가 아니다.
}
-------실행결과
오류!!!!
-------------
#---->예제
#include "stdafx.h"
#include <stdio.h>//
void main()
{
char vc='A',*pc;//케릭터형은 크기가 1이라서 주소가 1씩만 바뀐다.
pc=&vc; /* 문자형 포인터*/
printf("\n pc-1=%u번지 pc%u번지 pc+1=%u번지", pc-1, pc, pc+1);
printf("\n");
}
--------실행결과
pc-1=1245026번지 pc1245027번지 pc+1=1245028번지
계속하려면 아무 키나 누르십시오 . . .
---------------
#---->예제
#include "stdafx.h"
#include <stdio.h>//
void main()
{
char vc='A',*pc;//인트형은 크기가 4라서 주소가 4씩 바뀐다.
pc=&vc; /* 문자형 포인터*/
printf("\n pc-1=%u번지 pc%u번지 pc+1=%u번지", pc-1, pc, pc+1);
printf("\n");
}
--------실행결과
pc-1=1245020번지 pc1245024번지 pc+1=1245028번지
계속하려면 아무 키나 누르십시오 . . .
-----------------
포인터와 배열
배열명은 그 배열의 시작 주소. 배열은 포인터와 동작방식이 동일
*(a+3) = a[3]
*(p+3) = p[3] ★★ 포인터의 자료형 때문에 주소가 1씩 증가하는게 아니라 다음 칸으로 이동하게 된다.
#---> 포인터와 배열의 주소.
void main()
{
int a[5]={10,20,30,40,50};
int i,*pa;
pa=a;
for(i=0;i<5;i++)
{
printf("배열의 주소%d, 배열의 값 %d\n", pa+i, *(pa+i));
}
}
------실행결과
배열의 주소1245004, 배열의 값 10
배열의 주소1245008, 배열의 값 20
배열의 주소1245012, 배열의 값 30
배열의 주소1245016, 배열의 값 40
배열의 주소1245020, 배열의 값 50
계속하려면 아무 키나 누르십시오 . . .
-------------
void main()
{
int a[5]={10,20,30,40,50};
int i,*pa;
pa=a;
for(i=0;i<5;i++)
{
printf("배열의 주소%d, 배열의 값 %d\n", pa+i, *(pa+i));
printf("배열의 주소%d, 배열의 값 %d\n", a+i, *(a+i));//a[i] a 배열의 i번째
}
}
----------실행결과
배열의 주소1245004, 배열의 값 10
배열의 주소1245004, 배열의 값 10
배열의 주소1245008, 배열의 값 20
배열의 주소1245008, 배열의 값 20
배열의 주소1245012, 배열의 값 30
배열의 주소1245012, 배열의 값 30
배열의 주소1245016, 배열의 값 40
배열의 주소1245016, 배열의 값 40
배열의 주소1245020, 배열의 값 50
배열의 주소1245020, 배열의 값 50
계속하려면 아무 키나 누르십시오 . . .
-------------------
#--->예제
void main()
{
int a=10, b[5]={1,2,3,4,5}, *p;
p =&a;
printf("(1) a= %d, *p=%d\n", a, *p);
p = b;
printf("(2) a= %d, *p=%d, *(p+1)=%d\n",a, *p, *(p+1));
(*p)++;
printf("(3) a= %d, *p=%d, *(p+1)=%d\n", a, *p, *(p+1));
}
-----결과
(1) a= 10, *p=10
(2) a= 10, *p=1, *(p+1)=2
(3) a= 10, *p=2, *(p+1)=2
계속하려면 아무 키나 누르십시오 . . .
--------
#----> putchar =한개의 글자를 출력해줌.
void main()
{
char s[]="seoul";
int i;
for(i=0; i<s[i]!=NULL;i++)//i<s[i]!=NULL -> s[i]!=NULL -> s[i]
putchar(s[i]);
}
------결과
seoul계속하려면 아무 키나 누르십시오 . . .
-----------
#---> 주소 값으로 리턴하기 call by reference <-> call by value(값으로 리턴)
void int_swap(int *x, int *y);//<-함수들은 모두 맨 위에 다 적어 줘야함.
void main()
{
int a=100, b=200;
printf("교환전:a=%d, b=%d",a,b);
int_swap(&a, &b);
printf("교환후:a=%d, b=%d",a,b);
}
void int_swap(int *x, int *y)
{
int tmp;
tmp=*x;
*x=*y;
*y=tmp;
}
--------실행결과
교환전:a=100, b=200
교환후:a=200, b=100
계속하려면 아무 키나 누르십시오 . . .
--------------
#--->함수와 포인터의 이해
void sumf(int n, int *s, int flag);
void main(void)
{
int sum=0, i=1, sum2=0;
for(;i<=10;i++){
sumf(i,&sum,0);
sumf(i,&sum2,1);
}
printf("%d\n",sum);
}
void sumf(int n, int *s, int flag){
if(n%2==flag)
*s +=n;
}
---------실행결과
30
계속하려면 아무 키나 누르십시오 . . .
----------------
구조체
#정의
여러 자료혀으로 메모리의 연속된 공간에 할당받아 사용하는 사용자 정의 자료형
#기본구조
struct tag_name{ // 구조체라는 정의로 struct 이름{ int a[10], char b, floot c; };
type variable_name;
type variable_name;
type variable_name;
};
struct A= f //로 사용
f.a //f라는 구조체 안에 있는 a라는 변수를 호출
구조체는 데이터가 모여있는 공간.
#구조체 선언
#---> 기종, 가격, 전화번호
typedef struct handphone{
char name[20];
int price;
char phone_num[14];
}HANDPHONE, *PHANDPHONE;
void main()
{
HANDPHONE phone={"INFISCAP", 800000,"010-1234-5678"};
}
#-------->
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
typedef struct handphone{
char name[20];
int price;
char phone_num[14];
}HANDPHONE, *PHANDPHONE;
void main()
{
HANDPHONE phone;
strcpy(phone.name,"INFISCAP");
phone.price = 800000;
strcpy(phone.phone_num,"010-1234-5678");
printf("%s %d",phone.name, phone.price);
}
#------> '->'연산자사용
★구조체는 변수로 할 수 있는 자료형을 모두 쓸 수 있다.
★구조체 안에도 구조체가 들어갈 수 있다.
'C'의 다른글
- 현재글C 8일차 정리