皆さんに回答してもらったんですがどうしてもうまく書けません。
この問題の鍵となるプログラムを教えてください。

前回URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=100134

A 回答 (6件)

naturalです。


補足しておきます。
数学の世界では当たり前のこんな記述「10<x<20」もC言語ではこのような記述「(x>10)で、且つ(x<20)」となります。
つまり1対1の関係で一括りになると言うことですね。

また、こんなことも出来ます。

「(x<11)または(x>19)」(こうすることにより先程の条件の逆になります)

問題は上記の「・・・で、且つ・・・」や「・・・または・・・」の書き方なのですが論理積・論理和というものを使用します。(テキストの索引で調べてみてくださいね)
これにより複数の条件を一つの条件式として纏めることが出来ます。

もし論理積・論理和をまだ習っていないのならば使用するのはまずいので、その場合は以下の様にしてみてください。

if(条件1)
{
  if(条件2)
  {
    処理;
  }
}

この形でも条件1と条件2を両方満たした場合のみ処理を行うことが可能です。
しかし、もしうっすらとでも論理積等について聞いた覚えがあるのであればこの機会に是非使ってみてください。
ソースが非常にすっきりしますよ。
さて、ここまで書いてきましたが、何処の補足かお判りですよね?
4-3-2の部分の話です。

さらにもう一つヒントを。
先程の例の(x<11)という部分ですが、11の部分を文字定数に置き換えて見てください。
完成形が見えてきませんか?

尚、C言語では以上・以下は「>=」や「<=」になりますのでご注意を。
(注:何れも変数は左辺にあるものと仮定しています)
それでは頑張ってください。
    • good
    • 0
この回答へのお礼

なんとか解けました。ありがとうございました。

お礼日時:2001/08/07 02:55

naturalです。


またまたコメント読みました。
そしてまたまた長くなります。

