エンジニア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のところのみがあまり良い書き方ができたとは思えない。場合分けの中でなんどもループを作成してしまったからである。
以上。さらにアウトプットし頑張りたい。
0コメント