【復活求む!】惜しくも解散してしまったバンド|J-ROCK編 >>

擬似言語の繰り返し条件の書き方についての質問ですが、前判定反復構造で、下記①のような書き方は、一般的に、見かけますでしょうか? あまり見ないので、何んだ?この書き方? と思ったのですが、… 

①反復構造

■ i = 3 and i <=10
| (処理)
| i ← i + 1



私的には、上記①の書き方は、下記②のように解釈していますが…

②反復構造

■ i : 3 , i <= 10, 1
|
| (処理)
|

このQ&Aに関連する最新のQ&A

A 回答 (1件)

擬似言語の書き方は、自分が得意な言語、または自分に解りやすい書式で


書けば良く、決められた書式というのは有りません。
それでも 「■i = 3 and i <=10」から予想されるコーディングは
For文を使ったものではなく
While (i = 3 and i <=10)
End While
となり、i=3の場合のみ有効な処理としか見えません。
またiの初期値が設定されていない様に見えるのも、「何んだ?この
書き方?」と感じる原因となっていると思います。
結論としては、擬似言語の書式として適していない様に思われます。
    • good
    • 1
この回答へのお礼

ありがとうございます。とても参考になります。

お礼日時:2017/04/12 05:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

QCのプログラムに無性にイライラするのはおかしいですか?

CQ出版のインタフェース 2017-5 の記事のプログラム例に
for( i=0; i<256; i++){
 for( y =0; y < Y; y++ ){
  for( x = 0; x < X; x++){
   p[0] = img -> imageData[img->widthStep* y + x*3 ]; //B(青色)
   if(p[0]==i){hn[i]++;}
  }
 }
}
がありました。このリストを見て、無性にイライラするのは私だけでしょうか?

なぜ、i,y,x の3重のループで処理しないといけないのか、y,xの2重ループで十分ではないかと思います。

for( y =0; y < Y; y++ ){
 for( x = 0; x < X; x++){
  p[0] = img -> imageData[img->widthStep* y + x*3 ];  //B(青色)
  hn[ p[0] ]++;
 }
}

3重にするならせめて、y,x,i の順にしてp[0]への代入は1回で済ませればと思います。

for( y =0; y < Y; y++ ){
 for( x = 0; x < X; x++){
  p[0] = img -> imageData[img->widthStep* y + x*3 ];  //B(青色)
  for( i=0; i<256; i++){
     if(p[0]==i){hn[i]++;}
  }
 }
}

最近のコンパイラの最適化では、私の書いたようなコーディング(修正?)は無意味なのでしょうか?

CQ出版のインタフェース 2017-5 の記事のプログラム例に
for( i=0; i<256; i++){
 for( y =0; y < Y; y++ ){
  for( x = 0; x < X; x++){
   p[0] = img -> imageData[img->widthStep* y + x*3 ]; //B(青色)
   if(p[0]==i){hn[i]++;}
  }
 }
}
がありました。このリストを見て、無性にイライラするのは私だけでしょうか?

なぜ、i,y,x の3重のループで処理しないといけないのか、y,xの2重ループで十分ではないかと思います。