ソースを、と言うことなのですが、これは順序が逆だと思いますよ。(^_^;
途中まででも良いし、間違っていても良いから、まず自分の作ったプログラムを提示して問題点の指摘やヒントを求めるべきだと思います。
授業か研修か判りませんが、普通先にソースは示されないでしょう?
厳しいようですがあなた自身のためだという信念で敢えてソースは書きません。
その代わり1番の時の様にプログラムの流れを書こうと思いますので、まずは自己チェックしてみてください。

では2番の処理の流れを見ていきましょう。

1.変数定義・初期化
2.文字列の入力
3.文字列の長さ測定(長さ用変数に保持)
4.永久ループ
|4-1.数値用変数初期化
|4-2.番号入力(番号用文字列変数に入力)
|4-3.ループ(番号用文字列の先頭から末尾(ヌル文字)まで)
||4-3-1.数値用変数を10倍する
||4-3-2.現在の文字は数字ではない?(文字定数の範囲で判定)
|||4-3-2-1.ループ脱出(内側のループ)
||4-3-3.現在の文字を数値に変換した結果を数値用変数に加算
|4-4.最後に見た文字はヌル文字ではない?
||4-4-1.数字以外の文字の入力があった旨のメッセージを出力
||4-4-2.永久ループ先頭へ戻る
|4-5.数値用変数は長さ用変数の値未満か?(「未満」がポイント)
||4-5-1.永久ループ脱出
|4-6.文字列の範囲外である旨のメッセージ出力
5.結果表示

では解説です。
この問題のポイントはループが2つ存在することです。
入力にエラーがあったときに再入力させるために大きな永久ループで囲います。
その配下に数字かどうかのチェック及び数値への変換のループが入ります。

で、数字かどうかのチェックですが、途中でエラー(つまり数字以外の文字)が見つかった場合はループを抜けます。
ループを抜ける命令、ご存じですよね?(解らなければ補足要求下さい)
勿論途中で引っかからなくても文字列の末尾、ヌル文字まで来れば抜けます。(その場合全て数値への変換処理を通ります)
つまりこのループは二通りの抜け方をしてくるわけです。
文字列の途中までとヌル文字まで、何れがエラーかは判りますよね。
ですからこのループを抜けた後で訊いてあげます。
「最後に見た文字はヌル文字ではない?」と。(4-4参照)
この条件に引っかかれば数字以外の文字があったと言うことですからエラーメッセージを出力して永久ループ先頭に戻してあげます。
戻す命令はご存じでしょうか?(同じく必要ならば補足要求を)
この場所はすでに内側のループの外で永久ループの直下ですので、この命令は永久ループに対して効果を発揮します。

それでは戻されなかった場合の処理の説明を続けます。
この段階で数値への変換が済んでいるはずですから数値が最初に入力された文字列の長さ未満であるか訊きます。
なぜならば文字列の添え字は0から始まるためです。(短い文字列を想定して考えてみてください)
この条件に当てはまった場合は全ての入力がOKと言うことですから永久ループを抜けてあげましょう。
抜けられなかったらループ末尾のエラーメッセージの出力を通って自動的に永久ループ先頭に戻ります。
抜けられた場合は結果表示するだけです。

尚、数値への変換は以前書いた回答をもう一度読み返してみてください。
もし理解できなかったらコメント下さい。
それでは頑張ってください。p(^^)q
    • good
    • 0


> どうしてもうまく書けません。
では、うまく書けなかった、あなたのソースを載せてみてください


どこが分からないかは、ソースを見れば大体分かりますから。

(もしプログラムを理解したいという意思が無いのであれば、その旨を書かないと答えは書いてもらえないと思いますよ?)
    • good
    • 0

「続き」があるのを知らずに前回の方に補足しちゃいましたんでそちらも見てくださいね~。


取り敢えずどのレベルから「書けない」のかをはっきりさせた方が疑問を解消する近道だと思いますよ。
そのうち全てのソースを書かないといけなくなっちゃいそうな気がするし。

そうそう、loadidentityさん、ban1123さんに教えてあげるロジックとしては高度すぎる気がするのですが・・・。(悪い意味じゃないですよ)
この問題が提示されていると言うことはまだプログラミングの初歩を教わっていると思われますので、恐らくこれを書いて持っていくと「自分で解いたのか?」とまず疑われる気がします。
以前社員研修でプログラムを教えていたのでそう思ったのですが・・・。
突然レベルの上がったものを持ってくるとやっぱりわかるものですよ。

この回答への補足

1の問題はなんとかできました。ありがとうございました。しかし2の問題が解けません。いちお皆さんの回答をみてそれから考えてるんですがまだ私が勉強していない部分を使って解いてるかもしれないんでソースを書いていただけませんか?そのあとそのソースのわからないところうを質問します。お願いします。

補足日時:2001/07/11 20:21
    • good
    • 0

入力回数のカウントには、配列を用いるものとするということなので、



intcnt['Z' - 'A' + 1]; // アルファベット26文字分
inti, len;
char s[81]; // 入力領域

memset(cnt, 0x00, sizeof(cnt));
memset(s, 0x00, sizeof(s));

/*
ここで領域sにデータを入力
さらに、アルファベットの大文字'A'~'Z'に限定してデータを選別
ここは自力でかんがえてね。
*/

/* この時点でバッファには'A'~'Z'までしか格納されてないものとする*/
len = strlen(s); /* 文字数取得 */
for(i = 0; i < len; i++) {
cnt[s[i] - 'A']++; /* 数を管理する配列をインクリメント */
};

この例では、
Aを配列のゼロ番目とした数を管理する配列に
各文字の数が管理されます。
なぜなら、コンピュータの世界では
'A'は0x41 つまり 65 という数値で表現されます。
'Z'は0x5a つまり 90。

つまり上の例では 文字領域 s[] の0番目の領域に'B'がいたら...

cnt['B' - 'A'] に1プラスします。
言い換えると
cnt[66 - 65] は cnt[1]ということなので
cnt[1]++ということになります。

お役に立てるでしょうか?
わかりずらいときは、また補足してください。
    • good
    • 0

画面からの入力を配列を使って整理するプログラムですよね。



なにが問題を解く障害なのでしょうか?
配列の使い方?文字列の整理方法?画面からの入力?

質問するときは、
どうして解けないのか、何がわからないのか。。。
理由を書かないと、答えることができないよ~。

補足を書くと皆さん答えてくれますよ^^。

この回答への補足

回答していただいたことをプログラムでどうやって書いたらいいかがわかりません。

補足日時:2001/07/08 22:55
    • good
    • 0

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

このQ&Aを見た人が検索しているワード

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

Qいつもお世話になっております。http://oshiete.goo.n

いつもお世話になっております。http://oshiete.goo.ne.jp/qa/5836517.htmlで質問させているものです。

皆さんのアドバイスを頂き、2分探索法で郵便番号から住所を検索するプログラムが出来たのですが、
住所から郵便番号を2分探索法で出すプログラムも同じ方法でやろうとしましたが、比較対象が漢字の為、大きい・小さいの判断できずに上手くプログラムが出来ていません。

csvファイルは読みデータをひとつに繋げてあいうえお順にソートしました

プログラムを一部載せておきます(かなり省略済みですが…)
#define NAME ken_all_address.csv

int main(int argc,char *argv[])
{
struct tb line;
FILE *fp;
char buff[SIZE], string_buff[SIZE];
char *address,*ret;
int flag,linesu,linesu1,sum,count,up,up1,low,low1,center,center1;
int i,j;
long pos[FSIZE];

clock_t start,end;

start = clock();
//引数処理
if((fq=fopen(NAME1,"r")) == NULL){
printf("ファイル%sが開けません\n",NAME1);
return -1;
}

if((fp=fopen(NAME,"r")) == NULL){
printf("ファイル%sが開けません\n",NAME);
return -1;
}

flag = 0;
address = argv[1];

count=0;
sum=0;

if(atoi(address) == 0){
for(i=0; ;i++){
pos[i] = ftell(fq);
ret=fgets( buff, sizeof(buff), fp );

if(ret==NULL){
break;
}
}
linesu = i;

//printf("%d",linesu);

low=0;
up=linesu-1;

while(low <= up){
center=(up+low)/2;
fseek(fq,pos[center-1],SEEK_SET);
fgets( buff, sizeof(buff), fp );

strtok(buff,",\"");
strtok(NULL,",\"");
strcpy(line.now_num,strtok(NULL,",\""));
strtok(NULL,",\"");
strtok(NULL,",\"");
strtok(NULL,",\"");
strcpy(line.kanji1,strtok(NULL,",\""));
strcpy(line.kanji2,strtok(NULL,",\""));
strcpy(line.kanji3,strtok(NULL,",\""));

strcpy(string_buff,line.kanji1);
strcat(string_buff,line.kanji2);
strcat(string_buff,line.kanji3);

printf("%s %s %s\n",line.kanji1,line.kanji2,line.kanji3);

if(strcmp(string_buff,address)==0){
printf("〒%s \n",line.now_num);
flag=1;
}
if(strstr(string_buff,address) ==NULL){
low=center+1;
}
else{
up=center-1;
}
}
}
fclose(fp);

if(flag==0 && atoi(argv[1]) == 0){
printf("「%s」に該当する郵便番号はありませんでした\n",address);
}

if(flag==0 && atoi(argv[1]) != 0){
printf("「%s」に該当する住所はありませんでした\n",address);
}

end = clock();

printf("引数=%s\n",address);
printf("%.30f秒かかりました\n",(double)(end-start)/CLOCKS_PER_SEC);
printf("fgetsの実行回数=%d回\n",sum);
printf("比較回数=%d回\n",count);
printf("\n");

return 0;
}

いつもお世話になっております。http://oshiete.goo.ne.jp/qa/5836517.htmlで質問させているものです。

皆さんのアドバイスを頂き、2分探索法で郵便番号から住所を検索するプログラムが出来たのですが、
住所から郵便番号を2分探索法で出すプログラムも同じ方法でやろうとしましたが、比較対象が漢字の為、大きい・小さいの判断できずに上手くプログラムが出来ていません。

csvファイルは読みデータをひとつに繋げてあいうえお順にソートしました

プログラムを一部載せておきます(かなり省略済みですが…)
#de...続きを読む

Aベストアンサー

 strcmpの返り値は文字列を文字コードで比較しての大小関係です。
 ただし、漢字の文字コードは必ずしも「あいうえお順」じゃないので、そのままでは2分探索法では検索出来ないでしょう。

 この場合は普通はデータに「読み方」のフィールドを追加し、そこに住所をひらがな(あるいはカタカナ)で記載し、それを使って2分探索法で検索します。
 別のやり方としては、CSVファイルを「あいうえお順」ではなく「文字コード順」にソートしたものを使って検索する方法もあります。

Qhttp://www.***.com/goo.htm(仮)

のページを見るために
#include <string>
#include <fstream>
using namespace std;

WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
ofstreamofs;
string html,file;

file="c:\\gomi.url";
ofs.open(file.c_str());
if(ofs.is_open())
{
html="[InternetShortcut]\n;
html+="URL=http://www.***.com/goo.htm\n";
ofs<<html;
ofs.close();
ShellExecute(NULL,"open",file.c_str(),NULL,NULL,SW_SHOWMAXIMIZED);
}
return 0;
}
としてgomi.urlにurlフォーマットのアドレスを書き込んでそれを開くことによってできますがもっと直接的にアプリで
http://www.***.com/goo.htm
を見る方法を教えてください

