• ベストアンサー

C/C++ ソースのコーティングについて

最近、C/C++ ソースのコーディングに関して興味を持ちました。 そこで質問します。 皆様は普段プログラムを書くときにどんなコーディングをしていますか。 人それぞれ記述が異なると思いますが、何か自分の中でのコーディング・ルールが あれば教えて下さい。できるだけ詳しくお聞きしたいです。 ちなみに私の場合は (1)return、sizeof 演算子には必ず括弧を付けます。 (2)if、else、while、for には必ず{、}のブロックを記述して省略しません。 (3)関数を呼び出すとき、引数と引数はスペースを必ず挿入します。→strcpy( s, t );  ただし、if、while、for の条件式の中ではスペースを入れません。→while ( fgets(buff,sizeof(buff),fp) != NULL ){ … } (4)2項(3項)演算子はスペースを両端に挿入します。→ret = 2 + 3;  単項演算子はスペースは挿入しません。→i++、*str (5)ブロックのインデントは  if ( 条件式 ){   処理  }  else{   処理  } などがあります。 特に詳しく知りたいのは(5)です。 タイプ1 if ( 条件式 ){  処理 } else{  処理 } タイプ2 if ( 条件式 ){  処理 }else{  処理 } タイプ3 if ( 条件式 ) {  処理 } else {  処理 } タイプ4 if ( 条件式 )  {  処理  } else  {  処理  } それではコーディング・ルール(こだわり)などを教えて下さい。 なお、今回の質問は、より見やすいコーディングを目指しての質問です。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

Unixで使うEmacsでは字下げ動作をカスタマイズする機能が用意されていて コーディングスタイルに名前がついています。 名称は以下のようになっております。 CC-MODE  デフォルトのコーディングスタイルで、他のスタイルはすべてここから派生している。 GNU      Emacs自体とGNU関連のプログラムのCコードに使われるスタイル K&R      古典的教科書Kernighan&Richie著「The C Programing Language」のスタイル BSD      UNIXのBSDバージョンのコードに使われるスタイル Stroustrup    標準の参考書BjarneStroutstrup著「The C++ Programing Language」のC++コーディングスタイル。 Whitesmith    Whitesmith社のC/C++コンパイラのドキュメントで使われるスタイル Ellemtell     スウェーデンのEllemtel Telecommunication Ssystems Laboratories社のスタイル                     「入門 Gnu Emacs」(Debra Cameron著、オライリー・ジャパン)より プログラマーは、プロジェクトや職場のやりかたにあわせることが多いみたいですが 参考にして下さい。

Oh-Orange
質問者

お礼

新情報の回答をありがとうございます。 コーディングのスタイルを複数用意してその場で合わせる考えですか。 今までの仕事では、コーディングのスタイルに関しての決まりがありませんでしたが、 会社によっては決められたスタイルがあると聞いた事がありました。 私はK&Rのコーディング・スタイルくらいしか本で見たことがなかったので とても参考になります。 ありがとうございました。

その他の回答 (5)

  • m_mik
  • ベストアンサー率26% (31/117)
回答No.6

10人でプロジェクトを組めば、10人全員が違ったコーディングをするというぐらい、様々なコーディングルールがありますよね。 (まとめ役の人は、いつも大変です) もちろん、プロジェクトで決まったコーディングルールがあればそれに従いますが、1人だけでプログラムを組む場合にはということで… (1) return、sizeofにはつけない。 特にreturnは#4さんの仰ってる通り、関数と混同されるのを避けるためです。 (2) 昔は{}の省略を行うようにしていたのですが、今は必ずつけるようにしています。 後でデバッグのときにprintfを挿入したりするときに面倒にならないためという感じです。 (3) 関数への引数は、strncpy(src , dst);のような感じで書いています。 普通はstrcpy(src, dst)の様に書くと思うのですが、くっついていると見落としてしまうかも知れないということで離しています。 if、whileの場合には、if、whileの直後を空白にしています。 while (fgets(buff , sizeof(buff) , fp) != NULL) のように… ifやwhileの後を空けるのは”関数ではない”ということを分かりやすくするためにという感じです。 (4) 同じ記法です。 (5) インデントの揃え易さから if (条件式) {   処理 } else {   処理 } のような感じで記述しています。 この記法は、自然と行が増えるので管理している方からは嫌がられます。(笑)

Oh-Orange
質問者

お礼

