次のプログラムの内容(できれば詳しく)教えてくれませんか?
結果は分かるのですが、過程がわかりません。
どうかよろしくお願いします。
長いので次のところでプログラムを見てください。http://www.geocities.co.jp/HiTeens-Penguin/9298/ …
少しめんどくさいかもしれませんがよろしくお願いします。

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

A 回答 (2件)

よく学校の授業でありがちなプログラムですね(^^;



プログラムの方HPで拝見しました。
メイン処理は、
(1)データ件数入力
(2)実際のデータを乱数で取得するか、ソート済み、1固定にするか入力
(3)現在時刻を取得
(4)ソート処理呼び出し
(5)ソート終了時刻からソートにかかった秒数を画面に表示
以上です。

ソート処理(SelectSort)は基本ソートプログラムですね・・
最小値を検索して順次入れ替えていくものです。

例えば以下のようなデータの場合
a[0]=2, a[1]=3, a[2]=1
最終結果は
a[0]=1, a[1]=2, a[2]=3
とならなければなりませんね!

そこで、まずa[0]に入れるべき、最小値を探し、次にa[1]に入れるべき値を探すと最後のa[2]には自動的に最大値が入りますね!
この入れる部分を次へずらしていくのがiのループです。

次に出てくるjのループですが、最小値を検索する部分です。
minposが最小値の入っている配列番号で、最小値が見つかり次第minposに退避しています。

最小値の検索が終わったところで、値の入れ替えを行っています。
入れ替えを行っているのが、swap()です。
swap()は単純に、a[i]とa[minpos]の値を入れ替えているです。

上記例の場合は、以下のようにswap()が呼ばれ値は次のように変化します。
swap(a,0,2); → a[0]=1, a[1]=3, a[2]=2
swap(a,1,2); → a[0]=1, a[1]=2, a[3]=3

以上が処理の全貌です。。

ちなみに、gamen()は呼び出されない関数のため、無視しておきました~
    • good
    • 0
この回答へのお礼

詳しい解説ありがとうございます。
役に立ちました。

お礼日時:2001/07/27 07:13

大まかに行きます。

長いですがやってることは簡単なので。
このプログラムはグローバル配列を使ったソートの時間比較のプログラムです。フローはこんな感じ。

ソートさせる配列の大きさを指定

↓(エラーならメッセージ出して終了)

配列に入れる数の方法を指定。
1ならランダムに、2なら順番に、3なら全部1。

↓(その他数値を入れると配列にゴミデータが残る)

それで実際に別関数で、昇順ソート。

↓(最小値を求めて交換つー方式ですな。)

そしてかかった時間を表示する。

って感じです。ですけどこのプログラム、使ってない関数や(gamen)文法的にあれ?と思うところがありますねえ・・・
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2001/07/27 07:11

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

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

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...続きを読む

Qfoo1.txt、foo2.txt、foo3.txt…とファイル名をつけたいとき

プログラムの一部でファイルを作成しておりまして、
foo1.txt、foo2.txt、foo3.txt…のように
foo+変数.txtとなっており、変数を変える(増やす)ことで複数のファイルを作っていきたいのですが、

このように作成したいファイル名の途中に変数を含んでいる場合、どのようにすればよいのかをご教授願います。

現在、ファイルを作成する関数(関数の中身はおそらく関係してこないと思うので割愛させていただきます)を作成し、
make("foo.txt")のように記述しておりますが詰まってしましました。
どうぞ宜しくお願いします。

Aベストアンサー

つまり
char str[16];
int count;
for(count = 0; count < 10; count++)
{
sprintf(str,"foo%d.txt",count + 1);
}
とすると
strにファイル名が入っている。

Qプログラムでtxtファイルを読み込みたいのですが

5
10
15



といった風にtxtファイルに保存されている複数の値を、プログラム上で配列に保存して、その値を使用したいのですが、可能でしょうか?
できれば方法を教えてほしいです。よろしくお願いします!

Aベストアンサー

質問者さん、こんばんは。 #4です。

> 1行分のテキストを読込むところと、
> 取り出したデータを変換(文字列→数値)するところをもう少し
> 詳しく教えてもらえませんか?fgetsやatoiの関数の使い方が良くわからないです・・・

以下に、#4の 『【1】データ取込み処理』 部分の実際のソース例を記述します。

注)私の開発環境は「Windows98SE+Visual C++ Ver 5.0」となっており、質問者さんご利用の
開発環境で実装されている言語仕様(関数の用法など)とは違う場合がありますので、その辺り
は環境に合わせて変更して下さい。

■ソース例(データ取込み処理部分)
//===========================
char tmp[256+2]; //1行テキスト読込み用バッファ
char num[20+2]; //数値文字列取り出し用バッファ
FILE *fp; //ファイルポインタ(FILE構造体へのポインタ)

//【1】データ取込み処理(テキストファイルよりデータを読込み配列に格納する)
for ( m=0; m<FNUM; m++ ) //ファイル数分ループ
{
//・対象ファイルをオープン ................fopen などを使用
if( (fp=fopen(filename[m], "r"))==NULL ){
printf("##Error: ファイルがオープンできませんでした。\n");
return -1;
}
n = 0;
while( fgets(tmp, 256, fp)!=NULL && n<DNUM ) //ファイル終端(最終行) or 規定行数までループ
{
//・1行分のテキストを読込む ..............fgets, fscanf などを使用
//・データを取り出しデータ変換(文字列→数値)を行なう ...sscanf, atoi などを使用
//・数値変換したデータを配列 compdata[x][x] に格納する
sscanf( tmp, "%10s", num );
compdata[m][n++] = atoi(num);
}
//・対象ファイルをクローズ ................fclose などを使用
fclose(fp);
}
//===========================