のページを見るために
#include <string>
#include <fstream>
using namespace std;

WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
ofstreamofs;
string html,file;

file="c:\\gomi.url";
ofs.open(file.c_str());
if(ofs.is_open())
{
html="[InternetShortcut]\n;
html+="URL=http://www.***.com/goo.htm\n";
ofs<<html;
ofs.close();
ShellExecute(NULL,"open",file.c_str(),NULL,NULL,SW_SHOWMAXIMIZED);
}
return 0;
}
としてgomi.urlにurlフォーマットのアドレスを書き込ん...続きを読む

Aベストアンサー

ShellExecute や CreateProcess で、ファイル名の代わりに URL を指定するとブラウザが開きます。

Qhttp://www.geocities.jp/laprog321/

http://www.geocities.jp/laprog321/

この上記URLのプログラムについて質問です。

このプログラムはラプラス方程式を差分法で解くプログラムと書いていたので、
自分はまずプログラムを理解しようとするために、
インターネットなどで、ラプラス方程式の差分法による解き方についていろいろ調べて、式を考えたりしました。

そして、このプログラムがいう差分法とは中央差分方程式を用いて解いているのかなと思ったのですが、
何卒知識が少ないもので、実際に合ってるかどうかが分かりません。
また、ラプラス方程式をコンピュータに解かせる場合、解き方の反復法として、
いろいろな種類(ガウスザイデル法、ヤコビ法、SOR法など)の方法があることがわかりました。