for( y =0; y < Y; y++ ){
 for( x = 0; x < X; x++)...続きを読む

Aベストアンサー

利点を考えてみました


これを並列処理したときに
スレッド0: hn[0] に p[0] = 0 をカウント
スレッド1: hn[1] に p[0] = 1 をカウント
...
とすれば、
・img -> imageData は読み出すだけなので衝突しない
・hn[i] でアクセスする領域は、スレッド毎に i が違うので、同じ箇所に書き込まれることはない。
となり、排他処理が不要となります。
(もちろん、x,y,i,p[0]はスレッドでローカルな変数とします)

ただ、並列処理のオーバーヘッドや同時並列処理数等を考えると、こんな並列処理はしない方が効率的です。


あるいは、hn[]がシークに時間がかかる領域の場合、
hn[p[0]) で毎回違う位置を探しに行って、その時間が無視できないほどだったら、
先にhnを決めてしまった方が速くなるでしょう。

こちらも、非現実的です。

QC言語の漢字のホルダーは、chdirでは変更出来ないのだろうか。

下記のソースでは、ホルダーが漢字で無い時は成功するが。
漢字を使うと失敗する。

下記に成功する場合を示す。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(){
char *dir1="C:/Users/usui/mingw";
int ret;

ret=chdir(dir1);
printf("%d\n",ret);
}
上記は、漢字を使っていないので結果は0を表示する。
然し、ホルダーに漢字を使うと-1を表示する。

漢字のホルダーを使う方法をお知えて下さい。
宜しくお願いします。

Aベストアンサー

No3です。
ちなみに私がインストールした(今使っているバージョン)のは、下記URLの
mingw-get-inst-20120426.exe です。
https://sourceforge.net/projects/mingw/files/OldFiles/mingw-get-inst/mingw-get-inst-20120426/

QC/C++言語で変数名から変数のアドレスを取得する方法があれば、ご教示願います。 例えばですが、関数

C/C++言語で変数名から変数のアドレスを取得する方法があれば、ご教示願います。

例えばですが、関数GetProcAddress()は、関数の文字列からエクスポート済みの関数のアドレスを戻り値で返しています。
GetProcAddress()と同じようにアドレスを取得したい変数名の文字列を渡して、変数のアドレスを取得したいです。

よろしくお願いします。

Aベストアンサー

無理です。

C/C++ はコンパイルした時点で変数名は捨てられて自動採番の識別子に置き換えられるので。

ただし、「どうしても変数名から」というときのために「マクロ引数の文字列化」を巧みに利用してそれらしい挙動をさせるためのコードはよく見ます。
詳しくはググってください。

参考になればよろしいんですが。

Qメッセージの頭に「#」の意味教えてください

メッセージの頭に「#」の意味教えてください

Aベストアンサー

言語にもよりますがコメント文に利用されることが多いですね
ただC系ではありません

QC言語 型変換のタイミング

C言語 型変換のタイミングについて教えてください。
「型変換は代入のとき行われる」と理解していたのですが、代入の前の計算時も行われるのでしょうか?

char c1=120,c2=10;
int i;
のとき、
i = c1 + c2;
は i= -126 を期待したのですが i = 130 となっていました。

質問1)これは、C言語の仕様でしょうか? それともコンパイラに任されている仕様でしょうか?

関連して、
質問2)期待した計算結果をiに代入するには、
char c3;
c3 = c1 + c2; i=c3;
とする以外に方法ありますか?

質問3)計算途中でオーバーフローする可能性のある計算を確実の行うにはどのように記述したらよいでしょう?
int x0,x1,x2,x3;
x0 = (x1 + x2 + x3) / 3;
x0 = x1 * x2 / x3; (ただしx2 < x3)

よろしくお願いします。

Aベストアンサー

1 については C の仕様です. 計算を行うときに, int 以下の型はすべて int (または unsigned int) に変換したうえで計算されます. したがって
i = c1 + c2;
はあたかも
i = (int)c1 + (int)c2;
と書いたのと同じ計算をします.

2 は
i = (char)(c1+c2);
のように演算結果を強引にキャストすればいい, んじゃないかなと思う.

3 については.... ポータブルにやるなら努力と根性で多倍長演算を実装するしかないんじゃないかなぁ.

あ, あと余談だけど C の仕様では
char は*少なくとも*8ビット
です.

QC言語 a * b / c の計算

特に困っているわけではないのですが、エレガントな方法が見つからないので質問します。

a,c は32ビット、bは8ビット、0<a≦c、0<b がわかっているとします。
このとき、8ビットの整数計算値 a * b / c を「最大32ビットの範囲」で計算する方法、教えてください。
一応C言語で考えていますので、以下の***の部分の具体的な計算方法がわかればうれしいです。

int a,c; // 32bit 符号付き整数
signed char b,d; // 8bit 符号付き整数
if(a<2^(32-8)) d = a * b /c;
else **** ← この部分のプログラム

Aベストアンサー

決してエレガントではありませんが、a, cは正でありしかし符号付の型だという前提で a * b / c の整数の商を求めるのであれば、最初にa - cを求めて一時変数に代入しておき、bの数だけループし、ループ中に一時変数にaを加え、それがc以上になったらdを1加えて一時変数からcを引き去ることを繰り返せば、間違いなくすべての数値は32ビット以内に収まると思います。CPUにALUしかない時代の発想で、歳がばれますね・・・

Qしつこい様ですが、再度ポインタについて質問します。

下記は、*inの<title>から<と>で挟まれたtitle
を得るためのソースです。
全くの完全では有りませんが。質問の内容は、
while文の中で、コンパイラーが出すエラーメッセージの
内容が理解出来ません。

