C言語で作られるソフトウェアとは?

このQ&Aのポイント
  • 身の回りには様々なソフトウェアがありますが、その中でC言語で作られているものが一番多いです。例えば、InternetExplorerもC言語で作られています。
  • C言語にはifやwhileといったコードもあり、これを使ってソフトウェアを作ることができます。しかし、IEのような複雑なソフトウェアでは、括弧のネストが非常に深くなります。
  • 括弧のネストが多いと、右括弧と左括弧の数が合わなくなることがあります。また、階層構造が複雑になるため、混乱しやすくなります。プログラマーにとっては大変な作業です。
回答を見る
  • ベストアンサー

括弧のネストが多くて深いと・・・

身の回りには様々なソフトウエアがあって、C言語で作られているものが1番多いと聞きます。InternetExplorerはC言語で作られてるのかな。 さて、C言語には、if(a>0){・・・}とか、while(a>0){・・・}のようなコードがあります。これでIEを作るとなると、、、 {・・・}{{・・・}・・・{・・・}{・・・}{・・・{・・・}{・・・{・・・{{・・・}・・・}}}}{・・・{・・・}}} みたいな感じでしょうか?括弧のネストとか、入れ子って言うんですかね。IEだと、これが100層200層1000層くらいあるのでしょうか? ここまで括弧が多いと、必然的に右括弧と左括弧の数がズレて、エラーになっちゃうでしょう。しかも、階層構造が複雑で、混乱すると思います。経験積めば慣れるのでしょうか?コツとかあるのでしょうか? 私も5層くらいなら経験あると思いますが、この程度に私は限界を感じています。10層が必要になると、逃げ道を探すでしょう。 プログラマーって大変だね。

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

  • ベストアンサー
noname#208507
noname#208507
回答No.4

> 10層が必要になると、逃げ道を探すでしょう。 そんなあなたに Lisp の導きがあらんことを。

その他の回答 (4)

回答No.5

処理を全部main関数に記述する縛りプレイでもしてるの? int main() {   for(;;)   {     for(;;)     {       if()       {       }     }   } } こうなる前に int main() {   for(;;)   {     Process();   } } void Process() {   for(;;)     {       if()       {       }     } } こうするとか

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

あなたには不思議に思えるかもしれませんが, 常識があれば {・・・}{{・・・}・・・{・・・}{・・・}{・・・{・・・}{・・・{・・・{{・・・}・・・}}}}{・・・{・・・}}} なんて書くことはありえません. 「改行」って知ってる?

  • qwertfk
  • ベストアンサー率67% (55/81)
回答No.2

> C言語で作られているものが1番多いと聞きます。 というのはどうなんでしょうね? 物量でいえば確か最も多いのはCOBOLだったと思います。 シェアだと、C++とかJavaのほうがまだ多いのではないでしょうか? 一般には人間が正常に理解できるネストの階層数は最大で3層程度といわれていますので、 それ以上深いコードはあまり良いコードではないと考えられることがほとんどだと思います。 残念ながら、世間には1関数が何万行にもおよび、ネストが10層を超えるようなひどいコードも 多数あります。 しかし、基本的には1関数20行程度に抑えネスト数は最大2、最悪3程度を目安に問題の細分化を 行うというのが通常の戦略です。

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.1

>みたいな感じでしょうか?括弧のネストとか、入れ子って言うんですかね。IEだと、これが100層200層1000層くらいあるのでしょうか? そんなコードを思いつくのはきっと、あなただけ・・・

