C言語プログラミング問題集:二次元配列と進数変換の実装

1. プログラム補完問題

以下のコードでは、関数matrixFillerがN×Nの行列を構築する機能を持っています。行列要素の配置ルールは次の通りです:最も外側の要素はすべて値1を持つ、内側に進むにつれて第2層は値2、第3層は値3、以下同様に増加します。例えば、N=5の場合、生成される行列は:

1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1

プログラム内のアンダーライン部分を適切な内容で埋め、アンダーラインを削除してください。行の追加や削除、構造の変更は禁止されています。

#include  <stdio.h>
#define   MATRIX_SIZE   7

void matrixFiller(int target[][MATRIX_SIZE])
{ 
    int row, col, inner, layers;
    if(MATRIX_SIZE % 2 == 0) 
        layers = MATRIX_SIZE / 2;
    else       
        layers = MATRIX_SIZE / 2 + 1;
    
    for(row = 0; row < layers; row++) {
        for(col = row; col < MATRIX_SIZE - row; col++)
            target[row][col] = target[MATRIX_SIZE - row - 1][col] = row + 1;
        
        for(inner = row + 1; inner < MATRIX_SIZE - row; inner++)
            target[inner][row] = target[inner][MATRIX_SIZE - row - 1] = row + 1;
    }
}

int main()
{ 
    int matrix[MATRIX_SIZE][MATRIX_SIZE] = {0};
    int i, j;
    
    matrixFiller(matrix);
    printf("\nResult:\n");
    
    for(i = 0; i < MATRIX_SIZE; i++)
    {  
        for(j = 0; j < MATRIX_SIZE; j++)  
            printf("%3d", matrix[i][j]);
        printf("\n");
    }
    return 0;
}

2. プログラム修正問題

以下のコードでは、関数convertToBaseが10進数の正整数inputをk進数(2≦k≦9)に変換し、各桁を出力する機能を持っています。例えば、8と2を入力した場合、1000(10進数8を2進数で表した結果)を出力すべきです。

#include <stdio.h>

void convertToBase(int input, int base)
{ 
    int digits[20], index;
    
    for(index = 0; input != 0; index++)
    {
        digits[index] = input % base;
        input /= base;
    }
    
    for(; index > 0; index--)
        printf("%d", digits[index - 1]);
}

int main()
{
    int number, baseValue;
    printf("\nEnter a number and base:\n");
    scanf("%d%d", &number, &baseValue);
    convertToBase(number, baseValue);
    printf("\n ");
    return 0;
}

3. プログラム設計問題

指定されたnum個の文字列から最も長い文字列を検索し、そのアドレスをポインタmaxを通じて返す関数を作成してください(「****」を入力終了の識別子として使用)

#include <stdio.h>
#include <string.h>

char *findLongestString(char (*strArray)[81], int count, char *maxLengthStr)
{
    int idx;
    maxLengthStr = strArray[0];
    
    for(idx = 1; idx < count; idx++)
    {
        if(strlen(maxLengthStr) < strlen(strArray[idx]))
        {
            maxLengthStr = strArray[idx];
        }
    }
    return maxLengthStr;
}

int main()
{
    char inputStrings[10][81];
    char *resultPtr = NULL;
    char testStrings[3][81] = {"hello", "worldwide", "programming"};
    char *testResult = NULL;
    int counter = 0, total;
    
    printf("Enter multiple strings: ");
    gets(inputStrings[counter]);
    puts(inputStrings[counter]);
    
    while(strcmp(inputStrings[counter], "****") != 0)
    {
        counter++;
        gets(inputStrings[counter]);
        puts(inputStrings[counter]);
    }
    total = counter;
    
    resultPtr = findLongestString(inputStrings, total, resultPtr);
    printf("\nlongest=%s\n", resultPtr);
    
    testResult = findLongestString(testStrings, 3, testResult);
    printf("Test result: %s\n", testResult);
    
    return 0;
}

タグ: c-language programming-exercise array-manipulation number-conversion string-processing

5月19日 16:39 投稿