//문자를 한번에 한개씩만 출력해서 삼각형만들기
    
    /*
     
     *
     **
     ***
     ****
     *****
     
     */
    
    //출력문을 이용해서
    printf("*\n");
    printf("**\n");
    printf("***\n");
    printf("****\n");
    printf("*****\n");
    printf("\n");
    
    
    //반복문을 이용해서
    
    char star = '*';
    for (char i = 1; i < 6; i++) {
        for (char ii = 0; ii < i; ii++) {
            printf("%c",star);
        }
        printf("\n");
    }
    
    printf("\n");
    
    
    //문자를 한번에 한개씩만 출력해서 역삼각형만들기
    /*
     
     *****
      ****
       ***
        **
         *
     
     */
    
    for (char i = 6; i > 1; i--) {
        
        //공백출력
        for (char z = 6 ; z > i; z--) {
            printf(" ");
        }
        
        //별 출력
        for (char ii = 1 ; ii < i ; ii++) {
             printf("%c",star);
        }
        printf("\n");
    }

 

참고: https://blog.naver.com/tipsware/221256188057

'ios 뽀개기 > C언어' 카테고리의 다른 글

반복문 실습 - 별그리기  (0) 00:47:44
비트연산  (0) 2019.11.18
자료형  (0) 2019.11.18
c언어 기초4  (1) 2019.05.22
c언어 기초 3  (0) 2019.05.21
c언어 기초2  (0) 2019.05.17
#include <stdio.h>

//3단계 변수의 특정 비트를 0으로 만드는 예제
//dest_data 변수의 bit_num 번째 있는 비트를 0으로 설정하는 함수로 해당 비트가 0으로 설정된 값을 반환한다.
unsigned char ResetBit (unsigned char dest_data , unsigned char bit_num){
    
    //1바이트 변수라서 비트 이동은 0~7 까지 가능함
    if (bit_num < 8) {
        dest_data = dest_data & ~(0x01 << bit_num);
    }
    
    return dest_data;
}


//3단계 : 변수의 특정 비트를 1로 만드는 예제
unsigned char setBit(unsigned char dest_data, unsigned char bit_num){
    /* 1바이트 변수라서 비트 이동은 0~ 7까지 가능*/
    if (bit_num < 8) {
        dest_data = dest_data | (0x01 << bit_num);
    }
    
    return  dest_data;
}

//3단계 변수의 값을 2진수 형태로 확인하는 예제
//dest_data 변수의 bit_num 번째 비트 값을 반환하는 함수
unsigned char GetBit(unsigned char dest_data, unsigned char bit_num){
    unsigned char bit_state = 0;
    
    /* 1바이트 변수라서 비트 이동은 0 ~ 7 까지만 가능*/
    if (bit_num < 8) {
        bit_state = dest_data & (0x01 << bit_num);
        bit_state = bit_state >> bit_num;
    }
    
    /* bit_num에 지정한 비트 값을 반환함 */
    
    return bit_state;
}



