C 언어 개인 코드 요약(상)

21649 단어 C 코드 영역
만약 조건문 사용
1、생일 입력, 별자리 판단
메서드 1(초급):
    int y = 0, m = 0, d = 0;
    scanf("%d%d%d", &y, &m, &d);
    y = 2014 - y;
    if (m == 1) {
        if (d <= 21){
            printf("%d ,    
", y); } else { printf("%d ,
", y); } } else if (m == 2) { if (d <= 19){ printf("%d ,
", y); } else { printf("%d ,
", y); } } else if (m == 3) { if (d <= 20){ printf("%d ,
", y); } else { printf("%d ,
", y); } } else if (m == 4) { if (d <= 20){ printf("%d ,
", y); } else { printf("%d ,
", y); } } else if (m == 5) { if (d <= 21){ printf("%d ,
", y); } else { printf("%d ,
", y); } } else if (m == 6) { if (d <= 21){ printf("%d ,
", y); } else { printf("%d ,
", y); } } else if (m == 7) { if (d <= 22){ printf("%d ,
", y); } else { printf("%d ,
", y); } } else if (m == 8) { if (d <= 22){ printf("%d ,
", y); } else { printf("%d ,
", y); } } else if (m == 9) { if (d <= 23){ printf("%d ,
", y); } else { printf("%d ,
", y); } } else if (m == 10) { if (d <= 23){ printf("%d ,
", y); } else { printf("%d ,
", y); } } else if (m == 11) { if (d <= 22){ printf("%d ,
", y); } else { printf("%d ,
", y); } } else if (m == 12) { if (d <= 21){ printf("%d ,
", y); } else { printf("%d ,
", y); } }

메서드 2(업그레이드 버전):
    int y = 0, m = 0, d = 0;
    scanf("%d-%d-%d", &y, &m, &d);
    int days2 = 28;
    if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
        days2++;
    }
    int md = m * 100 + d;
    if ((md >= 321 && md <= 331) || (md >= 401 && md <= 419)) {
        printf("   
"); } else if ((md >= 420 && md <= 430) || (md >= 501 && md <= 520)) { printf("
"); } else if ((md >= 521 && md <= 531) || (md >= 601 && md <= 621)) { printf("
"); } else if ((md >= 622 && md <= 630) || (md >= 701 && md <= 722)) { printf("
"); } else if ((md >= 723 && md <= 731) || (md >= 801 && md <= 822)) { printf("
"); } else if ((md >= 823 && md <= 831) || (md >= 901 && md <= 922)) { printf("
"); } else if ((md >= 923 && md <= 931) || (md >= 1001 && md <= 1023)) { printf("
"); } else if ((md >= 1024 && md <= 1031) || (md >= 1101 && md <= 1122)) { printf("
"); } else if ((md >= 1123 && md >= 1130) || (md >= 1201 && md <= 1221)) { printf("
"); } else if ((md >= 1222 && md <= 1231) || (md >= 101 && md <= 119)) { printf("
"); } else if ((md >= 120 && md <= 131) || (md >= 201 && md <= 218)) { printf("
"); } else if ((md >= 219 && md <= days2) || (md >= 301 && md <= 322)) { printf("
"); } else { printf("
"); }

for와while 순환
2. 두 수의 최대 공약수와 최소 공배수를 구한다
    int a = 0, b = 0, m = 0;
    scanf("%d%d", &a, &b);
    for (int i = a; i >= 1; i--) {
        if (b % i == 0 && a % i == 0) {
            m = i;
            printf("     :%d
", i); printf(" :%d
", a * b / i); break; } }

전전 상제법(최대 공약수 구하기):
    int a = 0, b = 0;
    scanf("%d%d", &a, &b);
    int a1 = a, b1 = b;
    while (a1 % b1 != 0) {
        int x = a1 % b1;
        a1 = b1;
        b1 = x;
    }
    printf("%d
", b1);

3. 실심 마름모
메소드 1(초급)
    int n = 0;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n - i; j++) {
            printf(" ");
        }
        for (int k = 1; k <= i * 2 - 1; k++) {
            printf("*");
        }
        printf("
"); } for (int i = n - 1; i >= 1; i--) { for (int j = n - 1; j >= i; j--) { printf(" "); } for (int k = 1; k <= i * 2 - 1; k++) { printf("*"); } printf("
"); }

메서드 2(업그레이드 버전):
    int n = 0;
    scanf("%d", &n);
    
    for (int i = 1; i <= 2 * n - 1; i++) {
        int x = (2 * n - 1) - (abs(i - n) * 2);    // abs()   ;
        for (int k = 1; k <= abs(i - n); k++) {
            printf(" ");
        }
        for (int j = 1; j <= x; j++) {
            printf("*");
        }
        printf("
"); }

4. 빈 마름모꼴:
    int n = 0;
    scanf("%d", &n);
    for (int i = 1; i <= 2 * n - 1; i++) {
        int x1 = abs(i - n);//   
        int x2 = (2 * n - 1) - x1 * 2;
        for (int k = 1; k <= x1; k++) {
            printf(" ");
        }
        for (int j = 1; j <= x2; j++) {
            if (j == 1 || j == x2) {
                printf("*");
            } else {
                printf(" ");
            }
        }
        printf("
"); }

5, 99 곱셈표:
    for (int i = 1; i <= 9; i++) {
        for (int j = 1; j <= i; j++) {
            printf("%d * %d = %2d  ", j, i, i * j);
        }
        printf("
"); }

6、n개 랜덤 수 중 두 번째로 큰 수를 찾기:
메서드 1(초급):
랜덤수를 두루 훑어보고 맏형보다 크면 맏형이 원래 있던 것을 둘째에게 주도록 한다.만약에 맏이가 크지 않으면 둘째와 비교하고 둘째보다 크면 둘째와 교환한다.
    int i = 1, n = 0;
    unsigned int max = 0, sec = 0;
    scanf("%d", &n);
    while (i <= n) {
        unsigned int random = arc4random() % (60 - 20 + 1) + 20;
        printf("%u
", random); if (i == 1) { max = sec = random; } else if (i == 2) { if (random > max) { max = random; } else { sec = random; } } else if (i >= 3) { if (random > max) { sec = max; max = random; } else if (random > sec) { sec = random; } } i++; } printf("sec = %u
", sec); printf("max = %u
", max);

메서드 2(업그레이드 버전):
같은 방법과 같은 사상은 코드가 간소화되었을 뿐이다.
    int n = 0;
    scanf("%d", &n);
    unsigned int max = 0, max2 = 0;
    while (n > 0) {
        unsigned int random = arc4random() % (70 - 30 + 1) + 30;
        printf("%u
", random); if (max < random) { max2 = max; max = random; } else if (max2 < random) { max2 = random; } n--; } printf("max = %u, max2 = %u
", max, max2);

방법 3:
랜덤으로 큰 것을 둘째에게 주고 둘째는 맏이와 비교하고 큰 것은 맏이에게 준다.
 int n = 0, temp = 0;
    scanf("%d", &n);
    unsigned int max = 0, max2 = 0;
    while (n > 0) {
        unsigned int random = arc4random() % (70 - 30 + 1) + 30;
        printf("%u
", random); if (random > max2) { max2 = random; if (max2 > max) { temp = max; max = max2; max2 = temp; } } n--; } printf("max = %u, max2 = %u
", max, max2);

배열
1, 3 가지 정렬, 1 가지 검색
거품 발생:
    int array[] = {3, 2, 6, 9, 8, 5, 7, 1, 4};
    int count = sizeof(array) / sizeof(array[0]);
    int temp;
    int flag = 1;//1    ,0    
    for (int i = 0; i < count - 1 && 1 == flag; i++) {
        flag = 0;//        
        for (int j = 0; j < count - i - 1; j++) {
            if (array[j] > array[j + 1]) {
                temp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = temp;
                flag = 1;//      ,     
            }
        }
    }
    for (int i = 0; i < count; i++) {
        printf("[%2d] : %d
", i, array[i]); }

선택:
    int array[] = {3, 5, 6, 7, 8, 9, 2, 1, 4};
    int count = sizeof(array) / sizeof(array[0]);
    for (int i = 0; i < count - 1; i++) {
        int minIndex = i;
        for (int j = minIndex + 1; j < count; j++) {
            if (array[minIndex] > array[j]) {
                minIndex = j;
            }
        }
        if (minIndex != i) {
            int temp;
            temp = array[i];
            array[i] = array[minIndex];
            array[minIndex] = temp;
        }
    }
    for (int i = 0; i < count; i++) {
        printf("[%2d] : %d
", i, array[i]); }

삽입:
    int array[] = {3, 2, 6, 9, 8, 5, 7, 1, 4};
    int count = sizeof(array) / sizeof(array[0]);
    for (int i = 1; i < count; i++) {
        int temp = array[i];
        int j = i-1;
        while (j >= 0 && array[j] > temp) {
            array[j+1] = array[j];
            j--;
        }
        if (j != i-1) {
            array[j+1] = temp;
        }
    }
    for (int i = 0; i < count; i++) {
        printf("[%2d] : %d
", i, array[i]); }

절반으로 찾기:
    int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int count = sizeof(array) / sizeof(array[0]);
    int start = 0, end = count - 1, mid = 0;
    int target = 0;
    scanf("%d", &target);
    while (start <= end) {
        mid = (start + end) / 2;
        if (array[mid] > target) {
            end = mid - 1;
        } else if (array[mid] < target) {
            start = mid + 1;
        } else {
            break;
        }
    }
    if (start <= end) {
        printf("[%2d] : %d
", mid, array[mid]); } else { printf("no
"); }

2、날짜를 입력하고 이 해의 며칠째로 되돌아간다
메서드 1(초급):
잘못된 날짜를 입력하는 것을 고려하지 않은 것이 결함이다.
    int y = 0, m = 0, d = 0, days = 28, sum = 0;
    scanf("%d-%d-%d", &y, &m, &d);
    if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
        days++;
    }
    for (int i = 1; i < m; i++) {
        sum = 31 * i;
    }
    if (m > 11) {
        sum -= (4 + 31 - days - d);
    } else if (m > 9) {
        sum -= (3 + 31 - days - d);
    } else if (m > 6) {
        sum -= (2 + 31 - days - d);
    } else if (m > 4) {
        sum -= (1 + 31 - days - d);
    } else if (m > 2) {
        sum -= (31 - days - d);
    } else {
        sum += d;
    }
    printf("sum = %d
", sum);

메서드 2(업그레이드 버전, 함수 호출):
bool checkDateValiable(unsigned year, unsigned month, unsigned day)
{
    bool result = true;
    unsigned days = 0;
    switch (month) {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            days = 31;
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            days = 30;
            break;
        case 2:
            days = 28 + daysOfLeapyear(year);
        default:
            break;
    }
    if (0 == days || day > days || 0 == day) {
        result = false;
    }
    return result;
}

unsigned int daysOfLeapyear(unsigned int year)
{
    return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}
unsigned dayOfYear(unsigned year, unsigned month, unsigned day)
{
    if (!checkDateValiable(year, month, day)) {
        return 0;
    }
    int daysOfMonth[12] = {
        0,
        31,
        31 + 28,
        31 + 28 + 31,
        31 + 28 + 31 + 30,
        31 + 28 + 31 + 30 + 31,
        31 + 28 + 31 + 30 + 31 + 30,
        31 + 28 + 31 + 30 + 31 + 30 + 31,
        31 + 28 + 31 + 30 + 31 + 30 + 31 + 31,
        31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30,
        31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31,
        31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30,
    };
    int days = day + daysOfMonth[month - 1];
    if (month > 2) {
        days += daysOfLeapyear(year);
    }
    return days;
}

3. 그룹 혼란
수조는 모두 9개의 원소로 9개의 랜덤수를 생성하고 매번 랜덤수가 발생하는 범위는 9에서 1까지 차례로 줄어들며 발생하는 랜덤수는 하표로 하고 하표에 대응하는 수를 수조의 마지막 원소와 교환한다.
    int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int count = sizeof(array) / sizeof(array[0]);
    for (int i = count - 1; i > 0; i--) {
        unsigned int random = arc4random() % (i + 1);
        int temp;
    temp = array[i];
    array[i] = array[random];
    array[random] = temp;
    }
    for (int i = 0; i < count; i++) {
        printf("[%2d] : %d
", i, array[i]); }

4. 문자열 함수 구현
(1) 문자열의 길이strlen
    char string1[10] = "iphone";
    int i = 0;
    while (string1[i] != '\0') {
        printf("%c", string1[i]);
        i++;
    }
    
    printf("
"); printf("length = %d
", i);

(2) 문자열의 복사strcpy
    char string1[10] = "iphone";
    char string3[] = "android";
    int i = 0;
    while ((string1[i] = string3[i]) != '\0') {
        i++;
    }
    printf("%s
", string1);

(3) 문자열의 결합strcat
    char string1[30] = "iPhone";
    char string2[] = "android";
    int i = 0, j = 0;
    while (string1[i] != '\0') {
        i++;
    }
    while ((string1[i] = string2[j])) {
        i++;
        j++;
    }
    printf("%s
", string1);

(4) 문자열의 비교strcmp
    char string1[] = "abcd";
    char string2[] = "abed";
    int result = 0, i = 0;
    while (0 == (result = string1[i] - string2[i])) {
        if ('\0' == string1[i]) {
            break;
        }
        i++;
    }
    printf("%d
", result);

5. 2번 노선 통합
    int a1[] = {3, 6, 8, 9, 4}, a2[] = {1, 5, 2, 0, 7};
    int count1 = sizeof(a1) / sizeof(a1[0]);
    int count2 = sizeof(a2) / sizeof(a2[0]);
    int a3[count1 + count2];
    int flag = 1, temp = 0;
    for (int i = 0; i < 5 - 1; i++) {
        flag = 0;
        for (int j = 0; j < 5 - i - 1; j++) {
            if (a1[j] > a1[j + 1]) {
                temp = a1[j];
                a1[j] = a1[j + 1];
                a1[j + 1] = temp;
                flag = 1;
            }
            if (a2[j] > a2[j + 1]) {
                temp = a2[j];
                a2[j] = a2[j + 1];
                a2[j + 1] = temp;
            }
        }
    }
    int i = 0, j = 0, k = 0;
    while (i < 5 && j < 5) {
            if (a1[i] < a2[j]) {
                a3[k] = a1[i];
                i++;
                k++;
            } else if (a1[i] > a2[j]) {
                a3[k] = a2[j];
                j++;
                k++;
            }
        }
    
    while (i < count1) {
        a3[k++] = a1[i++];
   }
    while (j < count2) {
        a3[k++] = a2[j++];
    }
    for (int i = 0; i < 5; i++) {
        printf("a1[%2d] : %d
", i, a1[i]); } for (int i = 0; i < 5; i++) { printf("a2[%2d] : %d
", i, a2[i]); } for (int i = 0; i < 10; i++) { printf("a3[%2d] : %d
", i, a3[i]); }

선거
    int array[5], n = 0;
    int count = sizeof(array) / sizeof(array[0]);
    int index[count];
    for (int i = 0; i < count; i++) {
        index[i] = i;
    }
    printf("       :");
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        unsigned int random = arc4random() % ('E' - 'A' + 1) + 'A';
        array[random - 'A']++;
    }
    for (int i = 0; i < count - 2; i++) {
        for (int j = 0; j < count - i - 2; j++) {
            if (array[index[j]] < array[index[j + 1]]) {
                int temp;
                temp = index[j];
                index[j] = index[j + 1];
                index[j + 1] = temp;
            }
        }
    }
    for (int i = 0; i < count - 1; i++) {
        printf("[%c] : %d
", index[i] + 'A', array[index[i]]); } printf(" :%d
", array[4]);

7. 색인 배열 정렬
거품 발생법:
    int array[] = {3, 2, 6, 9, 8, 5, 7, 1, 4};
    int count = sizeof(array) / sizeof(array[0]);
    int index[count];
    for (int i = 0; i < count; i++) {
        index[i] = i;
    }
    int flag = 1;
    for (int i = 0; i < count - 1 && 1 == flag; i++) {
        flag = 0;
        for (int j = 0; j < count - i - 1; j++) {
            if (array[index[j]] > array[index[j + 1]]) {
                int temp = index[j];
                index[j] = index[j + 1];
                index[j + 1] = temp;
                flag = 1;
            }
        }
    }
    for (int i = 0; i < count; i++) {
        printf("[%2d] : %d
", index[i], array[index[i]]); }

선택 방법:
    int array[] = {3, 2, 6, 9, 8, 5, 7, 1, 4};
    int count = sizeof(array) / sizeof(array[0]);
    int index[count];
    for (int i = 0; i < count; i++) {
        index[i] = i;
    }
    for (int i = 0; i < count - 1; i++) {
        int minIndex = i;
        for (int j = minIndex + 1; j < count; j++) {
            if (array[index[minIndex]] > array[index[j]]) {
                minIndex = j;
            }
        }
        int temp = index[minIndex];
        index[minIndex] = index[i];
        index[i] = temp;
    }
    
    for (int i = 0; i < count; i++) {
        printf("[%2d] : %d
", index[i], array[index[i]]); }

삽입법:
    int array[] = {3, 2, 6, 9, 8, 5, 7, 1, 4};
    int count = sizeof(array) / sizeof(array[0]);
    int index[count];
    for (int i = 0; i < count; i++) {
        index[i] = i;
    }
    for (int i = 1; i < count; i++) {
        int j = i;
        int tempIndex = index[j];
        while (j > 0 && array[tempIndex] < array[index[j - 1]]) {
            index[j] = index[j - 1];
            j--;
        }
        index[j] = tempIndex;
    }
    for (int i = 0; i < count; i++) {
        printf("[%2d] : %d
", index[i], array[index[i]]); }

8、문자열의 중간 위치 찾기(면접문제)
    char string1[] = "a12b3c45def6g789";
    int i = 0, j = 0;
    while (1) {
        if ('\0' == string1[i]) {
            break;
        }
        i++;
        if ('\0' == string1[i]) {
            break;
        }
        i++;
        j++;
    }
    printf("%c
", string1[j]);

9. 2차원 그룹의'안장점'을 찾아라. 즉, 이 위치의 요소가 이 줄에서 가장 크고 이 열에서 가장 작으며 관련 정보를 인쇄한다.(팁: 안장 지점이나 여러 개의 안장 지점이 없도록 주의)
    int array[3][4] = {4, 5, 23, 7, 8, 21, 56, 65, 27, 9, 25, 62};
    int a[3] = {0}, b[4] = {0};
    int count1 = sizeof(array) / sizeof(array[0]);
    int count2 = sizeof(array[0]) / sizeof(array[0][0]);
    int max = 0, min = 0, m = 0;
    for (int i = 0; i < count1; i++) {
        max = 0;
        for (int j = 0; j < count2; j++) {
            if (max < array[i][j]) {
                max = array[i][j];
            }
        }
        a[i] = max;
    }
    for (int i = 0; i < count2; i++) {
        min = 100;
        for (int j = 0; j < count1; j++) {
            if (min > array[j][i]) {
                min = array[j][i];
            }
        }
        b[i] = min;
    }
    for (int i = 0; i < count1; i++) {
        for (int j = 0; j < count2; j++) {
            if (a[i] == b[j]) {
                printf("  [%2d][%2d] : %d
", i, j, a[i]); m = 1; } } } if (m != 1) { printf("no!
"); }

10, 1 ~ 백만 랜덤 수, 어떻게 바로 알 중복
    int a[1000001] = {0};
    while (1) {
        unsigned int random = arc4random() % (1000000 - 1 + 1) + 1;
        if (a[random] == 0) {
            a[random] = random;
            printf("[%2d] : %d
", random, a[random]); } else { printf("
"); break; } }

좋은 웹페이지 즐겨찾기