回答ありがとうございます。 exit() 関数と同じ感覚で return() を今まで使ってきましが、 やはり return、sizeof にはカッコはつけない方が良さそうですね。関数ではないし。 (3)の仮引数の記述を最近このQ&Aで知りました。 この方法も見やすいですね。 私も if、while などは空白を1つ必ず入れています。これは m_mik さんの仰るとおりで 関数ではないと分かりやすくする為に入れています。return なども合わせるべきですね。 あとブロックのインデントはタイプ3は行数が増えるのでタイプ1にしていますが、 最近タイプ2に変えようかと思っています。理由はエディタの機能で{ }文字の対応位置の 移動機能があり、CTRL+[ で{→}へ、SHIFT+1 で行の最後に移動することで if、else if else のブロックに数個のキーで移動できるためです。その他、タイプ1の表記に似ているので 馴染みやすいからです。 今回の質問は、いろいろなご意見を聞けたのでかなり満足しています。 これらの回答より、これからのコーディングをもう一度考えて行こうと思います。 うろ覚えで使っていた言葉(コーディング)も含め参考になりました。 コーティングじゃなかったですね。何?この言葉?でも意味が通じてよかったです。 皆様、貴重なご意見を有り難うございました。 以上をもって締め切ります。

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.4

1) sizeof(型名)の場合は括弧が必須なのでつけますけど、それ以外はsizeof 変数 の場合なども含め付けません。 括弧があるとtypoがエラーにならない(retrunという関数があると認識されてコンパイルは通る)とか 理由はありますが、昨今のエディタは色が付くので見れば分かったりもします。 (実機でviとかだと色が付けられなかったりすることもあるので、時に有用ですけど) 2) これは省略しません 。 3) strcpy(s, t); 4) ret = 2 + 3; i++、*str 5)   if(条件式)   {     処理   }   else   {     処理   } ハンガリアンは使ってません。ラクダ表記も使ってません。 boostやISO/IEC14882(C++の言語仕様書)のコード同様に、小文字ベースで命名してます。 # これがJavaで書くとなれば、Sunの標準にあわせてこんな感じになりますが。 #  if (条件式) { #    処理 #  } else { #    処理 #  } # C++ならdata_numberだし、JavaならdataNumberと書く。 # (それ以前に「でーたなんばー」なんて内容の分からない名前つけないけど…例に合わせて) 10 == a のような逆転は昔やってましたが、コンパイラがちゃんと警告してくれる 時代になったので、読みにくいし止めました。 JavaDoc/Doxygenは私も使ってますので、コメントは勢いこの形式になります。

Oh-Orange
質問者

お礼

朝早くからの回答をありがとうございます。 return 文に括弧はつけるな!というのは昔、本で読んだ記憶があります。 確かに括弧を付けなければ retrun のタイプミスがコンパイルエラーで検出されますね。 普段、ワーニングレベルは一番(高=W4)に設定していて、警告メッセージをエラーにする オプションを付けています。それでも retrun() 関数があるとリンクエラーにもなりませんね。 昔のことを思い出しました。最近、return 文に括弧を付けるべきかどうか考えていたので sizeof も含めて参考になりました。 あと JavaDoc/Doxygen は便利そうですね。 これからコーティング方法を少し新しくしようと思っています。 ありがとうございました。

  • Interest
  • ベストアンサー率31% (207/659)
回答No.3

コーディングスタイルは百人百様ですよね~。育ってきた文化が見える気がします。 私は、仕事ではその部署/製品で使われているコーディングスタイルに合わせています。個人的には、Windowsのプログラミングでよく見かけるハンガリアン表記は嫌い。 参考:ハンガリアン表記http://live.under.jp/todashou/tips/code_writting/notation.html 仕事を離れた趣味のプログラミングではJavaのコーディング規約をC++風にアレンジして、コメント文のつけ方はDoxygenでソースコードから仕様書に引っ張り出せるようJavaDocスタイルにしています。 参考:Doxygen http://www.doxygen.jp/ 細かい「マイルール」では、 比較演算では、定数を左に置く。 × if( a == 10 ) ← if( a = 10 ) のような間違いを防ぐため ○ if( 10 == a ) とか。 (5)ブロックのインデントは、以前はタイプ1でしたが、最近はタイプ3を使っている気がします。というのは、新しく使い始めた統合開発環境のエディタが勝手に直しちゃうからというのと、中括弧のはじめと終わりが同じ列にあったほうが対応関係が分かりやすいから、という理由からです。