int main(int argc, const char * argv[]) {


    //####################### 비트단위 연산과 비트 패턴 #############################
    
    //c언어에서 제공하는 자료형의 최소 단위는 1바이트 이다.
    //0,1 중 하나를 저장하더라도 1바이트 저장공간을 사용해야 한다...
    //but 비트 연산자를 알면 가능하다.
    unsigned char lamp_state = 0;     /* 기본값은 전등이 꺼져 있음 */
    lamp_state = 1;                 /* 전등이 켜지면 1로 변경함 */
    
    
    
    //부호 없는 1바이트 변수를 선언하고, 그 변수에 16진수 값 5A로 초기화 하는 코드.
    //16진수 한자리는 4비트.
    unsigned char data = 0x5A;      /* 2진법 : 0101 1010 , 10진수 : 90*/
    printf("%d \n" , data);           //90
    
    
    
    //시프트 연산자
    //오른쪽에서 왼쪽으로 이동
    
    unsigned char l_data = 0x1A;        /* 이동전 : 0001 1010 */
    printf("%d \n" , l_data);          //26
    l_data = l_data << 2;            /* 이동후 : 0110 1000*/
    printf("%d \n" , l_data);          //104 (26에 2의 2승을 곱한것과 같다.)
    
    //왼쪽에서 오른쪽으로 이동
    unsigned char r_data = 0x1A;        /* 이동전 : 0001 1010*/
    printf("%d \n" , r_data);          //26
    r_data = r_data >> 2;            /* 이동후 : 0000 0110*/
    printf("%d \n" , r_data);          //6 (26에 2의 2승을 나눈것과 같다.)
    
    
    //변수에 부호가 있는경우 : 부호비트가 1이면 이동한 빈 공간에 1로 채우고, 부호비트가 0이면 이동한 공간에 0으로 채운다.
    char my_data = 0x85;
    my_data = my_data >> 3;
    
    
    //지정한 비트를 0으로 설정하기 : and 연산자 사용. 한쪽 비트가 0이면 다른쪽 비트 상관없이 0
    //1단계 - 2번 비트를 0으로 설정하기
    unsigned char l_a;        /*어떤 값이 들어있는지 알 수 없다.*/
    l_a = l_a & 0xFB;       /* 2번 비트만 0으로 변경함 , FB : 1111 1011 (2번째 비트만 0으로 설정후 and 연산)*/
    printf("%d \n" , l_a);   /* 2번째 비트만 0으로 변경됨*/
    
    
    //2단계 - 임의의 비트를 0으로 설정하기 : 16진수 0xFB를 직접 명시하지 않고 2번이라는 정보만 가지고 만들기
    unsigned char l_b;                          /* 어떤 값이 있는지 알 수 없음 */
    unsigned char bit_num = 2;                  /* 0으로 만들 비트의 번호 */
    unsigned char mask = ~(0x01 << bit_num);     /* 2번 비트로 1을 옮기고 비트를 반전시킴 */
    
    l_b = l_b & mask;                         /* l_b 의 2번째 비트만 0으로 변경됨*/
    
    
    //3단계 함수로 만들어 보기
    unsigned char sample_data = 0x7F;       /* 2진수 : 0111 1111*/
    printf("%X ->" , sample_data);          /* 값 변경전 출력*/
    //변수의 3번째 비트를 0으로 설정함.
    sample_data = ResetBit(sample_data, 3);
    printf("%X \n" , sample_data);          /* 값 변경후 출력*/
    //7F ->77
    
    
    
    //지정한 비트를 1로 설정하기 : or 사용. 한쪽 비트가 1이면 다른쪽 비트값에 상관없이 1
    //1단계 : 2번비트를 1로 설정하기
    unsigned char sample_data1;                 /* 어떤값이 있는줄 알수 없음 */
    sample_data1 = sample_data1 | 0x04;       // 변수의 2번비트만 1로 변경
    
    //2단계: 0x04를 직접 명시하지 않고 2번 비트라는 정보만 가지고 만들어본다.
    unsigned char sample_data2;
    unsigned char bit_num_new = 2;                      /* 1로 만들 비트의 번호 */
    unsigned char mask_new = 0x01 << bit_num_new;        /* 0x04 */
    sample_data2 = sample_data2 | mask_new;          /* 2번 비트만 1로 변경함*/
    

    //3단계 함수로 만들어보기: 특정 비트를 1로 만드는 예제
    unsigned char my_a_data = 0x77;         /* 2진수로 0111 0111*/
    printf("%X -> " , my_a_data);           /* 값 변경전 출력*/
    my_a_data = setBit(my_a_data, 3);      /* 변수의 3번째 비트를 1로 설정함*/
    printf("%X \n" , my_a_data);          /* 값 변경후 출력*/
    //77 -> 7F
    
    
    
    
    //특정비트 값 얻기 : 변수의 비트 패턴에서 특정 비트의 값을 얻고 싶으면 비트 and 연산자를 사용한다.
    //얻고 싶은 비트 값만 1로 넣고 나머지 비트는 모두 0을 넣어서 숫자를 만들고 and 연산을 하면된다.
    //1단계
    unsigned char a;
    unsigned char bit_state;            /*2번 비트의 값을 저장할 변수 */
    bit_state = a & 0x04;             /* a의 2번 비트만 값을 유지한 상태로 bit_state에 저장함  0x04 : 0000 0100*/
    bit_state = bit_state >> 2;     /* bit_state의 값을 0또는 1로 확인가능*/
    
    
    //2단계 : 임의의 비트 값 얻기
    unsigned char my_data2;
    unsigned char my_bit_num = 2;                   /* 1로 만들 비트 번호*/
    unsigned char my_bit_state;                     /* 비트의 값을 저장할 변수 */
    unsigned char my_mask = 0x01 << my_bit_num;     /* 비트 옮긴 후 값은 0x04*/
    my_bit_state = my_data2 & my_mask;          /* my_data2의 2번 비트만 값을 유지한 상태로 my_bit_state에 저장함*/
    my_bit_state = my_bit_state >> my_bit_num;  /* 0 또는 1로 확인가능 */
    
    //3단계 : 변수의 값을 2진수 형태로 확인하는 예제
    
    int i;
    unsigned char data_state = 0x75;                /* 2진수 : 0111 0101*/
    unsigned char l_bit_state;
    //8개의 비트 값을 모두 출력하기 위해 8번 반복함
    for (i = 0; i < 8; i++) {
        
        l_bit_state = GetBit(data_state, 7 - i);
        
        /* 비트 값을 출력함 */
        printf("%d " , l_bit_state);
    }
    
    //비트값이 모두 출력되면 줄바꿈
    printf("\n");                           //0 1 1 1 0 1 0 1
    
    
    
    //보수를 이용해서 덧셈으로 뺄셈 이용하기
    /*
     255를 0으로 만드는 숫자를 찾는방법
     1111 1111 (255)
        (비트반전)
     0000 0000 (0) - 1의 보수
     
        ( +1)
     0000 0001 (1) - 2의 보수
     
     
     
     198을 0이 되도록 숫자를 찾는법
     1100 0110 (198)
        (비트반전)
     0011 1001 (57) - 1의 보수
        (+1)
     0011 1010  (58) - 2의 보수
     
     */
    
    
    
    return 0;
}




