質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

解決済

3回答

1181閲覧

プログラムの基礎知識について間違っているものがあれば指摘してくださるとありがたいです

aglaia

総合スコア14

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

0クリップ

投稿2017/08/01 03:06

###サンプルプログラムについて
1、strは、char型の変数名によく使われる
2、vluは、int型の変数名によく使われる

###処理時間について
1、配列の最初に何かを付け加える場合は、残りをひとつずつ後ろにずらすので、処理時間は大きい
2、配列に代入する時間*2=配列の値を見る時間=配列同士を比較する時間=計算(2*4)する時間*2

###windows10上でソフトを作る方法が書いてあるWEBページ(超初心者用)
一応、C言語の基本はマスターしています(苦C程度は)

###宜しくお願いします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

「プログラムの基礎知識」とありますが、C言語のようですのでC言語について説明します。以下の回答は特に言及しなければC言語を前提としており、他の言語でも同じであると限りませんので、予めご了承ください。

サンプルプログラムについて

1、strは、char型の変数名によく使われる

文字列(string)を表す変数について、stringの略としてstrという名前を使うことはよく見られる傾向です。C言語の文字列を表現する場合は、ヌル終端文字列と言われるものを使うことが多く、それらはの多くは、charの配列(ASCIIやマルチバイト文字コードの場合等)、wchar_tの配列(システムのUnicode文字列を使う場合等)、char16_tの配列(UTF-16を使う場合など)、char32_tの配列(UTF-32を使う場合など)のいずれかです。しかし、中には、WindowsのLPTSTRのようにコンパイル時のオプションによって切り替わる物もあります。

よって、strは文字列を表す変数の変数名に使われる事が多いとは言えますが、その型が何であるかは、プログラムによって様々であり、どれであるかを決めることはできません。その他、単にsとする場合も見られます。

なお、文字列ではなく文字だけを表すchar型にstrという変数名を付けた場合、変数名は文字列なのに、実際は文字という矛盾な命名になるため、要らぬ混乱の元になるでしょう。

2、vluは、int型の変数名によく使われる

**値(value)**を表す変数の変数名に、valueの略としてvalという名前を使うのはよく見られる傾向です。ただし、valは言語によっては予約語になっている場合もあるため、避ける人も居ます。また、単にvとする場合もあります。

ここでの「値」は様々な物です。言ってしまうと、全ての変数は何らかの値です。整数も浮動小数点数も真偽も値です。値がどんな型なのかは文脈から判断する以外に無く、その型が何であるかを前提とするとはできません。そのため、マップなどでのkey, valueのペアのような使い方以外は敬遠される傾向があります。

なお、valueをvluと略しているのは見たことが無いため、valueではなく全く別の略語の可能性がありますが、私にはわかりませんでした。

処理時間について

1、配列の最初に何かを付け加える場合は、残りをひとつずつ後ろにずらすので、処理時間は大きい

Cの配列に対して、先頭や末尾に追加する、間に挿入する、先頭や末尾や間を削除する、といった操作を直接できません。できる操作はそれぞれの要素に対して取得と置換をするだけです。一度に移動(memmove)や一度にコピー(memcpy)は用意されていますが、基本は一つ一つを読み込んで代入していく操作の繰り返しを行っているに過ぎません。

では、実際に「配列の最初に何かを付け加える」という操作が全くできないかというとそうではありません。mallocで確保されている配列であれば次のような操作で可能です。

  1. 配列をreallocで一つ増やす。
  2. 拡張した配列の「先頭から最後一つ手前」を配列の「2番目から最後」にずらしてコピーする。(memmoveを使うと関数一つでできますが、計算量はO(n)です。)
  3. 拡張した配列の先頭に付け加える値を入れる。

つまり、計算量はO(n)になります。配列が長ければ長いほど時間がかかる処理になります。

ただし、これはC言語の普通の配列の場合です。構造体などを使って独自に拡張した配列のような物であれば、速度を向上させる工夫ができないわけではありません。

2、配列に代入する時間*2=配列の値を見る時間=配列同士を比較する時間=計算(2*4)する時間*2

ある処理はある処理の2倍であるとか、3倍であるとは、コンパイラの最適化によって最も速い処理に置き換わる場合があるため重要ではありません。

競技プログラミングでの速度を考えているようですが、競技プログラミングにおいて重要なのはアルゴリズムの計算量と使用する関数の計算量です。

計算量とはランダウの記号(O(x)と言う書き方)を使った、与えられた数が増加した場合に、計算にかかる時間がどれだけの割合で増えていくかという物です。

例えば、長さnの配列に対して、計算量O(n)の処理があった場合、10個の配列では10秒かかれば、100個の配列では100秒かかるという計算になります。同様にO(n^2)(n^2はnの2乗を表す)の場合、10個の配列に100秒かかれば、100個の配列に10,000秒かかることになります。データが2倍になれば処理量が4倍になるため、大きな配列が与えられると計算が終わらなくなってしまいます。

そのため、競技プログラミングではこのO(x)のところが少なくなるアルゴリズムを考えるのが重要になります。O(n)よりもO(log n)とかO(√n)とかになるほうが遥かに計算時間が少なくなるからです。使っている関数や演算も重要です。memmoveのような処理はO(n)と非常に大きく、これをループで回すとすぐにO(n^2)とかになって、時間がかかります。なので、それらを使わなくてもできる方法を考えていくのが、競技プログラミングです。

