外出自粛中でも楽しく過ごす!QAまとめ>>

シェルソートのフローチャートが分からないので、
知っている方は教えてください。

A 回答 (1件)

    • good
    • 0
この回答へのお礼

ありがとうございました。お礼の返事が遅くなってしまってごめんなさい。とても参考になりました。大学の授業にもついていけるよう頑張っていきたいと思います。

お礼日時:2007/07/15 22:02

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

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

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

Qシェルソート(Cプログラミング)

シェル・ソート
基本挿入法により、データを昇順にソートする。
というプログラムを実行したいと思ったのですが、エラーがでてしまいコンパイルできません。

書いたプログラムは以下の通りです。

#include<stdio.h>
#include<math.h>

#define N 100

int main (void)
{
int a[N],i,j,t;

for (i=0;i<N;i++)
a[i]=rand();

for (i=1;i<N;i++){
for (j=j-1;j>=0;j--){
if (a[j]>a[j+1]){
t=a[j]; a[j]=a[j+1]; a[j+1]=t;
}
else
break;
}
}
for (i=0;i<N;i++)
printf("%8d",a[i]);
}

エラーメッセージは以下のようにでました。
警告 W8065 sample.c 10: プロトタイプ宣言のない関数 'rand' の呼び出し(関数 main )
警告 W8070 sample.c 22: 関数は値を返すべき(関数 main )

どうすれば出来るのでしょうか、お答えよろしくお願いします。

シェル・ソート
基本挿入法により、データを昇順にソートする。
というプログラムを実行したいと思ったのですが、エラーがでてしまいコンパイルできません。

書いたプログラムは以下の通りです。

#include<stdio.h>
#include<math.h>

#define N 100