下記が出ます。
01.c: In function 'main':
01.c:12:17: warning: assignment makes pointer from integer without a cast [enabled by default]
while(strstr((p=(*out++ = *in++)),">") !=0);
^
while文の中でのエラーで、キャスト無しの整数からポインターを作っているので
strstrの最初の引数を飛ばしました(デフォルトで有効)無視しました。と言う意味ですが。

要はこれはポインターで無いのでstrstrの引数としては無効ですと言う事でしょうか。
それであれば、ここではポインターに変換しないといけませんが。

実はこれに関しては、前の質問でその方法と言うのは分かったのですが。どうしても、ここでは
将来の勉強と言う意味で理解をしたかった物ですから質問をしました。

このエラーメッセージが出ない様にするためにはソースのどこを変更
すれば良いのでしょうか。今度は、コードがどうのこうのではなくて
説明をお願いします。

よろしくお願いします。後学の為にどうしても理屈を知りたかった物ですから。
宜しくお願いします。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
char *in="<title>";

char work[256];
char *out=work;
char *p;

while(strstr((p=(*out++ = *in++)),">") !=0);
*out='\0';
printf("%s",work);

return 0;
}

下記は、*inの<title>から<と>で挟まれたtitle
を得るためのソースです。
全くの完全では有りませんが。質問の内容は、
while文の中で、コンパイラーが出すエラーメッセージの
内容が理解出来ません。

下記が出ます。
01.c: In function 'main':
01.c:12:17: warning: assignment makes pointer from integer without a cast [enabled by default]
while(strstr((p=(*out++ = *in++)),">") !=0);
^
while文の中でのエラーで、キャスト無しの整数からポイ...続きを読む

Aベストアンサー

No1です。
>これを作るに当ってのプログラム作成の問題は解決をしていますので。
>最後に今回の説明の回答で暴走すると言う所が気になっています。
>最後にこの暴走と言う所の質問の回答をお待ちしています。

これを以下のような部分を追加しました。
追加したしたのは、変数の内容を印字するだけなので、本来の動作には影響しません。
--------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
char *in="<title>";

char work[256];
char *out=work;
char *p;

printf("ascii code of(<)=%d\n",'<');
printf("in_size=%d out_sieze=%d\n",sizeof(in),sizeof(out));
printf("in=%x out=%x\n",in,out);

while(strstr((p=(char*)(int)(*out++ = *in++)),">") != 0);
*out='\0';
printf("%s",work);

return 0;
}
----------------------------------
これを実行すると、添付の図のようになります。
OSにより強制終了させられます。
このように強制終了させられる原因はいろいろありますが、今回は
ROM領域をアクセスしているのが原因と考えられます。
まず、pのあたいですが、"<"のアスキーコードの値:60が設定されます。
strstr(p,">")の意味は、60番地から">"の文字列が存在する箇所を探しなさい。
ということになります。60番地はROMの領域になるはずで、OSはこのような領域を一介のアプリプログラムが
アクセスすることを禁止しています。その為、強制終了させられます。(これが暴走の意味です)
通常、pは、アプリケーションプログラムが確保した領域のアドレスが設定されるはずで、
inのアドレスが設定されるなら、添付の図のように403064(16進数)のような値になるはずです。

No1です。
>これを作るに当ってのプログラム作成の問題は解決をしていますので。
>最後に今回の説明の回答で暴走すると言う所が気になっています。
>最後にこの暴走と言う所の質問の回答をお待ちしています。

これを以下のような部分を追加しました。
追加したしたのは、変数の内容を印字するだけなので、本来の動作には影響しません。
--------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
char *in="<title>";

char work[256];
char *out=wo...続きを読む

Q03分22秒36のような時間の単位を16進数で表すと、どうなりますか?

03分22秒36のような時間の単位を16進数で表すと、どうなりますか?
また、どうしてそのようになるのか、その変換の過程も教えてください。
お手数ですが、どうぞよろしくお願いします。

Aベストアンサー

私がプログラムを作るならば、ですが、静的に時間を表記するだけで計算式にも一切使わないのであればNo.3の方のように、時、分、秒、その下の位のそれぞれの座の数値をそれぞれ独立したビットの座で表現します(例えば分、秒をそれぞれ6ビット、秒の小数点以下を7ビットで表現し、これをくっつけて表現します)。またストップウォッチのように時間をカウントするのであれば、単位時間の積み重ね(ご質問文の時間表記だと、単位時間を100分の1秒とか)で表現します。