ここで質問させていただきます。

プログラムでは、実際にどの方法を利用してどのように計算しているのか教えてほしいです。

例えば、ここの部分(行数など)で「~式」、「~法」を用いてどのように計算してるかなど教えてほしいです。

プログラムの流れについては、違う質問でご教授いただいたので、上記した質問のように
プログラム本文を使ってではなく、実際にこのプログラムでは、ラプラス方程式をどのような式を用いて、
また、どのような方法で解いているかを、矛盾しているようですが、プログラムと対比して教えていただきたいです。


同じような質問を繰り返し失礼いたします。
文章力のない質問で申し訳ありませんがよろしくお願いします。

http://www.geocities.jp/laprog321/

この上記URLのプログラムについて質問です。

このプログラムはラプラス方程式を差分法で解くプログラムと書いていたので、
自分はまずプログラムを理解しようとするために、
インターネットなどで、ラプラス方程式の差分法による解き方についていろいろ調べて、式を考えたりしました。

そして、このプログラムがいう差分法とは中央差分方程式を用いて解いているのかなと思ったのですが、
何卒知識が少ないもので、実際に合ってるかどうかが分かりません。
また、...続きを読む

Aベストアンサー

一般に、Ux(U の x による微分)を、『中心差分近似』すると、
Ux = (u(x+h / 2, y)-u(x-h / 2, y)) / h になり、これを用いて、
Uxx(U の x による2階偏微分)を『中心差分近似』すると、
Uxx = (Ux(x+h / 2, y)-Ux(x-h / 2, y)) / h
= (u(x+h / 2+h / 2 , y) / h-u(x+h / 2-h / 2, y) / h) / h (前半分)
- (u(x-h / 2+h / 2 , y) / h-u(x-h / 2-h / 2, y) / h) / h (後半分)