int main (void)
{
int a[N],i,j,t;

for (i=0;i<N;i++)
a[i]=rand();

for (i=1;i<N;i++){
for (j=j-1;j>=0;j--){
if (a[j]>a[j+1]){
t=a[j]; a[j]=a[j+1]; a[j+1]=t;
}...続きを読む

Aベストアンサー

エラーではなく警告ですので、コンパイルできています。
ただ、

> for (j=j-1;j>=0;j--){

この行に誤りがあるため、実行時に落ちます。

さらに、乱数の初期化を行なっていないため、
正しく実行できたとしても毎回同じ結果を得ます。
それでもよければかまわないのですが、srand()を使って
乱数を初期化した方が毎回違った結果を得ることができて
おもしろいでしょう。

ちなみに、2つ目の警告が出ないようにするには、
main()の最後に
return 0;
を加えてください。

QIOException ってどういうときに起こるのでしょうか?

IOException ってどういうときに起こるのでしょうか?

http://www.atmarkit.co.jp/fjava/rensai2/javaent12/javaent12.html
を見て勉強しています。

  catch ( IOException e) {
    System.out.println( "キーボードが故障しているのかもしれません" );
  }

と書いてあります。
ハード(キーボード)が故障しているのを Java のプログラムのレベル(ソフトウェア)で感知できるというのがよくわかりません。「

NumberFormatException の方はわかるのですが・・・

Aベストアンサー

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接続だったりするわけですけど、
InputStreamは、その入力元の情報を持っていないので、
データを読み取る際は常に
IOExceptionをキャッチするコードを書かなくてはいけません。
たとえ、絶対にIOエラーが発生しないストリームだとしても。

さらに付け加えるなら、
そもそも「標準入力=キーボード」であるとは限りません。
(一般的にはキーボードであることが多いですが。)
Javaでは、
System.setIn(InputStream)
を呼び出して、標準入力を変えてしまうことができますし、
標準入力を指定してプログラムを実行することができるOSもあります。

追伸1:
例外をキャッチしたときは、
スタックトレースをプリントすることをおすすめします。
catch (IOException e) {
e.printStackTrace();
}

追伸2:
そのプログラムでIOExceptionを発生させる最も簡単な方法は、
readLine()を呼び出す前に
標準入力(System.in)を閉じてしまうことです。
System.in.close();

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接...続きを読む

QdoGetとdoPostの違い

それぞれブラウザからのリクエストの種類に対応する
メソッドがdoGet,doPost。
doGetはブラウザからGETでそのサーブレットに
リクエストがあった時に、処理が始まるメソッド、
doPostは同じようにPOSTを受け取った時に動き出す

・・・・・ということなのですが、
doGetもdoPostも、中身のコーディングの仕方としては
同様でいいのでしょうか?
いま、doGetでリクエストに対応する処理をうけつけて
いるのですが、255バイトまでなのでdoPostのほうが
いいということがかかれていました。

これは、ブラウザ:Servletのメソッドで対応してれば
いいだけで、結局は送信量の違いだけですか?
そのへんがよくわかってないので教えてください。

ちなみに、doGetでやってる処理は、

public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {

//Bean(workBean)のインスタンス作成
wk = new work_Bean();
//Bean処理実行
wk.Work();





//BeanをJSPに渡すためにHttpServletRequestオブジェクトにセット
request.setAttribute("wk",wk) ;

//ViewであるJSPを呼び出す
RequestDispatcher rDispatcher =
request.getRequestDispatcher("/kanri_JSP.jsp");
rDispatcher.forward(request,response);

こんなかんじでしてます。
あとは、ネットで、人のサンプルとかみると
doGetメソッドに処理をかいており、doPostでは
doGet(request,response);として
doGetをよんでたりするんですが、
これは、PostでもGetと同様の処理ができると
いうことですか?
基本的な質問過ぎるかとおもいますがおしえてください。

それぞれブラウザからのリクエストの種類に対応する
メソッドがdoGet,doPost。
doGetはブラウザからGETでそのサーブレットに
リクエストがあった時に、処理が始まるメソッド、
doPostは同じようにPOSTを受け取った時に動き出す

・・・・・ということなのですが、
doGetもdoPostも、中身のコーディングの仕方としては
同様でいいのでしょうか?
いま、doGetでリクエストに対応する処理をうけつけて
いるのですが、255バイトまでなのでdoPostのほうが
いいということがかかれていました。

これは、ブ...続きを読む

Aベストアンサー

GET と POST では、パラメータをプログラムに渡す仕組みが全く違います。
仕組みが違うので渡せるパラメータの大きさが違う、等の違いが出てきます。

ですが、Servlet では、その違いを request オブジェクトが全部隠してくれて
いるので、気にしなくて良いです。つまり、同じことができて、呼出され方が
違う、と。

普通は、html や JSP の方も、Servlet を意識して書くでしょうから、
どちらかだけの実装で良いのですが、汎用的(呼ぶ人を特定しない)な Servlet
を書こうと思ったら、両方を実装しておく、と理解しておけば良いです。


ちなみに、GET で渡せるパラメータの大きさは 255 バイトと決っているわけでは
ないし、POST で渡せるパラメータの大きさに制限が無い、というわけでもあり
ません。

GET の制限は、どちらかというとブラウザ側の実装によって決ってくることで、
POST に制限があるとしたらサーバ側(例えば、Servlet コンテナ)の実装に
よってきます。

Qフローチャートで 変数に代入するのを ”→” で書くことについて

こんxxは。

早速ですが質問です
プログラムの流れ図を書くときに
変数に数値を代入するとき

number=10 などとかいてはいけないのでしょうか
10→number でなければならない?(矢印をつかわなければならない)

どっちが正しいのでしょうか
また、インクリメントをするときいも
i++ と書いてもいいものなのか、、
i+1→i と書かなければならないのか。。。

フローチャートの定義とか定まっているものですか?

Aベストアンサー

規格上の定義を度外視して現場での話でしを。

ソースコードを含む「ソフトウェアの全ドキュメントの書法」については次の順番で決定権があります。

・ユーザサイドの管理責任者
・開発プロジェクトの管理責任者
・ユーザサイドの担当者
・開発プロジェクトの総意
・開発担当者

つまり、多くの場合は営業的/政治的な理由で決定します。
それがどんなに<<理不尽>>な決定であっても、営業的/政治的決定であれば従う必要があります。
(稀に、決定を覆すことが出来ますが)

いまどきフローを要求してくること自体が理不尽なので、「こう書け!」といわれたら従うしかないでしょう。

Qボタンの複数割り当てについて

public class TestButton extends Applet implements ActionListener
{
     Button bt1,bt2,bt3;

     public void init()
     {
         bt1 = new Button("red");
         add(bt1);
         bt2 = new Button("blue");
         add(bt2);
         bt3 = new Button("yellow");
         add(bt3);
         bt1.addActionListener(this);
      }

java初心者です。アプレットで上のようにボタンを作ります。それぞれが押された時に、red,blue,yellowが表示されるようにしたいのです。ActionListenerをインプリメントしているので、

     public void actionPerformed(ActionEvent ae)

をオーバーライドする必要がありますが、そこで質問です。
ボタンを3種類別々に関連づけるには、actionPerformed内をどのように記述したらよいでしょうか?また、init内はこれだけでいいんでしょうか?
よろしくお願いします。

public class TestButton extends Applet implements ActionListener
{
     Button bt1,bt2,bt3;

     public void init()
     {
         bt1 = new Button("red");
         add(bt1);
         bt2 = new Button("blue");
         add(bt2);
         bt3 = new Button("yellow");
         add(bt3);
         bt1.addActionListener(this);
      }

java初心者です。アプレットで上のようにボタン...続きを読む

Aベストアンサー

これは色々やり方があります。
ボタンをメンバ変数として定義してActionEventの
getSource()メソッドでEventが発生したObjectと
比較するとか、getSource()で取得したオブジェクト
をButtonにキャストしてからgetLabel()でラベルの
文字列を取得し任意の文字列と比較するとか。
他にはアクションコマンドで分岐する方法もあります。

・メンバ変数の例

public class TestButton extends Applet implements ActionListener {
  Button btn1,btn2,bt3;
  public void init(){
    btn1=new Button("red");
    add(btn1);
    btn2=new Button("blue");
    add(btn2);
    btn3=new Button("yellow");
    add(btn3);
  }
  public void actionPerformed(ActionEvent e){
    Object obj=e.getSource();
    if(obj == btn1){
      // "red"の処理
    }
    else if(obj == btn2){
      // "blue"の処理
    }
    else if(obj == btn3){
      // "yellow"の処理
    }
  }
}

・ラベルで比較する例

public void acitonPerformed(ActionEvent e){
  Object obj=e.getSource();
  if(obj instanceof Button){
    Button btn=(Button)obj;
    String labStr=btn.getLabel();
    if("red".equals(labStr)){
      // "red"の処理
    }
    else if("blue".equals(labStr)){
      // "blue"の処理
    }
    else if("yellow".equals(labStr)){
      // "yellow"の処理
    }
  }
}

・アクションコマンドの例

public void actionPerformed(ActionEvent e){
  String cmdName=e.getActionCommand();
  if("red".equals(cmdName)){
    // "red"の処理
  }
  else if("blue".equals(cmdName)){
    // "blue"の処理
  }
  else if("yellow".equals(cmdName)){
    // "yellow"の処理
  }
}

制約が無ければアクションコマンドでの処理が私は好きです。

これは色々やり方があります。
ボタンをメンバ変数として定義してActionEventの
getSource()メソッドでEventが発生したObjectと
比較するとか、getSource()で取得したオブジェクト
をButtonにキャストしてからgetLabel()でラベルの
文字列を取得し任意の文字列と比較するとか。
他にはアクションコマンドで分岐する方法もあります。

・メンバ変数の例

public class TestButton extends Applet implements ActionListener {
  Button btn1,btn2,bt3;
  public void init(){
    btn1=new Bu...続きを読む

Q明示的なserialVersionUIDの意義と定義法

最近コーディングツールをEclipse3.1に乗り換えたのですが、"Serializable class without serialVersionUID"という警告文に出くわしました。

Sunのserializableインタフェースに関するドキュメントを参照したところ、serialversionUIDを明示的に宣言することによってJavaコンパイラの実装環境の差異に対応可能である、という主旨で読み取れたのですが、それがどのようなことであるのか今ひとつ具体的にイメージできません。

また、serialversionUIDを明示的に定義する方法についても、手持ちの文献やwebの検索では調べ切れませんでした。

上記について御存知の方が居られましたら、御教示お願いします。

Aベストアンサー

classファイルの互換性などに関するものです。
シリアライズ/デシリアライズを行うときや、クラスのロードを行うときに関連してきます。
Serializableなclassファイルには必須なのですが、ソース中にないときは勝手に付加されます。

>serialversionUIDを明示的に定義する方法
手順1.自分が作成したクラスに対して、serialverコマンドを実行
http://www.techfirm.co.jp/manual/jdk11ja/tooldocs/solaris/serialver.html
参照

手順2.自分のクラスにserialversionUIDを定義
上記で求めたものを、自分のクラスに追加します。
名前が決まっていることを除けば普通のlong型定数ですね。
宣言の形式は↓のような感じです。
static final long serialVersionUID = -6849794470754667710L;
具体的なサンプルは、JDKのソースを参照してみるといいです。


人気Q&Aランキング