エンジニア10,000時間への道(+2h:合計22h)

今回はC言語における、プログラムについて述べようと思う。


今回、1つの目的を果たすためのプログラムを作成した、この時に、1度目に書いたプログラムでは、目的を果たすことができた。

しかし、作成したプログラムでは関数を用いて、効率的なプログラムにしようとしていた。しかし、意図とは反して、とても可読性の低いものができあがってしまった。


作成した関数は下記のようなものであり、引数を4つも使い、訳のわからないものになっていた。(1回目)

int Decision_Distance(char String, char *input_String, int len, int pos) {

int i = 0,num = 0;

for (i = 1; i < len; i++) {

if (String == input_String[pos+i]) {

num = i-1;

if (num > 7) {

num = 7;

}

i = len;

}

}

return num;

}


2回目は全く関数を使わず、フローチャートで言えば全く手順の異なるプログラムを作成し、とても可読性の高いプログラムを作成することができた。

作成したプログラムは下記のようである。


#include <stdio.h>

#include <string.h>

int main(void){

int i, j;

char str1[256],str_correct[256];

int num[7][9]={0};

char head_set[7][3]={{"X:"},{"A:"},{"B:"},{"C:"},{"D:"},{"E:"},{"F:"}};

int len=0,flag=0;

//標準入力でstr1に文字列を格納

scanf("%s", str1);

len = strlen(str1);

printf("文字列確認用:%s\n文字数%d\n", str1, len);

//探索

for (i = 0; i < len; i++) {

//A~F以外入力をされた時

if (str1[i] < 'A' || str1[i] > 'F') {

len = i;//文字列の長さ

flag = 1;//A~F以外入力をされた時フラグを立てる

printf("i:%d flag:%d\n", i,flag);

break;

}

printf("i:%d flag:%d\n", i,flag);

}

if (flag==1) {

for (i = 0; i < len; i++) {

str_correct[i] = str1[i];

}

}else{

strcpy(str_correct, str1);

}

printf("%s\n", str_correct);

for (i = 0; i < len; i++) {

switch (str_correct[i]) {

case 'A':

for (j = i+1; j < len; j++) {

if (str_correct[i] == str_correct[j]) {

if (j-i-1 <= 6) {

num[0][j-i-1]++;break;

}else if(j-i-1 >= 7){

num[0][7]++;

}else{

num[0][0]++;

}

}

}

break;

case 'B':

for (j = i+1; j < len; j++) {

if (str_correct[i] == str_correct[j]) {

if (j-i-1 <= 6) {

num[1][j-i-1]++;break;

}else if(j-i-1 >= 7){

num[1][7]++;

}else{

num[1][0]++;

}

}

}

break;

case 'C':

for (j = i+1; j < len; j++) {

if (str_correct[i] == str_correct[j]) {

if (j-i-1 <= 6) {

num[2][j-i-1]++;break;

}else if(j-i-1 >= 7){

num[2][7]++;

}else{

num[2][0]++;

}

}

}

break;

case 'D':

for (j = i+1; j < len; j++) {

if (str_correct[i] == str_correct[j]) {

if (j-i-1 <= 6) {

num[3][j-i-1]++;break;

}else if(j-i-1 >= 7){

num[3][7]++;

}else{

num[3][0]++;

}

}

}

break;

case 'E':

for (j = i+1; j < len; j++) {

if (str_correct[i] == str_correct[j]) {

if (j-i-1 <= 6) {

num[4][j-i-1]++;break;

}else if(j-i-1 >= 7){

num[4][7]++;

}else{

num[4][0]++;

}

}

}

break;

case 'F':

for (j = i+1; j < len; j++) {

if (str_correct[i] == str_correct[j]) {

if (j-i-1 <= 6) {

num[5][j-i-1]++;break;

}else if(j-i-1 >= 7){

num[5][7]++;

}else{

num[5][0]++;

}

}

}

break;

}

}

for (i = 0; i < 7; i++) {

if (i==0) {

printf("%s", head_set[i]);

for (j = 0; j < 8; j++) {

printf("%2d", j);

}

}else{

printf("\n%s", head_set[i]);

for (j = 0; j < 8; j++) {

printf("%2d", num[i-1][j]);

}

}

}

printf("\n");

return 0;

}


これはとても可読性が高いアルゴリズムである思う。

ループなどを効率的に使えていると感じる。その中でもswitchのところのみがあまり良い書き方ができたとは思えない。場合分けの中でなんどもループを作成してしまったからである。


以上。さらにアウトプットし頑張りたい。






10,000時間やってみた

10,000時間やれば誰でもプロフェッショナルになれるみたいなのでやってみます

0コメント

  • 1000 / 1000