Oh-Orange
質問者

お礼

回答ありがとうございます。 私も最初は Windows のハンガリアン表記が気に入りませんでした。 ハンガリアン表記のことは C 言語を学んだ最初から知っていましたが、違和感があって 馴染めませんでした。今は Windows のプログラミングを行っているためか慣れましたし、 考え方を変えました。前は data_number という感じでアンダースコア文字で区切っていました。 今は nDataNumber という感じで大文字と小文字を混ぜてアンダースコア文字は記号定数の 時しか基本的に使いません。 あと JavaDoc スタイルに興味が出ました。ちょっと調べてみます。 ありがとうございました。

noname#38837
noname#38837
回答No.2

if文は処理が短いときは{}をつけないこともあります(例外処理などに飛ばすとき等) if (a) func(); とか。 また、elseがある場合は if (a) { .... } else { .... } という風に書きます ()の前後と,の後と演算子の前後はスペースを入れてます 宣言時、 型* 変数名; ではなくて 型 *変数名; と書きます ですがこういう記述は些細なことだと思ってます 人によって違うのはあまり気にしないですし 開発環境のサポートがあるので ソースをエディタでベタ打ちしていたころと比べたらゆるくなってます あとは引数を改行して書くとき func( a  ,b ,c ) という感じでカンマを先につけてしまいます 引数の追加削除がしやすいので。

Oh-Orange
質問者

お礼

参考になる意見を待っていました。 引数を改行してカンマを前に出すのは『なるほど』感心しました。 見やすい以外にカンマの追加、削除のしやすさには気づきませんでした。 私も引数が多き場合は、引数単位で行分割していますがカンマはいつも最後でした。 考え方の参考になります。 ありがとうございました。

  • plantarum
  • ベストアンサー率53% (42/79)
回答No.1
Oh-Orange
質問者

お礼

回答ありがとうございます。 コーティングについての本があるのですね。 前に本屋で『プログラミング作法』という本をぺらぺらと読んだことがありましたが、 リンクで紹介されている本も興味深いですね。 本の紹介ありがとうございました。