복습

V        

do it c언어 책 참고

'ios 뽀개기 > C언어' 카테고리의 다른 글

반복문 실습 - 별그리기  (0) 00:47:44
비트연산  (0) 2019.11.18
자료형  (0) 2019.11.18
c언어 기초4  (1) 2019.05.22
c언어 기초 3  (0) 2019.05.21
c언어 기초2  (0) 2019.05.17

int main(int argc, const char * argv[]) {

    //정수를 표현하는 자료형 세가지 : 1바이트 , 2바이트 4바이트
    
    /*부호가 있는 1바이트 저장공간 -128 - 127 저장가능 */
    signed char temperature;
    // 오류 : Implicit conversion from 'int' to 'signed char' changes value from -129 to 127
    //temperature = -129;
    
    temperature = -2;
    printf("%d \n", temperature);
    
    
    
    /* 부호가 없는 1바이트 저장공간 0 ~ 255 저장가능 */
    unsigned char age;
    age = 255;
    printf("%d \n" ,age);
    
    
    /* 부호가 있는 2바이트 저장공간 */
    //16비트 크기의 자료형이다. 첫 1비트를 부호비트로 사용해서 나머지 15비트에만 숫자를 저장한다.  -32,768 ~ -1 ,  0 ~ 32,767
    signed short int dday;
    dday = 3200;
    printf("%d \n" ,dday);
    
    
    /*부호가 없는 2바이트 저장공간*/
    //16비트 저장공간이 있기 때문에 0~ 36,000 저장가능
    unsigned short int seconds;
    seconds = 36000;
    printf("%d \n" , seconds);
    
    
    
    /*부호가 있는 4바이트 저장공간*/
    //총 32비트 중에서 부호비트 1을 뺀 31 비트의 저장공간을 가진다. -2,147,483,648 ~ -1  , 0 ~ 2,147,483,647
    signed long int money;
    money = 700000;
    
    
    /*부호가 없는 4바이트 저장공간*/
    unsigned long int time_seconds;
    //1970년 1월 1일 부터 현재 까지 흐른시간을 초단위로 환산한 값을 저장함
    time_seconds = 1453100624;
    
    
    return 0;
    }

 

복습 

V        

do it c 언어 참고

'ios 뽀개기 > C언어' 카테고리의 다른 글

반복문 실습 - 별그리기  (0) 00:47:44
비트연산  (0) 2019.11.18
자료형  (0) 2019.11.18
c언어 기초4  (1) 2019.05.22
c언어 기초 3  (0) 2019.05.21
c언어 기초2  (0) 2019.05.17

NSNotification 예제

최상위뷰가 있다.

최상위 뷰에서 부모뷰를 띄웠다. 

부모뷰에서 자식 뷰를 띄웠다.

 

이때, 자식뷰를 닫을때 부모뷰까지 같이 닫아 줘야하는 요구사항이 있다. 이럴때는 NSNotification 을 사용한다.

 

먼저 부모뷰에 NSNotification 설정과 콜백메소드(편의상 이렇게 부르겠다)를 작성해준다.