(前半分) = (u(x+h, y)-u(x, y)) / h^2
(後半分) = (u(x, y)-u(x-h, y)) / h^2
つまり、
Uxx = (u(x+h, y)-u(x, y)) / h^2-(u(x, y)-u(x-h, y)) / h^2
= (u(x+h, y)-2u(x, y)+u(x-h, y)) / h^2 となります。
同様に、
Uyy = (u(x, y+h)-2u(x, y)+u(x, y-h)) / h^2
これを、ラプラス方程式 Uxx+Uyy = 0 に代入して整理すると、

u(x+h, y)-2u(x, y)+u(x-h, y)+(u(x, y+h)-2u(x, y)+u(x, y-h) = 0
u(x+h, y)+u(x-h, y)+u(x, y+h)+u(x, y-h)-4u(x, y) = 0
u(x, y) = (u(x+h, y)+u(x-h, y)+u(x, y+h)+u(x, y-h))/4

h = 1 として、(さらに、x, y を i, j にして)配列で書き直せば、

u[i][j]=(u[i-1][j]+u[i+1][j]+u[i][j-1]+u[i][j+1])/4
各点におけるこの関係を満たすように、u を決定すればいいのですが、この連立方程式を解くのは手間なので、
u(new)[i][j]=(u(old)[i-1][j]+u(old)[i+1][j]+u(old)[i][j-1]+u(old)[i][j+1])/4
の計算を反復させることで近似値を得ます。

この反復計算は、すべての u(new) 算出に、u(old) を使っているので、ヤコビ法によるものになります。
プログラムの中も、これと、ほとんど同じ式なので、どこでやっているかは見当がつくかなと思います。

一般に、Ux(U の x による微分)を、『中心差分近似』すると、
Ux = (u(x+h / 2, y)-u(x-h / 2, y)) / h になり、これを用いて、
Uxx(U の x による2階偏微分)を『中心差分近似』すると、
Uxx = (Ux(x+h / 2, y)-Ux(x-h / 2, y)) / h
= (u(x+h / 2+h / 2 , y) / h-u(x+h / 2-h / 2, y) / h) / h (前半分)
- (u(x-h / 2+h / 2 , y) / h-u(x-h / 2-h / 2, y) / h) / h (後半分)

(前半分) = (u(x+h, y)-u(x, y)) / h^2
(後半分) = (u(x, y)-u(x-h, y)) / h^2
つまり、
Uxx = (u(x+h...続きを読む

Qhttp://csharpimage.blog60.fc2.com/b

http://csharpimage.blog60.fc2.com/blog-entry-19.html
をみて、直線補間をC言語で記述したのですが、結果が思う様にいきません。(_____)
プログラムは以下です。間違っているのは、おそらく、座標を示すところだとはおもっているのですが、
そこをどうすればいいのか。。。。レベルが低くてごめんなさい(>_<
どなたかご教授願います。
FILE *fpt;
_wfopen_s(&fpt,Common_Data_Raw->filename,L"rb");
FILE *fpt_output;
int width=Common_Data_Raw->width;
int height=Common_Data_Raw->height;
// 拡大縮小後の画像サイズ
int hxSize=Common_Data_Raw->width_rescale;//拡大、縮小後の幅が入っている
int hySize=Common_Data_Raw->height_rescale;//拡大、縮小後の高さが入っている。
// 拡大縮小用
int xSize=width;
int ySize=height;
double xpos, ypos;
double hokanX = (double)(xSize - 1) / hxSize;
double hokanY = (double)(ySize - 1) / hySize;
int i,j;
unsigned char **layer,**bufdata,**rescale;
//メモリの確保→省略します。

if ((xSize < hxSize)&&(ySize<hySize))
{
// X方向の補間
for (i=0;i<ySize;i++)
{
xpos = 0.0;
for (j = 0; j < hxSize; j+=3)
{
bufdata[i][j] = (unsigned char)(((double)layer[i][(int)xpos + 1] - (double)layer[i][(int)xpos]) *(xpos - (int)xpos) +(double)layer[i][(int)xpos]);
bufdata[i][j+1] = (unsigned char)(((double)layer[i][(int)xpos + 1+1] - (double)layer[i][(int)xpos+1]) *(xpos - (int)xpos) +(double)layer[i][(int)xpos+1]);
bufdata[i][j+2] = (unsigned char)(((double)layer[i][(int)xpos + 1+2] - (double)layer[i][(int)xpos+2]) *(xpos - (int)xpos) +(double)layer[i][(int)xpos+2]);
xpos += hokanX;}
}

// Y方向の補間
for (i = 0; i < hxSize; i+=3)
{ypos = 0.0;for (j = 0; j <hySize; j++)
{rescale[j][i] = (unsigned char)(((double)bufdata[(int)ypos + 1][i] - (double)bufdata[(int)ypos][i]) *(ypos - (int)ypos) +
(double)bufdata[(int)ypos][i]);rescale[j][i+1] = (unsigned char)(((double)bufdata[(int)ypos + 1][i+1] - (double)bufdata[(int)ypos][i+1]) *(ypos - (int)ypos) + (double)bufdata[(int)ypos][i+1]);
rescale[j][i+2] = (unsigned char)(((double)bufdata[(int)ypos + 1][i+2] - (double)bufdata[(int)ypos][i+2]) * (ypos - (int)ypos) + (double)bufdata[(int)ypos][i+2]);
ypos += hokanY;}}
}
else
{
//rescaledata = SimpleRescaleImage(data, hxSize, hySize);

http://csharpimage.blog60.fc2.com/blog-entry-19.html
をみて、直線補間をC言語で記述したのですが、結果が思う様にいきません。(_____)
プログラムは以下です。間違っているのは、おそらく、座標を示すところだとはおもっているのですが、
そこをどうすればいいのか。。。。レベルが低くてごめんなさい(>_<
どなたかご教授願います。
FILE *fpt;
_wfopen_s(&fpt,Common_Data_Raw->filename,L"rb");
FILE *fpt_output;
int width=Common_Data_Raw->width;
int height=Common_Data_Raw->height;
// 拡大縮小...続きを読む

Aベストアンサー

xposの計算がデータ構造に合っていないのだと思われます。
一つの座標に対して、配列layerは3要素 (RGBでしょうか) を使っていますよね。たとえばlayer[i][12], layer[i][13], layer[i][14]で一組です。
xposとhokanXの計算はこのことを考慮していないように見えるので、xposの値が途中14.2になったりするとlayer[i][14], layer[i][15], layer[i][16]を組にしてアクセスします。これでは思うような結果が得られなくて当然です。
さらに、隣の座標をアクセスするのにlayer[i][(int)xpos+1+α]としている部分はlayer[i][(int)xpos+3+α]でなくてはいけないはずです。

データ構造を変えていいのであれば、layer[i][j], layer[i][j+1], layer[i][j+2]のような形ではなく、構造体の二重配列にしてlayer[i][j].r, layer[i][j].g, layer[i][j].bのようにアクセスすれば簡単になります。bufdataとrescaleも同様に。

xposの計算がデータ構造に合っていないのだと思われます。
一つの座標に対して、配列layerは3要素 (RGBでしょうか) を使っていますよね。たとえばlayer[i][12], layer[i][13], layer[i][14]で一組です。
xposとhokanXの計算はこのことを考慮していないように見えるので、xposの値が途中14.2になったりするとlayer[i][14], layer[i][15], layer[i][16]を組にしてアクセスします。これでは思うような結果が得られなくて当然です。
さらに、隣の座標をアクセスするのにlayer[i][(int)xpos+1+α]としている部分はlayer[...続きを読む

Qネイティブ ハンドルって...............

ネイティブ ハンドルってなんでしょうか?
ウィンドウ ハンドルを調べていたら出てきたのですが
調べてもわかりません
すいませんがどのようなものなのかお教え願えませんか?
よろしくお願い致します

Aベストアンサー

カテゴリ違いでは?
.NETですよね。

.NETでは、従来のウィンドウハンドルは基本的に使いません。
Windowsプラットフォームにネイティブなものだからネイティブハンドルと呼んでいるのでしょう。


人気Q&Aランキング

おすすめ情報