[c言語]基礎プログラミング期間中試験準備(1-5回)


学校の授業...c言語基礎学習者は東国大学コンピュータ工学部基礎プログラミング課21年出題問題解きスレッドである.
限定時間は2時間…!

1番



これは、十進数を二進数、1の報酬、2の報酬として表す方法です.

教授コード

#include <stdio.h>

// 2진수 : 0,1로만 표현
// 1의 보수 : 각 자리가 모두 1인 수에서 주어진 2진수를 빼면 된다.
// 2의 보수 : 1의 보수에 1 더한다
#define INTSIZE 32


int main(void)
{
    
    unsigned int num,bp,ubit=0,msb;
    // ubit
    // msb
    // bp

    
    
    printf("10진수를 입력하시오 : ");
    scanf("%d",&num);
    
    bp = 0x80000000; // unsigend int 형식 0x80000000 는 2147483648 이다. 즉, 최댓값이다.
    
    for(int i=0;i<INTSIZE;i++){
        
        //num bp and연산 둘이 1로 겹칠때 1을 출력한다.
        if((num&bp)==bp){
            break;
        }
        ubit++; //비트 수 계산
//        printf("%d\n",ubit);
        bp >>= 1; // bp의 비트열을 1칸씩 오른쪽으로 이동시킨것을 넣는다.
    }
    
    msb = bp;
    
    //2진수 출력
    for(int i=0;i<(INTSIZE-ubit);i++){
        printf("%d",(num&msb)==msb);
        msb>>=1;
    }
    printf("(2)\n");
    
    //1보수 출력
    num = ~num;
    msb = bp;
    for(int i=0;i<(INTSIZE-ubit);i++){
        printf("%d",(num&msb)==msb);
        msb>>=1;
    }
    printf("(one's complement)\n");
    
    //2의 보수 출력
    num += 1;
    msb = bp;
    for(int i=0;i<(INTSIZE-ubit);i++){
        printf("%d",(num&msb)==msb);
        msb>>=1;
    }
    printf("(two's complement)\n");

    return 0;
}
本当に1日から慈悲がなかったんですね.気が狂った.普通1番は出やすいんじゃないですか...
1~5回の中で一番難しいのは...
ビット演算を復習してから見ます.呜呜...

2番


タイムヘッダファイルを持ってきて、キーを入力すればend-startでいいです.でもこれは何ですか.

教授コード

#include <stdio.h>
#include <time.h> // 시간 헤더
#include <conio.h> // 콘솔 입출력 함수 제공 헤더

// iny kbhit()
// keyboard hit 약자, 버퍼에 값 있으면 1, 없으면 0 리턴

// time_t : 리턴 타입

int main(void)
{
    
    time_t start, end;
    
    printf("key를 입력하면 시간(초) 출력됩니다.");
    
    start = time(NULL); // 1970년 1월 1일 0시 0분 0초부터, 현재까지 몇 초가 지났는지를 리턴
    
    while(1){
        if(_khbit()){ //키보드 입력이 있을때
            end = time(NULL);
            break;
        }
    }
    printf("%d 초\n",(int)(end-start)); // 지난 시간 출력
    return 0;
}
教授.冗談じゃない...vscにのみ適用されるconioヘッダファイルを使用している場合は、LinuxまたはMacユーザーはどうすればいいですか?
回ってくるのを確認できなかったので、教授の正解コードを持ってきました.
まずコードの説明は以下の通りです.
time tでtimestart、end変数を作成するとstartは100000秒に入り、5秒後にキーを入力するとendは10005秒に入り、5秒を出力します.
ああ...conio...気が狂いそう~
今回はこんな風に案内してくれるんだろうな…お願いします.

3番


うん.2つの正数unsigned intで直接受け入れ、doubleを入れます.
範囲外であればオーバーと言いますが、超えなければそのまま印刷すればいいです.
#include <stdio.h>

#define LIMIT 4294967295

int main(void)
{
    unsigned int num1,num2;
    double num3=0;
    printf("두 개의 양수를 입력하시오 : ");
    scanf("%u %u",&num1,&num2);
    
    num3 = (double)num1 + (double)num2; //double에 넣기 위해 형 변환 해주기
    
    // 범위 넘음
    if(num3>LIMIT){
        printf("unsigned int의 최대값 : 4294967295\n");
        printf("%.f 만큼 오버플로우가 발생했습니다.\n",num3-LIMIT ); // 소수점 날리기
        printf("더한 값 : %.1f\n",num3);
    }
    // 범위안
    else{
        printf("더한 값 : %.f\n",num3);
    }
    return 0;
}

注意事項

  • の2色を入れるには、2色に変換する必要があります.
  • 小数点出力%です.fと叫ぶと小数点以下は飛ぶ
  • 未署名int最大値:4294967295
  • 教授のコードもあまり悪くないので、省略しました.

    4番



    教授コード

    #include <stdio.h>
    
    #define a 0.25
    // E(0) = 1
    
    
    int main(void)
    { 
        int cnt = 0;
        double X,E = 1;
        
        printf("문자열을 입력하시오. ");
        // 문자열을 반복해서 입력받는다.
        while(1){
            scanf("%lf",&X); //문자열 입력받는 테크닉
            
            // X가 -1일때
            if(X==-1)
                break;
            
            E = a*E + (1-a)*X; // E값을 매번 초기화
            printf("E(%d) = %f\n",++cnt,E);
        }
        
    
        return 0;
    }
    これは教授の圧倒的な簡潔なコードです.
    文字列を入力する必要があるので文字列を勉強していない人にどう近づくか考えてみましたが、繰り返し文で繰り返し入力する方法があります.
    C言語で入力を受けて、ぐるっと回って、という感じなので、それは可能なようです.
    したがって,E値を初期化し,E(N)を出力し,最後のin−1が到来するたびに繰り返し文を終了すればよい.
    このハーモニーは本当に素晴らしい…!よし!

    5日


    素数判別アルゴリズムを用いた問題である.

    私が作ったコード

    #include<stdio.h>
    
    int main(void)
    {
        int cnt ,num;
        printf("n을 입력하세요 : ");
        scanf("%d", &num);
        
        for (int i = 2; i <= num; i++) // num이하
        {
            cnt = 0;
            for (int j = 2; j <= i; j++) // i이하
            {
                if (i % j == 0) // 나눠질때
                    cnt++; //cnt 올린다
            }
            if (cnt == 1) // 나눠지는 수 1개만 있을때
                printf("%d ", i);
        }
    }
    二重forゲートを実現し、1つの数で割るごとに1つのcntを上げ、cntが1のときに小数と判断して出力する方式のコード.

    教授コード

    #include<stdio.h>
    
    int main(void)
    {
        int flag=0 ,num;
        printf("n을 입력하세요 : ");
        scanf("%d", &num);
        
        for (int i = 2; i <= num; i++) // num이하
        {
            flag=0;
            for (int j = 2; j <= i/2; j++) // i이하
            {
                if (i % j == 0) // 나눠질때
                {
                    flag = 1;
                    break;
                }
            }
            if (flag == 0) // 나눠지는 수 1개만 있을때
                printf("%d ", i);
            
        }
    }
    時間的にも記憶的にも非常に効率的です.
    cntの代わりにflagを用い,true/falseで区切られた点,flag=1を用いると,文の脱出を繰り返す点,i/2で半分を検索する点がチェックとスキップが必要な点である.