viewdidload{

    //노티피케이션 등록 - 자식창을 닫을때 이곳(부모)도 닫히게 노티 등록

    [[NSNotificationCenter defaultCenter] addObserver:self

    selector:@selector(closeViewControllerBySelf:)

        name:@"close"

      object:nil];

}

이렇게 셋팅을 해주고 호출될 메소드를 작성해준다.

//자식창 닫힐때 부모창도 같이 닫히게

-(void) closeViewControllerBySelf:(NSNotification *) notification{

    NSLog(@"부모창이 콜되었습니다.");

    NSString *message = [notification.userInfo objectForKey:@"message"];

    NSLog(@"자식창에서 던져준 메시지 :  %@", message); //취소팝업 뷰 컨트롤러에서 던진 확인용 메시지입니다

    //화면닫기

    [self dismissViewControllerAnimated:YES completion:^{

        //부모창 닫기 성공

    }];

}

이제 자식 뷰 로직을 보자.

//닫기 버튼 눌렀을때!

- (IBAction)cancelAction:(id)sender {    

    //창 닫기

    [self dismissViewControllerAnimated:YES completion:^{

        //창이 닫힐때 작성을 해주어야 한다. 위에 작성하면 이 창을 호출한 부모창은 닫히지 않는다.

        NSDictionary *userInfo = @{ @"message": @"취소팝업 뷰 컨트롤러에서 던진 확인용 메시지입니다." };

        [[NSNotificationCenter defaultCenter] postNotificationName:@"close"

                                        object:nil

                                        userInfo:userInfo];

        // [[self view] removeFromSuperview];

    }];

}

 

자식뷰에서 창이 닫힐때 NSNotificationCenter를 이용해서 postNotificationName에해당 이름을넣고 창을 닫아주면,부모창의 NSNotificationCenter메소드가 호출된다

참고:http://seorenn.blogspot.com/2014/05/cocoa-nsnotification.html

30초 카운트 다운 타이머 만들기 

(countdownlabel 객체는 storybord에 미리 만들어 놓는다.)

#import <UIKit/UIKit.h>

@interface SosRequestViewController : UIViewController 

//타이머 객체

@property(strong,nonatomic)  NSTimer *CountDownTimer;

@property (nonatomic, assign) NSInteger second;

@end

 

.m

//타이머 시작!
-(void)startTimer{
    
        //폰트를 넣어줘야, lable 위치가 흔들리지 않는다.
        UIFont *myfont = [UIFont monospacedDigitSystemFontOfSize:_countDownLabel.font.pointSize weight:UIFontWeightRegular];
        //타임 인터벌 변수 초기화
        _second = 30;
        //타이머 시작 - 화면에 촬영시간 표시해주기
        _CountDownTimer =  [NSTimer scheduledTimerWithTimeInterval:1.0 repeats:YES block:^(NSTimer * _Nonnull timer) {
        self-&gt;_second -= 1;
        
        NSString *labelContent = [NSString stringWithFormat:@"미입력시 %0.2ld초 후 \n구조요청이 자동으로 발송 됩니다.", self-&gt;_second];
        
        //줄간격 조정
        NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:labelContent];
        NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
        //줄간격
        [paragraphStyle setLineSpacing:12];
        //가운데 정렬
        [paragraphStyle setAlignment:NSTextAlignmentCenter];
        //속성 셋팅
        [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [labelContent length])];
            
        //폰트를 넣어줘야 라벨 위치가 흔들리지 않는다.
        self-&gt;_countDownLabel.font = myfont;
        //라벨의 줄 라인 무한대로
        [self-&gt;_countDownLabel setNumberOfLines:0];
        
        self-&gt;_countDownLabel.attributedText = attributedString;
            
            
        if(self-&gt;_second == 0){
            
            //타이머 정지
            [self-&gt;_CountDownTimer invalidate];
            self-&gt;_CountDownTimer = nil;
            
            //타이머 라벨 및 변수 초기화
            self-&gt;_countDownLabel.text = [NSString stringWithFormat:@"미입력시 %0.2d초 후 \n구조요청이 자동으로 발송 됩니다.", 30];
            //폰트를 넣어줘야 라벨 위치가 흔들리지 않는다.
            self-&gt;_countDownLabel.font = myfont;
            //라벨의 줄 라인 무한대로
            [self-&gt;_countDownLabel setNumberOfLines:0];
            self-&gt;_second = 30;
            //자동으로 구조요청 sms 발송
            //[_recordButton sendActionsForControlEvents:UIControlEventTouchUpInside];
            
        }
    }];
}

 