【P.S.】
>fgetsやatoiの関数の使い方が良くわからないです・・・

これは、ご自分である程度、お調べになった上でのコメントでしょうか?

プログラミングに限らず、何か新しい事に取り組む場合は、予めそれなりの書籍・資料等を
準備してから取り組むのが基本だと思うのですが、質問者さんはそうされていないのでしょうか?

関数の用法が解らない場合は、C言語関連の書籍などを入手してお調べになってみて下さい。
あるいは、開発環境をお持ちでしょうから、そのヘルプで検索してみるとか、
または、WEBで検索するなどして、なるべく自己解決できるような方向で取り組まれることを
お勧め致します。
※既にそうなさっているのであれば、申し訳ありません。失言失礼致しました。

■参考サイト
初心者のためのポイント学習C言語
http://www9.plala.or.jp/sgwr-t/

同上サイト : ファイル入出力 - fopen、fclose、 fgets
http://www9.plala.or.jp/sgwr-t/c/sec17.html#s17-2-3

同上サイト : sscanf
http://www9.plala.or.jp/sgwr-t/lib/sscanf.html

同上サイト : 標準入出力関数(1) - scanf
http://www9.plala.or.jp/sgwr-t/c/sec05.html#s5-3

同上サイト : 標準ライブラリ関数 - atoi、atof、afol
http://www9.plala.or.jp/sgwr-t/c/sec07.html#s7-4

質問者さん、こんばんは。 #4です。

> 1行分のテキストを読込むところと、
> 取り出したデータを変換(文字列→数値)するところをもう少し
> 詳しく教えてもらえませんか?fgetsやatoiの関数の使い方が良くわからないです・・・

以下に、#4の 『【1】データ取込み処理』 部分の実際のソース例を記述します。

注)私の開発環境は「Windows98SE+Visual C++ Ver 5.0」となっており、質問者さんご利用の
開発環境で実装されている言語仕様(関数の用法など)とは違う場合がありますので、その辺り
...続きを読む

QH8/3048、AD/DA変換プログラムについて。

H8/3048、AD/DA変換について質問です。

ポート7のAN0・AN1を入力に使い、DA0・DA1で出力される変換プログラムを作成して実験したところ
AN0→DA0への変換は出力されたのですが、AN1→DA1への変換が出力できません。なぜ出力されないのかわかりません。
どうしたらいいか教えてください、お願いします。

AN0がDA1でも出力されているかと思いましたが違いました。



#include <no_float.h>
#include <stdio.h>
#include <machine.h>
#include "h8_3048.h"

void init (void);
double get_ad0 (void);
double get_ad1 (void);
void out_da0 (double);
void out_da1 (double);
void wait (void);

int main (void)
{
double ad0,ad1;
int d;
init(); //初期化
// set_ccr(0x00); //全体の割り込み許可

//AD DA変換-----------
while(1){
ad0=get_ad0();
ad1=get_ad1();
for(d=0;d<1000;d++);
out_da0(ad0);
out_da1(ad1);
}

return 0;
}

void init(void)
{
/* ポートの入出力設定 */
P1DDR = 0xff;
P2DDR = 0xff;
P3DDR = 0xff;
P4DDR = 0xff;
P5DDR = 0xff;
P6DDR = 0xf0; // CPU基板上のDIP SW
P8DDR = 0xff;
P9DDR = 0xf7;
PADDR = 0xff; // LED基板
PBDDR = 0xff;

// A/Dの初期設定(単一モード)
AD_CSR = 0x00;
// A/Dの初期設定(スキャンモード使用AN0-AN1)
// AD_CSR = 0x11;

//ITU0 1ms毎の割り込み
ITU0_TCR = 0x20;
ITU0_GRA = 24575;
ITU0_IER = 0x01;
ITU_STR = 0x01;

// D/Aの初期設定
DA_CR=0xc0; //DA0E1,DA0E0:1 D/Aアウトプットネーブル DAE:0 ch0,1 独立制御

}

double get_ad0(void)
{
int i;
double ad;
AD_CSR |=0x20; //ADST:1 AD開始
while(!(AD_CSR & 0x80)); //ADF:1 エンドフラグをチェック
AD_CSR &=0x7f;
i=AD_DRA>>6;// i=0-1023
ad=i*5.0/1024.0; // 0-1024 を 0-5vに変換
return ad;
}

double get_ad1(void)
{
int i;
double ad;
AD_CSR |=0x20; //ADST:1 AD開始
while(!(AD_CSR & 0x80)); //ADF:1 エンドフラグをチェック
AD_CSR &=0x7f;
i=AD_DRB>>6; //i=0-1024
ad=i*5.0/1024.0; // 0-1024 を 0-5vに変換
return ad;
}

void out_da0(double d)
{
DA_DR0=(int)(d*255/5.0);
}

void out_da1(double d)
{
DA_DR1=(int)(d*255/5.0);
}

void wait(void)
{
long Loop=200000;
while(Loop--);
}

H8/3048、AD/DA変換について質問です。

ポート7のAN0・AN1を入力に使い、DA0・DA1で出力される変換プログラムを作成して実験したところ
AN0→DA0への変換は出力されたのですが、AN1→DA1への変換が出力できません。なぜ出力されないのかわかりません。
どうしたらいいか教えてください、お願いします。

AN0がDA1でも出力されているかと思いましたが違いました。



#include <no_float.h>
#include <stdio.h>
#include <machine.h>
#include "h8_3048.h"

void...続きを読む

Aベストアンサー

他にも原因があるかもしれませんが、
とりあえず、チャンネルセレクトされていない ようですね。

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 を指定するとブラウザが開きます。


人気Q&Aランキング

おすすめ情報