関連するQ&A

  • プログラムソースの誤りを教えてください

    CSVファイル(カンマでデータの要素が区切られている)の左から数えて15個目と16個目の間のデータを読みとるプログラムをつくりたいのですが、できません。どこがおかしいのか教えてください。 #include<stdio.h> int main(){ FILE *fp; char buff[562],yakusyoku[10]; int youso,n,konma; fp = fopen("jinji.csv","r"); if(fp == NULL) exit(1); fgets(buff,sizeof(buff),fp); n = 0,youso = 0,konma = 0; while (youso < sizeof(buff)){ if(buff[youso] == ','){ konma++; if (konma == 15){//カンマが15個になったら次の処理を行う while(buff[youso] != ','){//次のカンマ(16個目のカンマに会うまで次の処理を行う) yakusyoku[n] = buff[youso]; youso++,n++; break; } } } youso++; } fclose(fp); }

  • ある関数のソースがわかりません。

    KOKUGO=100 SUUGAKU=80 RIKA=0 SYAKAI=60 というファイルを取得して数字だけ構造体に渡す関数のソースです。 define KOKUGO 3; define SUUGAKU 2; define RIKA 1; define SYAKAI 2; 構造体は typedef struct{ char koku[KOKUGO +1]; char suu[SUUGAKU +1]; char rika[RIKA + 1]; char sya[SYAKAI + 1]; }data; です。 全体ではデータを読み取ってcsv形式で出力するプログラムなんですが main関数、出力関数はちょっと省きます。 int Readfile(data *txtfile, char *ptxt) { FILE *fp; char *fullcode = NULL; char search = '='; char buff[30] = {'\0'}; int enum[4] = {'\0'}; int err = 0; char *rtxt = NULL; /*ファイルオープン*/   fp = fopen(ptxt, "r"); if(fp == NULL){ puts("オープンエラー"); return(1); } /*ファイル読み取り*/   while(1){ /*データを一行ずつ読み取り*/    rtxt = fgets(buff, sizeof(buff), fp); if(rtxt == NULL){ break; } /*データ名確認*/    if(strncmp(buff, "KOKUGO=", 7) == 0){ ••••••••••• (1) /*'='を含むデータ確認*/   fullcode = strchr(buff, search); /*'='より後ろの点数確認*/ fullcode += 1; /*点数桁数確認*/   if(strlen(fullcode) == KOKUGO + 1){ /*構造体に点数のみ格納*/     strncpy(txtstr -> koku, fullcode, KOKUGO); enum[0] += 1; }else{ puts("データが違います") return(1); } }else if(strncmp(buff, "SUUGAKU=", 8) == 0){   fullcode = strchr(buff, search); fullcode += 1;   if(strlen(fullcode) == SUUGAKU + 1){     strncpy(txtstr -> suu, fullcode, SUUGAKU); enum[1] += 1; }else{ puts("データが違います") return(1); } } else if(strncmp(buff, "RIKA=", 5) == 0){   fullcode = strchr(buff, search); fullcode += 1;   if(strlen(fullcode) == RIKA + 1){     strncpy(txtstr -> rika, fullcode, RIKA); enum[2] += 1; }else{ puts("データが違います") return(1); } } else if(strncmp(buff, "SYAKAI=", 7) == 0){   fullcode = strchr(buff, search); fullcode += 1;   if(strlen(fullcode) == SYAKAI + 1){     strncpy(txtstr -> sya, fullcode, SYAKAI); enum[3] += 1; }else{ puts("データが違います") return(1); } } } for(err = 0; err < 4; err ++){ if(enum[err] != 1){ puts("データが違います"); return(1); } } /*ファイルを閉じる*/   fclose(fp); return(0); } という風に書いてあるんですが(1)の部分で7文字比較して等しければ 次の/*'='を含むデータ確認*/に進むと思うんですが等しくなければ どういう処理が行われ、どこに進むのかわかりません。 基本的にこの無限ループの流れがわかりません。 このソースの読み方を教えてください。 友達が以前書いたソースなんですが聞いてももうわからないらしくて・・・。    すいませんが、勉強し始めたばかりなので詳しくお願いします。

  • if文で…

    いつもお世話になっております。 ------------------------ typedef struct douken_ { char tiku[11]; char ken[9]; } douken; int main(void){ FILE *fp; douken dou [100]; char buff [18 /* douken */ + 2 /* CrLf(\n\r) */ + 1 /* \0 */]; int i; i = 0; fp = fopen("ex3.fil","rb"); if ( fp == 0 ){ printf("can't open\n"); exit(1); } memset (dou , '\0' , sizeof dou); memset (buff, '\0' , sizeof buff); 問題はここから----------------- while (fgets(buff,sizeof buff,fp) != NULL){ memcpy(&dou[i].tiku ,buff,10); memcpy(&dou[i].ken ,buff+10,10); if (&dou[i].tiku == &dou[i-1].tiku){ printf("%s %s",&dou[i-1].tiku,&dou[i].tiku,&dou[i].ken);} else{ printf("-----------------------"); } ------------------------ 上記のプログラムでは ファイルから読み込んだデータを 構造体に格納して if文で現データと全データを 比較するという処理をしています。(つもり) 構造体に格納するところまでは 出来たのですが if文のところが上手く行きません。 例えば 現データ(tiku)関東地区 前データ(tiku)関東地区 と、同じ場合は 関東地区 東京 と、表示したいのに ----------- と、elseの処理をしてしまいます。 対処方法をご存じでしたら、 ご教授して頂けたら幸いです。

  • C# こういう場合ってどうなるの?

    public void A(bool b) {   if(b ? B() : C())//分かると思いますが、三項演算子   {     //略   } } public bool B() {   return true; } public bool C() {   return false } 上記のAにtrueを渡し実行した場合、 if文の中はどうなるのでしょうか? 引数がtrueならBを実行し、Bの戻り値trueが if文で処理され、if内に入る・・・でよろしいのでしょうか? それとも引数bの評価がそのままifで使われるのでしょうか? 例えばのコードなので、bだろうがBだろうが変わらない・・・みたいな 回答はご遠慮ください。

  • 偶数パリティ

    引数で渡されたデータの最上位ビット偶数パリティを付加する以下の関数について、空欄(1)~(3)に入る値または式について、考えているのですが、どうしても分かりません。自分なりに出した回答について、ご指摘や解説をいただければと思います。 void AddParity(unsigned int :src) { int bit; int cnt; int i; bit = sizeof(int) : { (1) }; for (i = 0, cnt = 0;{ (2) }; i++){ if (*src & (1 << i)) cnt++; } if (cnt & 1) *src |= 1 << (bit -1); else *src{ (3) } ~(1 << (bit -1)); } (1)について 変数「bit」の初期値設定ですが、sizeof関数に何を乗じるのか分かりません。 (2)について for文の条件についてですが、「cnt < ??」 だとは思うんですが、??が分かりません。 (3)について シフト演算で、偶数パリティを付加する処理だろうとは思うんですが、 何が入るのか分かりません・・・

  • 配列のポインタについて

    C言語で処理が下記のような処理を作成したいと思っております。 関数の引数によって、データを代入する配列を切り替えたいと考えております。 下記のような処理を考えた場合、if文の中・for文のbuffをどのように処理すれば よいでしょうか? アドバイスよろしくお願い致します。 int a[100][150]; int b[100][150]; void sample(int flg) { int i,j; unsigned short *buff; if(flg == 0){ buff = &a; }else{ buff = &b; } for( j=0 ; j<100 ; j++ ){ for( i=0 ; i<150 ; i++ ){ buff[y][x] = data; x++; } x = 0; y++; } }

  • ファイルから読み取った「行の長さ」は・・?

    すみません。 while (fgets(buff, 256, pFile) != NULL) { ~~~ } として1行ずつファイルを読み込み、その中で1文字ずつ処理する為に 必要なforループのループ回数を得たいのですが・・ char buff[256]; // 先に確保した配列を、fgetsした後に int buff_length = sizeof(buff) /sizeof(buff[0]); // 長さを得ようとする こうすると確保したサイズ256が返ってきてしまい困っています。(当然かもですが・・ ファイルの1行の長さを毎回取得する方法は無いでしょうか?

  • Javaのeval関数処理

    Javaのeval関数処理 はじめまして、こんばんわ。 いつも利用させて頂いております。 現在、Javaの課題を出されており、InputStreamを使って、1行の四則計算のプログラムを作成しております。 もうすこしで成功!!っというところで、減算の処理がDoubleでキャストしたときに例外として処理されてしまうため、非常に困っております。 もしよろしければどなたかご教授おねがいします。 protected String startCalc(String numerical) { // 初期値を設定 double addVal = 0; double minusVal = 0; while (true) { String val; // 加算演算子の位置を検索 int addPosition = numerical.indexOf("+"); if (addPosition < 0) { val = numerical; } else { // 加算の演算子の前の式 val = numerical.substring(0, addPosition); } // 乗算、除算の計算を行う addVal += procCalc(val); if (addPosition < 0) { break; } else { // 加算の演算子の後の式 numerical = numerical.substring(addPosition + 1); } } return new DecimalFormat("0").format(addVal + minusVal); } private double procCalc(String numerical) { // 乗算、除算の初期値を設定 double valNum = 1; while (true) { String mNum = ""; // 乗算の演算子の位置を取得 int multiPosition = numerical.indexOf("*"); if (multiPosition < 0) { mNum = numerical; } else { // 乗算の前の式を抜き取る mNum = numerical.substring(0, multiPosition); } int kai = 0; double value = 1; while (true) { String dNum = ""; int dPosition = mNum.indexOf("/"); // "/"がない場合 if (dPosition < 0) { dNum = mNum; } else { // 最初の / より前の項 dNum = mNum.substring(0, dPosition); } // 最初の計算の場合 if (kai == 0) { value = Double.parseDouble(dNum); // TODO マイナスの場合、ここで例外 } else { value /= Double.parseDouble(dNum); } // "/"がない場合 if (dPosition < 0) { break; } else { kai++; // 最初の / より以降の項 mNum = mNum.substring(dPosition + 1); } } valNum *= value; // "*"がない場合 if (multiPosition < 0) { break; } else { // 乗算の演算子の位置を取得 numerical = numerical.substring(multiPosition + 1); } } return valNum; } }

    • ベストアンサー
    • Java
  • C言語について教えてください。

    数日前に「http://okwave.jp/qa4903738.html」で質問させてもらった者です。 前回、寝起きでボケてるうちに回答を締め切ってしまって、 回答してくださった方との対話ができていませんでした。 すみません。 今回は前回の指摘された部分を含めて回答を戴きたく投稿させてもらいます。 質問内容はほぼ変わりありません。 CSVファイルの内容をfreadで読み込み、strtokを使わずにbuffに格納した後、 buffから1文字ずつbuff2へコピーさせていって、コンマがきたら数字、 改行がきたら名前と判別して、自作関数に渡して表示させたいです。 あと、fgetsは使わないようにしたいです。 CSVファイルの内容は 『11,名前1(改行) 15,名前2(改行) 18,名前3』 といった感じです。 ----------------------------------------------- #define _CRT_SECURE_NO_DEPRECATE 1 #include <stdio.h> #include <string.h> #include <stdlib.h> #define NUM 256 struct kou { short nenrei; char namae[30]; }; void pri(struct kou o) { printf("%d\n%s\n",o.nenrei,o.namae); } int main(void) { FILE *fp; // ファイルポインタ char buff1[NUM] = {0}; char buff2[NUM] = {0}; char *fname = "text1.csv"; // ファイル名を指定 int n = 0; struct kou p; fp = fopen(fname, "r"); if(fp == NULL) { printf("%sファイルをオープンできませんでした。\n",fname); return 1; } fread(buff1, 1, NUM, fp); // ここでファイルの内容が全てbuffに入る。 // printf("%s\n",buff1); // buff1にファイルの内容が書き込まれているか確認する。 while((buff2[n] = buff1[n]) != NULL) // buff2[0]からbuff1の中が終わるまで一文字ずつコピーしていく。 { if(buff2[n] == ',') // buff2に格納されていく中にコンマがきたら以下の作業を行う。 { p.nenrei = atoi(buff2); // char型からshort型への変換し、p.iAgeに入れていく。 } if(buff2[n] == '\n') { strcpy(p.namae,buff2); // p.namaeにbuff2をコピー。 pri(&p); } n++; } fclose(fp); printf("ファイルをクローズしました。\n"); return 0; } ----------------------------------------------- 前回指摘されたwhileの条件式ですが、 まだchar型とポインタを比べてることになっているので正しくないんですよね? 正直、どうすればいいかわかりません。 あと、今のままでは名前3の後が改行ではないので表示されることないですよね・・・。 どうすれば表示されるようになるでしょうか。 これも前回言われましたが while内の1つ目のif文の所で、カンマを処理したので次に取り込むbuff2への書き込み位置の変更というのもわかりません。 カンマが来た時点でbuff2[n]のnは2になっているんですよね? ということはbuff2[3]からまた読み込めたらいいということですよね? 厚かましくも立て続けに質問してしまって申し訳ありませんが回答を戴けたらありがたく思います。 宜しくお願いします。

  • C言語に関することについて教えてください

    学校の問題集にでてきた問題がわかりません、どうか教えてください 1 プログラムの役割、必要性について説明せよ 2 プログラムにおける変数と定数の役割を説明せよ。また、ローカル変数の有効な範囲について説明せよ。 3 C言語で使う変数が他について、宣言子と、printf関数、scanf関数それぞれにおいて対応する書式指定子を対応表にせよ。また、変数名を決める際に守るべき文法上の規則と、プログラマとして配慮すべき事項を説明せよ。 4 配列について、その役割と定義方法を説明せよ。 5 コンピュータにおける文字処理に必須なアスキーコードについて説明せよ。 6 C言語における文字列について、文字列定数、文字列変数を説明せよ。 7 C言語における繰り返し処理の文法(for,while,do~while)を、プログラムコード列を示して説明せよ。 8 C言語における条件判断の文法(if,else,else if)を、プログラム列を示して説明せよ。 9 繰り返し、条件判断において利用する論理式(等値演算子、関係演算子、論理演算子等で記迷する式)について、その記迷の方法を論理和、論理積も含めて説明せよ。 10 変数のアドレスについて説明せよ。また、ポインタについて、アドレスとの関連性を踏まえて、その役割と定義方法を説明し、具体的な使い方のプログラムコード例を示せ。 11 ポインタと配列の関係について、ポインタによる配列操作を列に説明せよ。 12 関数について、その役割と定義方法について説明せよ(戻りがた、関数名、引数リスト)。また、自作関数をそれらを利用するmain関数のプログラムコード例を示せ。 13 scanf関数の戻り値について、その内容を説明して、どのような際に利用すると便利か、プログラムコード例を示して説明せよ。 14 引数にポインタを利用する関数のプログラムコード例を示して、ポインタの必要性、重要性を説明せよ。 15 構造体について、その役割と定義方法を説明し、具体的な使い方のプログラムコード例を示せ。 16 ファイルポインタについて説明し、ファイル入出力の方法についてプログラムコード例を示して説明せよ。

専門家に質問してみよう