//단순 메시지 전달해서 팝업 띄우기 메소드

- (void)popUpWithMessage:(NSString *)message {

   

    UIAlertController * alert=   [UIAlertController

                                  alertControllerWithTitle:@"알림"

                                  message:message

                                  preferredStyle:UIAlertControllerStyleAlert];

    

    UIAlertAction* ok = [UIAlertAction

                         actionWithTitle:@"OK"

                         style:UIAlertActionStyleDefault

                         handler:^(UIAlertAction * action)

                         {

        [alert dismissViewControllerAnimated:YES completion:nil];

        

    }];

    

    

    [alert addAction:ok];

    

    

    [self presentViewController:alert animated:YES completion:nil];

 

}

.h

//인디케이터 객체 선언

@property (nonatomic, retain) UIActivityIndicatorView *activityIndicator;

 

.m

//인디케이터 시작

-(void)startIndicater{

    NSLog(@"인디케이터 시작");

    // ProgressBar Setting

    _activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 32, 32)];

    [_activityIndicator setCenter:self.view.center];

    [_activityIndicator setColor:UIColor.whiteColor];

    if (@available(iOS 13.0, *)) {

        [_activityIndicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleLarge];

    } else {

        // Fallback on earlier versions

        [_activityIndicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhiteLarge];

    }

    [self.view addSubview : _activityIndicator];

    

    // ProgressBar Start

    _activityIndicator.hidden= FALSE;

    [_activityIndicator startAnimating];

}

 

//인디케이터 종료

-(void)endIndicatter{

    NSLog(@"인디케이터 끝");

    [_activityIndicator stopAnimating];

    _activityIndicator.hidden= TRUE;   

}

  //디바이스 사이즈 구하기

  CGRect screenRect=[[UIScreen mainScreen]bounds];

  CGFloat deviceWidth=screenRect.size.width;

  CGFloat deviceHeight=screenRect.size.height;


//xib
파일 이름으로 뷰컨트롤러 객체 생성

_cancelViewController=[[CancelViewController alloc]initWithNibName:@"CancelViewController" bundle:nil];

 

//상단에 얻은 디바이스 크기로 뷰를 호출하기전에 리사이즈 합니다.

[_cancelViewController.view setFrame:CGRectMake(0, 0, deviceWidth, deviceHeight)];

 

 //취소 알림창 뷰 컨트롤러 띄워주기

[self presentViewController:_cancelViewController animated:YES completion:nil];

viewDidLoad 에서 alertViewController를 띄우면 계층구조 오류 메시지를 던지고 alert가 뜨지 않는다. 처음에는, 뷰가 로드 되었는데 왜 안떠? 라고 생각하고 구글에서 삽질을 좀 했다. 알고봤더니 뷰가 로드는 되었지만 나타나지는 않았기 때문에 viewDidLoad에서 alert 를 띄우면 alert를 띄울수 있는 부모 viewcontroller가 없다고 난 에러였다. 그래서 viewController에서 alert를 띄울려면 viewDidLoad 말고viewDidAppear 이나 다른 메소드를 만들어서 alert를 띄어줘야 한다.

문자 타입의 바이트를 NSData타입으로 변환

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface Util : NSObject

// 문자 타입의 바이트를 NSData타입으로 변환
+(NSMutableData *)convertStringToNSData:(NSString *) bytesString;

@end

NS_ASSUME_NONNULL_END

 

#import "Util.h"

@implementation Util
// 문자 타입의 바이트를 NSData타입으로 변환
+(NSMutableData *)convertStringToNSData:(NSString *) bytesString{
    //넘어온 문자형식의 byte
    NSString *signNum = bytesString;
    
    signNum = [signNum stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSMutableData *commandToSend= [[NSMutableData alloc] init];
    unsigned char whole_byte;
    char byte_chars[3] = {'\0','\0','\0'};
    int i;
    for (i=0; i < [signNum length]/2; i++) {
        byte_chars[0] = [signNum characterAtIndex:i*2];
        byte_chars[1] = [signNum characterAtIndex:i*2+1];
        whole_byte = strtol(byte_chars, NULL, 16);
        [commandToSend appendBytes:&whole_byte length:1];
    }
    NSLog(@"Util에서 변환한 결과값 : %@", commandToSend);
    
    return commandToSend;
}


@end

+ Recent posts