俺、私の自己流C言語コーディング

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Priest
記事: 123
登録日時: 7年前
住所: 愛知

俺、私の自己流C言語コーディング

#1

投稿記事 by Priest » 7年前

今回は、技術的なことではなく、皆さんのコーディングのポリシーみたいなのを知りたくて投稿しました。

特定の言語に関わらず、見やすいコード、見にくいコード、それすら逸脱した自己流のコード、色々あると思います。
多種多様な書き方をしても(常識的な範囲内なら)、どれも同様に動いてくれますよね。

さて、ここでは、C言語の記述方法について、皆さんどんな感じにコードを書いているんだろう?などを知りたく思いました。
そこで、今から私が掲示する処理を自己流で書いてみていただけませんか?

ここでいう自己流とは、以下の条件の時に書かれる個人的なコードを指します:
 ・ 他人に見せる予定はない。
 ・ 特に急いで開発しているわけではなく、まったりと書いたもの。(コードに自分のスタンスがはっきりと出る)

処理内容を掲示した後、私もコードを書いてみるので、そのコードをコピペして自己流に置き換えるのが手っ取り早いと思います。
なお、自分のコードが、(貴方が思う)見やすいコードと逸脱しているところなどを自覚していたりしましたら、
それもコードとは別に記述していただけるとありがたいです。

あと、//や/* */といったコメントの使い方も知りたいのでそれも使う場合は使用してください。

また、変数名や関数名は私のコードに準拠していただけるとありがたいですが、自己流でも構いませんw
さらに、本トピックに限り、インデントの有無等、見やすさは一切不問とします!本来の自分を見せてください。

では、始めます。

以下に示す(a)から(g)までを全て満たす関数を書いてください。

コード:

(a) 返り値はintで、引数は4つでそれぞれ、int ,double , float ,int[]。
(b) ローカル変数宣言は整数型が4つ、小数型が4つ。
     整数型のうち、2つはカウンタ用(名前はiとj) 、他の2つのうち1つは配列型。最後の1つは0で初期化してください。
     小数型は配列型はありませんが、小数型変数1つ目と2つ目が密接に関わるものであること。
     (例: 二次元グリッドの処理をしている際に、1つ目にx軸の値,2つ目にy軸の値が入ってる程度の密接度)
(c) ローカル変数宣言の後に、(d)→(e)→(f)→(g)の順番で処理を進める。
     なお、(d)と(e)の処理は密接にかかわっており、その2つで1つの大きな処理をするものとする。
(d) 以下に示すif文を記述する。(あえてswitch文を用いてもよい。)
     もし条件1または条件2だったら、処理1~3を行う。
     上記に当てはまらず、条件3だったら、処理4を行う。
     上記に当てはまらず、条件4かつ条件5かつ条件6(4から6の条件式はすごく長いとする)だったら、処理5を行う。
     上記に当てはまらない場合、処理6と7(この処理はすごく短い)を行う。
(e) 以下に示すfor文を記述する。(あえてwhile文を用いてもよい。)
     (なお、初期化式で変数宣言する派はそれも反映させる。その際、先ほど宣言したカウンタ用変数iはここで初めて宣言する)
     次の処理を10回繰り返す。
     もし条件7を満たすならbreak文。満たさなければ処理8から10を行う。
(f) 以下に示すfor文を記述する。
     次の処理を10回繰り返す。
     処理11を行う。
(g) 以下に示すreturn文を記述する。
     条件8なら値1を返す。
     上記に当てはまらないなら『関数2』の返り値を返す。
自己流コード

コード:

// 関数の最初にコメント
int Function1 (int Argument1, int Argument2[], float Argument3, double Argument4){
    int j;                   // 変数宣言時は右側にコメント
    int Variable1[IndexNum]; // スラッシュ位置はできるだけ合わせる
    int Variable2=0;         // 変数や関数名は最初が大文字
    double Variable3,Variable4; // 不可抗力でずれてもあまり気にしない
    double Variable5;        // 小数型は大体double型を選択
    double Variable6;        // 変数宣言が終わったら1行あける

    // 処理ごとにコメントを入れる
    if(term1||term2){
        process1;
        process2;
        process3;
    }else if(term3) process4;
    else if(loooooooooooooooooooooooooongterm4&&    // 長い場合は折り返す
            loooooooooooooooooooooooooongterm5&&    // 条件式の最初の位置はそろえたい
            loooooooooooooooooooooooooongterm6) process5;
    else{ pro6; pro7; }
    for(int i=0;i<10;i++){
        if(term7) break;
        process8;
        process9;
        process10;
    } // 一つの大きな処理が終わったら1行あける

    // 1行で済ませられるならできるだけ済ます。
    for(int i=0;i<10;i++) process11;

    if(term8) return 1; else return Function2;
}
周りと違うなぁと自覚し、他人に見せる時は意識して直すところ:
 ・スペースを使わずにキツキツに詰めること
  例えば、if(term==0)って、if( term == 0 ) の方が見やすいですよね。
 ・1行で収められるならできる限り1行で!
  if(なんとか) i=0; else i=1; 等は1行で書いちゃいたい。けど、他人に見せる時は、

コード:

    if(なんとか){
        i = 0 ;
    } else {
        i = 1 ;
    }
以上です!
以下、自己流のコードを淡々と貼っていくトピックになります。
個別に返信は基本的にしません。
ではよろしくお願い致します。(コンパイルエラーだったらごめんなさいw)
最後に編集したユーザー Priest on 2013年1月23日(水) 10:25 [ 編集 1 回目 ]

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

アバター
みけCAT
記事: 6285
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: 俺、私の自己流C言語コーディング

#2

投稿記事 by みけCAT » 7年前

書いてみました。

コード:

int Function1(int Argument1,double Argument2,float Argument3,
		int[] Argument4) {
	int i,j;
	int Variale1[IndexNum];
	int Variable2=0;
	double Variable3,Variable4;
	double Variable5;
	double Variable6;
	/* 処理の内容 */ 
	if(term1 || term2) {
		process1;
		process2;
		process3;
	} else if(term3) {
		process4;
	} else if(loooooooooooooooooooooooooongterm4 &&
			loooooooooooooooooooooooooongterm5 &&
			loooooooooooooooooooooooooongterm6) {
		process5;
	} else {
		pro6;pro7;
	}
	for(i=0;i<10;i++) {
		if(term7)break;
		process8;
		process9;
		process10;
	}

	/*次の処理の内容 */
	for(i=0;i<10;i++)process11;

	return term8?1:Function2; 
}
抽象的だと若干書きにくいですね。
関数の最初を折り返しているのはエディタの幅によります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 俺、私の自己流C言語コーディング

#3

投稿記事 by softya(ソフト屋) » 7年前

数年たっても見やすいがポリシーです。

コード:

// 関数の最初にコメント
int Function1( int Argument1, int Argument2[], float Argument3, double Argument4 ) {
	int j;                   // 変数宣言時は右側にコメント
	int Variable1[IndexNum]; // スラッシュ位置はできるだけ合わせる
	int Variable2 = 0;       // 変数や関数名は最初が大文字
	double Variable3, Variable4; // 不可抗力でずれてもあまり気にしない
	double Variable5;        // 小数型は大体double型を選択
	double Variable6;        // 変数宣言が終わったら1行あける

	// 処理ごとにコメントを入れる
	//	かならず{}を使う。ネストレベルが分かりやすいから。
	if( term1 || term2 ) {
		//	条件のコメントも書く
		process1;
		process2;
		process3;
	} else if( term3 ) {
		//	条件のコメントも書く
		process4;
	} else if(  loooooooooooooooooooooooooongterm4 &&
	            loooooooooooooooooooooooooongterm5 &&
	            loooooooooooooooooooooooooongterm6 ) {
		//	条件のコメントも書く
		process5;
	} else {
		//	条件のコメントも書く
		pro6;
		pro7;
	}
	//	ここにもコメント
	for( int i=0 ; i<10 ; i++ ) {
		if( term7 ) break;
		process8;
		process9;
		process10;
	}

	//	見やすさ最優先 = カラムが揃っていること
	for( int i=0 ; i<10 ; i++ ) {
		process11;
	}
	//	ここにもコメント
	if( term8 ) {
		return 1;
	} else {
		return Function2;
	}
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Ryo

Re: 俺、私の自己流C言語コーディング

#4

投稿記事 by Ryo » 7年前

TABを多用するのでVCでしかうまく並ばないかもしれないけど
長くなってしまう弊害はあるけど、基本一行一意

コード:

////////////////////////////////
// Function1
// 戻り値の意味とか軽く説明
// 日付
////////////////////////////////
int	Function1(	int		iArgument1,		//コメがあった方がいい場合の書き方
				double	dArgument2,		//コメ
				float	fArgument3,		//コメ
				int[]	piArgument4 	//コメ
			  )
{
	int		ret(TRUE);					// 指定変数ではないが、戻り値用
	int		i,j;
	int		iVar1[ IndexNum ];			// 頭のd,iは、変数の意味や名前によって付けないことも
	int		iVar2(0);					// 例えば、cnt(カウンタ)なんかはつけない
	double	dVar3,dVar4;
	double	dVar5,dVar6;	

	//(d)
	if ( term1 || term2 )				
	{
		//コメ
		proc1;
		proc2;
		proc3;
	}
	else if ( term3 )
	{
		//コメ
		proc4;
	}
	else if (	term4	
			&&	term5					// 「//」一つで消せるので&&を前に
			&&	term6					//   a < x && x < b みたいな場合は並べることも
		)
	{
		//コメ
		proc5;
	}
	else
	{
		//コメ
		proc6;							// ブレーク用に一行
		proc7;
	}

	//(e)
	for ( i = 0 ; i < 10 ; i++ )
	{
		if ( term7 )break;
		proc8;
		proc9;
		proc10;
	}

	//(f)
	for ( i = 0 ; i < 10 ; i++ )
		proc11;

	//(g)
	if ( term8 )
		ret = 1;
	else
		ret = Function2();

	return ret;
}


nil
記事: 428
登録日時: 8年前

Re: 俺、私の自己流C言語コーディング

#5

投稿記事 by nil » 7年前

コード:

/**
*	関数の説明
*	@param	par1	引数の説明
*	@param	par2	引数の個数分記述
*	@param	par3	このようなコメントの書き方を
*	@param	par4	javadoc記法というらしいです
*	@return	返り値の説明
*/
int Function( int par1, double par2, float par3, int par4[] ){
	//	変数の宣言,個人的に宣言したときは必ず初期化します
	int		variable1[ INDEX_NUM ] = {};
	int		variable2 = 0;
	double	variable3 = 0.0;
	double	variable4 = 0.0;
	double	variable5 = 0.0;
	double	variable6 = 0.0;
	
	//	処理の内容が明白でない場合は補足
	if( term1 || term2 ){
		//	処理の説明
		Process1;
		Process2;
		Process3;
	}
	else if( term3 ){
		//	処理の説明
		Process4;
	}
	else if( "すごく長い条件"
		&& "すごく長い条件"
		&& "すごく長い条件" ){
		//	何かしらの処理
		Process5;
	}
	else{
		//	複数行のほうが見やすいので
		Pro6;
		Pro7;
	}
	
	for( int i=0; i<NUM; i++ ){
		//	~の時ループを抜ける
		if( term7 ) break;
		
		//	何かしらの処理
		Process8;
		Process9;
		ProcessA;
	}
	
	//	ここは特にこのままで
    for( int i=0; i<NUM; i++ ) ProcessB;
    
    return ( term8 ) ? 1 : AnotherFunction();
}
関数名は頭文字がCamelCase,変数名はcamelCase,定数はSNAKE_CASE
この場合返り値は三項演算子で。

コード:

if( a ) b();
else   c();
と書くこともありますが、if節のうちどれか一つにでも中括弧が入れば全てのif節に{}をつけます。

アバター
GRAM
記事: 164
登録日時: 9年前
住所: 大阪

Re: 俺、私の自己流C言語コーディング

#6

投稿記事 by GRAM » 7年前

見やすいのを目指しますが、あんま考えないこともあります。

コード:

// 関数の最初にコメントを入れるが、極力関数名で何をやる関数かわかるようにする。
int Function1( int Argument1, int Argument2[], float Argument3, double Argument4 )
{
	//むしろ変数名タブでそろえることがある
    int		j;						// 変数宣言時は右側にコメント
    int		Variable1[IndexNum];	// スラッシュ位置はできるだけ合わせる
    int		Variable2=0;			// 変数や関数名は最初が大文字
    double	Variable3, Variable4;	// 不可抗力でずれてもあまり気にしない
    double	Variable5;				// 小数型は大体double型を選択
    double	Variable6;				// 変数宣言が終わったら1行あける
 
    //処理ごとのコメントはほとんど入れないが、演算子には極力空白を入れる()の内側も空白を入れる
    if( term1 || term2 )
	{
        process1;
        process2;
        process3;
    }
	else if( term3 )
	{	
		process4;
	}
    else if( 
			loooooooooooooooooooooooooongterm4 &&
			loooooooooooooooooooooooooongterm5 && 
            loooooooooooooooooooooooooongterm6
		 )
	{
		process5;
	}
    else
	{
		pro6;
		pro7;//自分はセミコロンを1行で2回使うことはたぶんない。
	}
	//演算子をくっつけたほうがまとまりが見やすい場合は、離さない。
    for( int i=0; i<10; i++ )
	{
        if( term7 )
			break;	//ifが単体で使われる場合は{}を使わないこともあるが、行は変える
        process8;
        process9;
        process10;
    }
 
    //この辺は気分だが、たぶん一行にはしない
    for( int i=0; i<10; i++ )
	{
		process11;
	}
 
	//これ以下を一行にすることはない
    if( term8 )
	{
		return 1;
	}
	//関数の終わりがif-elseなのは気持ちが悪いので、voidでない場合はreturn文で終わる
	return Function2;
}

Poco
記事: 161
登録日時: 9年前

Re: 俺、私の自己流C言語コーディング

#7

投稿記事 by Poco » 7年前

基本的にコメントが無くても理解できるコードを目指します。

コード:

int hoge();

// 関数の最初にコメント
int Function1( int Argument1, int Argument2[], float Argument3, double Argument4 )
{
    int j; // 変数宣言時は右側にコメント。ただ、変数にコメントが必要な場合は、関数の仕事が大きすぎる場合なので後で見直す。
    int Variable1[IndexNum]; // スラッシュ位置は無駄な労力だと思っているので絶対合わせない
    int Variable2 = 0;  
    double Variable3;
    double Variable4; 
    double Variable5; 
    double Variable6;        // 変数宣言が終わったら1行あける
 
    //  かならず{}で囲う。
    if ( term1 || term2 ) {
        //  条件のコメントも書く
        //  処理が複雑な場合、コーディング前にコメントとして書いた実装の説明を残す。単純な場合は消す。
        process1;
        process2;
        process3;
    } else if ( term3 ) {
        //  条件のコメントも書く
        //  処理が複雑な場合、コーディング前にコメントとして書いた実装の説明を残す。単純な場合は消す。
        process4;
    } else if ( hoge() ) {  //  長いor複雑な条件文は別関数に。関数名はコンテキストに合ったものにする。
        //  条件のコメントも書く
        //  処理が複雑な場合、コーディング前にコメントとして書いた実装の説明を残す。単純な場合は消す。
        process5;
    } else {
        //  条件のコメントも書く
        //  処理が複雑な場合、コーディング前にコメントとして書いた実装の説明を残す。単純な場合は消す。
        pro6;
        pro7;
    }

    //  処理が複雑な場合、コーディング前にコメントとして書いた実装の説明を残す。単純な場合は消す。
    for ( int i=0 ; i<10 ; i++ ) {
        if ( term7 ) {
            break;
        }
        process8;
        process9;
        process10;
    }
 
    //  処理が複雑な場合、コーディング前にコメントとして書いた実装の説明を残す。単純な場合は消す。
    for ( int i=0 ; i<10 ; i++ ) {
        process11;
    }

    //  処理が複雑な場合、コーディング前にコメントとして書いた実装の説明を残す。単純な場合は消す。
    if( term8 ) {
        return 1;
    } else {
        return Function2;
    }
}

// 関数の説明
int hoge()
{
    //ここには自分の考えを書く
    return loooooooooooooooooooooooooongterm4 && loooooooooooooooooooooooooongterm5 && loooooooooooooooooooooooooongterm6;
}


アバター
nullptr
記事: 239
登録日時: 8年前

Re: 俺、私の自己流C言語コーディング

#8

投稿記事 by nullptr » 7年前

自己流でいい!というのなら遠慮無く書いてみようかな。行単位の見やすさ重視で、1ページに表示される行が~~とかは気にしない派です。それならディスプレイ大きくしようぜ!ってなります。
使える環境ならタブインデント多用します。幅は4です。

コード:

/*!
 *	@brief	関数要約
 *
 *	関数の詳しい説明
 *	@param	param1	引数の説明
 *	@param	param2	〃
 *	@param	param3	〃
 *	@param	param4	〃
 *	...必要に応じて更に使用方法とか、コードにドキュメント付けします。
 */
int hogeFunction( int param1, double param2, float param3, int param4[] )
{
	// ↖{の前は改行入れる
	// ローカル変数、ローカル関数名は小文字のスネークケース
	// マクロは大文字のスネークケース
	// メンバ変数、メンバ関数、グローバル関数名はキャメルケース
	// 型名はパスカルケースにしています。
	const int number_index = 10;	//!< 変数の説明
	int variable1[number_index];	//!< まぁ必要な場合だけ
	int variable2 = 0;				//!< 初期化は必要な場合のみします。今時大したことはないでしょうがムダな初期化はあまり・・・

	double variable3;	//!< 
	double variable4;	//!< 

	double variable5;	//!< 変数の意味ごとについ空行を入れる癖があります・・・
	double variable6;	//!< 
    
	// 処理の内容が明白でない場合は補足
	if( term1 || term2 )
	{
		Process1;
		Process2;
		Process3;
	}
	else
	if( term3 )
	{
		// 処理の説明
 		Process4;
	}
	else // ここで改行入れちゃうのは未だ悩むけどしている
	if( "すごく長い条件"
	 && "すごく長い条件"
	 && "すごく長い条件" )
	{
		Process5;
	}
	else
	{
		Pro6;
		Pro7;
	}
    
	for( int i = 0; i < 10; ++i )
	{
		//  ~の時ループを抜ける
		if( term7 ) break;
        
		//  何かしらの処理
		Process8;
		Process9;
		ProcessA;
	}
    
	// 短くてもちゃんと書きますね・・・
	for( int i = 0; i < 10; ++i )
	{
		ProcessB;
	}

	// 三項演算子で戻り値を分けることはよくやります。一行で済ませることもあるけどあえてわけて
	return
		( term8 )
			? ( 1 )
			: ( AnotherFunction() );
};
どっちかっていうと、クラス宣言とかの方が個性が出がちだと思うんですけどね。
 
 
✜ で C ご ✜
: す + 注 :
¦ か + 文 ¦
?
Is the は :
order C++? ✜
     糸冬   
  ――――――――
  制作・著作 NHK
 
 

閉鎖

“C言語何でも質問掲示板” へ戻る