関連するQ&A

  • [正規表現][入れ子]ネストされたリストをインデントに置換したい

    [正規表現][入れ子]ネストされたリストをインデントに置換したい preg_replaceかpreg_replace_callbackを使って、 ネストされたリストタグを全角空白によるインデントに書き換えたく思っています。 (携帯表示するため) 1階層目のliならインデントひとつ。 2階層目のliならインデントふたつ。 ・ ・ ・ という具合にしたいのです。 以下は全角空白をわかりやすくするために□で置き換えました。 ---------------------------------------------------------------------------- 【現在のHTML】 文章1 文章2 <ul>  <li>リストA</li>  <li>リストB</li>  <li>リストC</li> </ul> <ul>  <li>   <ul>    <li>リストあ</li>    <li>リストい</li>    <li>リストう</li>   </ul>  </li> </ul> ---------------------------------------------------------------------------- 【置換完了後のブラウザ表示】 文章1 文章2 □リストA □リストB □リストC □□リストあ □□リストい □□リストう ---------------------------------------------------------------------------- 【置換完了後のHTMLのイメージ】 文章1 文章2 <div>  <div>□リストA</div>  <div>□リストB</div>  <div>□リストC</div> </div> <div>  <div>   <div>    <div>□□リストあ</div>    <div>□□リストい</div>    <div>□□リストう</div>   </div>  </div> </div> ---------------------------------------------------------------------------- どうぞ、よろしくお願い致します。

    • ベストアンサー
    • PHP
  • C++の将来性・・・

    昨年まで、C++プログラマをしていました。しかし恥ずかしながらぜんぜんオブジェクト指向じゃないコードを書いていました・・・ いまJavaで仕事していて感じるのですが、C++にはガベージコレクションがないので、実はオブジェクト指向プログラミングがとてもやりにくい言語ではないですか? そうなると、C++の必然性がなくなり、C Java C# に取って代わられてC++は消え去っていく言語なのでしょうか。 「いやC++はすばらしいオブジェクト指向言語だ!」というお叱りを期待しています。

  • AがBである間にCをすると、DがEになる

    When C is done while A is B, D is E. このようにWhen節にWhile節を入れ子にすることはできるでしょうか?

  • メニュー構築

    都合の良い質問で申し訳ありません。 C言語でメニューを構成したいと思います。 (基本的なアルゴリズムには言語は関係ないと思いますが・・・) 階層は5階層程度、各階層が2~5メニューを考えております。 初期は当然トップメニューの先頭項目、 トップメニューの項目の内いずれかが選択されたらそれに応じた2階層目に移動、 2階層目の項目の内いずれかが選択されたらそれに応じた3階層目に移動・・・ と考えていたら、その管理方法に頭が痛くなってきました。(^^ゞ 今どの階層の何項目に居て、その下位層にはどんな項目がある等を効率良く管理する方法は無いもんでしょうか? ツリー構造?リスト構造? 参考になるサイト等があれば、ご教示頂けると有り難いです。 よろしくお願いします。

  • x重入れ子の実装方法について

    ■やりたいこと: arrayA, arrayB, arrayCの配列から毎回それぞれ1つずつ取り出し、すべてのパタンをプリントする。 ■入れ子の階層が既知の場合: for文を入れ子にしていけばいいのですが(下記サンプルのように) ■入れ子の階層が未知な場合: どのように実装すればよいか、わかりません。 どなたかアドバイスいただけますか? ----------------------------- String[] arrayA = {"a1", "a2", "a3"}; String[] arrayB = {"b1", "b2"}; String[] arrayC = {"c1", "c2", "c3", "c4"}; int count = 1; for (int a = 0; a < arrayA.length; a++) { for (int b = 0; b < arrayB.length; b++) { for (int c = 0; c < arrayC.length; c++) { System.out.println(count + " : " + arrayA[a] + "-" + arrayB[b] + "-" + arrayC[c]); count += 1; } } } ------------------------ 上記ソースの出力: 1 : a1-b1-c1 2 : a1-b1-c2 3 : a1-b1-c3 以下省略

    • ベストアンサー
    • Java
  • CをC++に訳して~

    C言語で do{ A } while( B ); をC++に直すとどうなるのでしょうか。 私は while( B ){ A } となると思ったのですが どうも違うようです。 分かる方、是非教えてください。 よろしくお願いします。

  • リストの階層

    リストを使って最高で5階層の一覧を作成したいのですが何度やっても巧く行きません。 原因としては<ul><li>タグの入れ子の閉じる場所に問題があるのでしょうが・・ こんな感じです。 A ┗1 ┣2 ┗3 B ┗1 ┣2 ┣3 ┗4  ┗a  ┃┗ア  ┃ ┗あ ┣b  ┃┗イ  ┃ ┗い  ┗c C ┗1 ┃┗a ┃ ┗ア ┣2 ┣3 ┃┗a ┗4 うまく表示されるか分かりませんが、どなたか教えて下さい。

    • ベストアンサー
    • HTML
  • LL(n)構文解析機での高速化手法

    プログラム言語の処理系の勉強のために、実際に処理系を作成してみています 四則演算などの基礎的なところが動くようになって喜んでいたのですが 次のような文法で大きく解析速度が落ちてしまうという問題が起きてしまいました (構文解析だけで1分ほどかかってしまいました) ->(n) do if( n.(==)(1), do 1 end, do n.(*)(fact(n.(-)(1))) end ) end 文法の詳細は何となく察していただくとして 解析速度の大きな低下の原因を探ってみたところ 括弧「()」の入れ子階層が深く入り組むほど倍々ゲームで解析速度が落ちている処まで絞り込めてきました おそらく閉じ括弧「)」を先読みしても間違ったものを拾って失敗しているのではないかなと推測しています 一応使っている環境は下に挙げますが おそらくはLL(n)構文解析での一般的な問題だと思いました どうすれば高速化できるか教えていただけないでしょうか? ・開発言語はC# ・パーサー・コンビネーターでSparacheというライブラリを使用させていただきました https://github.com/sprache/Sprache ・ライブラリは開始括弧「(」をっ見つけると閉じ括弧「)」の先読みを、してくれている…様子です ・トークナイズや中間表現への変更は行わないで直接文字列をプログラムとして評価しています はじめて作ってみた処理系なので失敗してはその原因を調べなおして勉強しているものですが お知恵を貸していただければ幸いです

  • プログラマ1~3年目の人が参考とすべきコード

    はじめまして。 タイトルのとおり、プログラマになって経験が浅い人が 読んでおいた方が良いコードを教えて頂きたいです。 オープンソースとかで公開されているものがたくさんありますが、 経験が浅い初心者でも読みやすいものとか参考になるものは ありますでしょうか? 言語は、CかJavaが良いですが、他の言語でも良いので教えてください。

  • ヤマ括弧でくくられたテキストを抽出(入れ子)

    いつもお世話になっています。VBA学習者です(手短に説明するため文章がぶっきらぼうになることをご容赦ください)。 以下のようなテキストがあったとします。 サンプルテキストA: test <sample_1> test <sample_2> test. このテキストから括弧で括られた部分(ここでは「ユニット」と呼びます)を取り出すのは比較的容易です。 しかし、「サンプルテキストB」のように「ユニット」が入れ子になっている場合にも対応する必要があるため以下のコードを書きました。 これでとりあえず、入れ子の一番外殻のユニットを抽出することができました(「結果A」がシートに書き出されます)。 ここから更に、入れ子になっている内側のユニットも取り出したいのですが、これが意外とうまくいきません。 「結果B」のような結果を得るには、どのようにしたらよいでしょうか。 必ずしも、下に示した処理方法にこだわるものではないので、もっと良いアイデアがあれば大歓迎です! ※ここに示したサンプルは1行のみですが、実際には数千行(ユニットがない行も含む)からなるファイルをいくつも連続して処理するので、出来るだけシンプルに高速で処理できるようにしたいと思っています。 サンプルテキストB: Test <if([control],<if([control],<if([test],a,b)>,c)>,<if([control],d,e)>> test <if([control],<if([control],f,g)>,<if([control],h,i)>><if([control],j,k)>. 結果A: <if([control],<if([control],<if([test],a,b)>,c)>,<if([control],d,e)>> <if([control],<if([control],f,g)>,<if([control],h,i)>> <if([control],j,k)> 結果B: <if([control],<if([control],<if([test],a,b)>,c)>,<if([control],d,e)>> <if([control],<if([control],f,g)>,<if([control],h,i)>> <if([control],j,k)> <if([control],<if([test],a,b)>,c)> <if([test],a,b)> <if([control],d,e)> <if([control],f,g)> <if([control],h,i)> Sub テスト() Dim i As Long Dim j As Long 'テキストファイル内の行を格納する変数 Dim textLine As String 'テキストの文字数を格納 Dim letterCount As Integer 'ヤマ括弧の数を数えるカウンタ用 Dim bracketCounter1 As Integer Dim bracketCounter2 As Integer '括弧の位置を格納する変数 Dim bracketPosition1 As Integer Dim bracketPosition2 As Integer '「<」から「>」までのテキストを格納 Dim textFromToBracket As String '括弧の見つかった位置を格納する配列 Dim unitArray() As String 'bracketArray1()の要素数のカウンタ Dim inArrayCounter As Integer 'textLineにテスト用テキストを格納 textLine = "Test <if([control],<if([control],<if([test],a,b)>,c)>,<if([control],d,e)>> test <if([control],<if([control],f,g)>,<if([control],h,i)>><if([control],j,k)>." letterCount = Len(textLine) '先頭から「< 」と「>」 をカウントし、の数が一致したところが1ユニット For i = 1 To letterCount 'Midで1文字ずつとりだしつつ「<」を検索 If Mid(textLine, i, 1) = "<" Then bracketCounter1 = bracketCounter1 + 1 '1つ目の「<」の位置を格納 If bracketCounter1 = 1 Then bracketPosition1 = i End If End If 'Midで1文字ずつとりだしつつ「>」を検索 If Mid(textLine, i, 1) = ">" Then bracketCounter2 = bracketCounter2 + 1 End If 'ヤマ括弧の数が0以外で、括弧始め/閉じの数が一致したら If bracketCounter1 + bracketCounter2 > 0 And bracketCounter1 = bracketCounter2 Then 'その時点の「>」の位置を格納 bracketPosition2 = i 'bracketPosition1からbracketPosition2までのテキストを切り出し textFromToBracket = Mid(textLine, bracketPosition1, bracketPosition2 - bracketPosition1 + 1) '配列の要素数を1つずつ増やしながらユニットを格納 inArrayCounter = inArrayCounter + 1 ReDim Preserve unitArray(inArrayCounter) unitArray(inArrayCounter) = textFromToBracket 'bracketCounter1とbracketCounter2を初期化 bracketCounter1 = 0 bracketCounter2 = 0 End If Next '以下配列に格納したユニットを書き込み For j = 1 To UBound(unitArray) Cells(j, 1).Value = unitArray(j) Next j End Sub

専門家に質問してみよう