処理が2倍や3倍になるかならないかは些細な問題です。ギリギリ間に合わないといった事があれば見直しも必要かも知れませんが、気にしても仕方がありません。C++では後置インクリメントを通常のクラス型になるべく使うなと言った程度は覚えておくべきかも知れませんが、ほとんどの場合は、書き方など最適化によって吸収されるため、こだわっても意味がありません。

投稿2017/08/01 10:37

編集2017/08/01 10:39
raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aglaia

2017/08/01 10:44

詳しい回答をありがとうございます。 本当に助かります おかげで、疑問はすべて解決しました ありがとうございます
guest

0

サンプルプログラムについて

1、strは、char型の変数名によく使われる
2、vluは、int型の変数名によく使われる

ローカルなルールなので、基礎知識ではないですね。
これから開発に従事するという面で基礎的な、に置き換えるとすると、
プロジェクトにコーディング規約があるかどうかを確認することではないでしょうか。

追記

各プログラミング言語のコーディング規約まとめ

処理時間について

1、配列の最初に何かを付け加える場合は、残りをひとつずつ後ろにずらすので、処理時間は大きい

言語によるかと思いますが、基本的に配列はポインターで管理されていますので、リンク情報を書き換えるだけですから処理時間はそれほど大きくはなりません。

2、配列に代入する時間*2=配列の値を見る時間=配列同士を比較する時間=計算(2*4)する時間*2

認識は正しいとは言えません。
「配列の値を見る時間」と「配列同士を比較する時間」は明らかに「配列の値を見る時間」<「配列同士を比較する時間」になります。
※値の比較は少なくとも2つの項目を参照するので。
なぜそう思ったかの根拠を示せば、もっと別な回答があるかもしれません。
そもそもそれを知って、何に役立てようとしているのかに興味があります。

windows10上でソフトを作る方法が書いてあるWEBページ(超初心者用)

漠然としすぎてますね。
少なくとも言語を限定しないと、広範囲すぎて。
追記

Cのプログラムの作成とコンパイルの手順
MinGW - gccのコンパイルと実行

質問者様の環境に適合するかどうかは分かりませんが、参考までに。
google先生に聞いただけなので、他にもあると思いますよ。

投稿2017/08/01 05:07

編集2017/08/01 10:17
sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aglaia

2017/08/01 05:22

回答ありがとうございます。 >認識は正しいとは言えません。 この部分、配列の値を見る時間*2+αです。 すみません。 最後の、windows~ですが、C言語のものです。 猫でもわかるwindowsプログラミングというのは、環境が古いみたいで、エラーが出てきたことが何度かあったので 宜しくお願いします
sazi

2017/08/01 06:17

競技プログラミングということなら、聞くよりも実践ですね。 計測の為には時間が小さすぎるというのなら、差が認識できる位の繰り返しの処理にすればいいだけですし。 参考サイトは本文に追記しました。
aglaia

2017/08/01 06:41

了解です ありがとうございます!
WoodenHamlet

2017/08/01 07:49

char型のstrは普通ないと思うの(そんな規約を採用している所はなかろうと思うの)で、その部分に関しては注意が必要ですね。majiponiさんの回答のように、str は普通 string(文字列)のacronymとしてよく使われます(場合によってはstrengthとかの略かもしれない)が、char 型ではそれを表現できないので。
aglaia

2017/08/01 10:26

サンプルプログラムでよく出てきていたので、覚えていたほうがいいのかと思っていました。 あと、俺は中学生なので、規約とかはまだまだ関係ないです(笑)
WoodenHamlet

2017/08/01 23:37

他の人に解りやすくするためにプログラミングの記法を共通化しようというのが規約ですが、それは自分が読み直すときの助けにもなります。 「3か月後の自分が読めるソースを書け」というとわかりやすいのでは? そういう意味で、規約を勉強するのは良いことですよ。それこそよくある変数名を調べるレベルでも、役に立つはずです。
aglaia

2017/08/13 03:03

返信が遅くなり申し訳ありません 了解です ありがとうございます
guest

0

strは、char型の変数名によく使われる

コーディング規約次第だが、char型の配列、もしくはそれを指すポインタの名前に用いられることが多い。char型1文字にstrを使うことはまずない。

vluは、int型の変数名によく使われる

valueの略と解釈するなら、よく使うかもしれません(私はnをよく使うけど)。

配列の最初に何かを付け加える場合は、残りをひとつずつ後ろにずらすので、処理時間は大きい

挿入があるなら、基本的に正しい。

配列に代入する時間*2=配列の値を見る時間=配列同士を比較する時間=計算(2*4)する時間*2

ごめんなさい、どんな状況の話をしているかよく分かりませんでした。

投稿2017/08/01 03:48

majiponi

総合スコア1720

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aglaia

2017/08/01 05:20

回答ありがとうございます 最後のは、処理時間の話です。 変数に代入する処理時間=変数の値を参照する処理時間=計算する処理時間(ex. 3*4) ex. 1, int a = 5; printf("%d",a); 2, printf("%d", 3*4); この二つの処理が同じ時間になるのかということです 1のほうは、代入と、printfしてて、2のほうは、計算とprintfをしています。 この二つのプログラムの処理時間がおなじなら、代入するプログラムと、計算するプログラムの処理時間が同じです。 競技プログラミングで、どれくらい処理速度が違うのかの参考にしたかったので、質問させてもらいました。 ぐだぐだしててわかりにくくてごめんなさい
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問