前者の場合、ただ画面に表示するだけの目的ぐらいにしか使えませんが、取り出したい座のビットマスクとの論理積とシフト演算だけで時、分、秒等の数字を取り出すことが容易です。しかし、足し算やインクリメントなど計算を伴うと、繰り上がりや繰り下がりを実現するために条件分岐が多発するため効率よくありません。
後者の場合、インクリメントや足し算などは容易に行うことができます。時、分、秒などを取り出すのは前者ほど単純ではありませんが、それにしても四則演算のみで取り出すことができるため条件分岐を多用する必要がなく、それほど効率の悪いものでもありません。

しかし、03分22秒36を 0C 04 ですか・・・これはちょっとわかりませんね。
後者の表記法にて単位時間を100分の1秒とすると、03分22秒36は単位時間の積み重ねだと10進数で20236(202.36秒)ですが、これを16進数で表現すると 4F 0C になります。インテル系CPUのバイトオーダーでは 0C 4F 00 00 (32ビットの場合)な感じにメモリに格納されると思います。見間違えているとか、実は3分22秒36とは違う時間だった、ってことはないですよね。

私がプログラムを作るならば、ですが、静的に時間を表記するだけで計算式にも一切使わないのであればNo.3の方のように、時、分、秒、その下の位のそれぞれの座の数値をそれぞれ独立したビットの座で表現します(例えば分、秒をそれぞれ6ビット、秒の小数点以下を7ビットで表現し、これをくっつけて表現します)。またストップウォッチのように時間をカウントするのであれば、単位時間の積み重ね(ご質問文の時間表記だと、単位時間を100分の1秒とか)で表現します。

前者の場合、ただ画面に表示するだけの目的ぐ...続きを読む

Qプログラムの改良

人の作ったプログラムを改良することになりました。
Visual C++ は初めてですが、CやC++は一通り勉強しています。

そこで、いろいろ調べているのですが、
例えば
「MFCは使わずに,Win32API SDKを用いた方法」
などという説明があります。

自分が対応しているプログラムが、そのどちらであるか、あるいはほかの方法で作られているか
というのはどうしたら分かるのでしょうか?

Aベストアンサー

No1です
私はC++は全然触ったこと無いので
あまり的確な回答は期待しないでくださいね

Q1.いいんじゃないでしょうか?
MSDNのOnPoint↓
https://msdn.microsoft.com/ja-jp/library/01c9aaty.aspx

OnPointクラス(Cwndクラス)
https://msdn.microsoft.com/ja-jp/library/1xb05f0h.aspx
このページの一番最初に
「Microsoft Foundation Class ライブラリにあるすべてのウィンドウ クラスの基本機能が用意されています。」と書いてありますから
そういうことですね

Q2.なんでもいいと思いますけど
そもそもあなたが対応するプログラムが
きちんとWin32のみで、もしくはMFCのみで書かれているとは限らないですからね
適当に作られて、両方が混在している可能性だってありますし

Q3.そこからですか
そこは調べればすぐ出てくるかと思いますが
MFCというのはWin32をラッピングしたものです

Q4.作った本人に聞く
仕様書とかがあるならそれを見る

No1です
私はC++は全然触ったこと無いので
あまり的確な回答は期待しないでくださいね

Q1.いいんじゃないでしょうか?
MSDNのOnPoint↓
https://msdn.microsoft.com/ja-jp/library/01c9aaty.aspx

OnPointクラス(Cwndクラス)
https://msdn.microsoft.com/ja-jp/library/1xb05f0h.aspx
このページの一番最初に
「Microsoft Foundation Class ライブラリにあるすべてのウィンドウ クラスの基本機能が用意されています。」と書いてありますから
そういうことですね

Q2.なんでもいいと思いますけど
そもそもあなたが...続きを読む

Qc言語は独学で、どこまで出来ますか?

大学生です。初歩的なc言語を学ぶ講義があるのですが、訳あって受けられなくなったので、独学でいこうかなと思っています。

初心者の大学生が1年程度受ける講義の内容は、独学でも難しいですか?

独学経験者、プログラミングに詳しい方の意見を伺いたいです。

Aベストアンサー

それは大丈夫でしょう。
最初はC言語入門的な書籍から入ってもいいし、真髄を学びたければカーニハン&リッチーの定番から読むのもいいし、プライマーから入ってもいいし。

ただ、コードを書くだけではダメなので、構造化プログラミングとか、コンパイラとか、ゆくゆくはオブジェクト指向とかに入っていかないといけません。


人気Q&Aランキング