Pascalのinsert関数の使い方

このQ&Aのポイント
  • 整数を入力して、金額表示のように3桁ごとにコンマを打って文字列として表示するプログラムを作成したが、insert関数が正しく実行されない
  • プログラムで使用しているinsert関数の引数の位置が誤っている可能性がある
  • 正しい位置にinsert関数の引数を配置することで問題を解決できる
回答を見る
  • ベストアンサー

Pascal  insertの使い方

プログラミングの授業で 整数(integer)を入力して、金額表示のように3桁ごとにコンマを打って文字列(string)として表示せよ。 という問題が出されました。 やってみた結果が下なんですが、insertがまちがってぃて実行されません。どこが間違ってるか教えてもらえませんか。 program prj7_2(input,output); var st,u,con:string[100]; n,i,x:integer; begin writeln('数を入力してください。'); readln(st); n:=length(st); if n<=3 then writeln(st) else begin i:=1; con:=','; repeat x:=n-3*i; u:=insert(con,st,x); until x:<3; writeln(u); end; end.

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

使っているPascalはTurbo-Pascal(or Delphi) ですか? insert という関数の引数の意味と戻り値の型がわかりませんが、 repeat x:=n-3*i; u:=insert(con,st,x); until x:<3; writeln(u); insertは st の x番目に con を挿入するんだろうなという 気はしますが、 もし挿入結果の文字列が返されるのなら ループの二周目以降はstに対してinsertを 適用しちゃまずくないですか? それを考慮した上で u:=insert(con,st,x); の直後に writeln(u); を追加してみて、どのように文字列が変化していくのか 追いかけてみてはどうですか?

asiuzu
質問者

お礼

無事できました!! 先生にみてもらぃながらになってしまぃましたが. ww sakusaker7さんのぃってることがわかりましたぁぁ♪ 先生もstにたいしてinsertを適用しなきゃと、ぉなじようなことを言ってまして★ できなかったときゎ、こんどから追いかけてみてみます♪ ぁりがとぉございました★

その他の回答 (2)

回答No.3

insertの使い方の練習だと思いますが 3桁毎に数字を区切った文字列にする関数がパスカルには存在します Delphiならば var   st :string;   n,i,x:integer; begin   writeln('数を入力してください。');   readln(st);   x := StrToInt(st);   writeln(FormatCurr(',#', x)); // end. Free Pascalならば 上の最後の行が、   writeln(FormatCurr('###,###,###,###', x)); となります。 ご存じであれば、悪しからず。

asiuzu
質問者

お礼

初心者すぎなので、全然ゎからなぃですね;;ww 授業でならってなぃことゎ使っちゃダメみたぃなので、 つかえなぃんですね(><… でも、参考になりました♪そぉゆうのがぁるんですね♪ ありがとぉございました♪

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

insertが ゼロから始めるDelphi講座 18 http://oto.chu.jp/kujira/text/delphi/zero/18.htm#3 ここで説明されているものだとすると、 関数じゃなくて手続きなので戻り値は取れませんね。 手元にあったGNU Pascalでちといじってみましたが begin i := 1; con := ','; writeln('start : ', st); repeat x := n-3*i; {u := insert(con, st, x);} insert(con, st, x); writeln(i, ' : ', st); i := i+1; until i > 3; {x<3;} writeln(st); end; のようにして確かめると (元の条件では無限ループになりました) please input number: 12345678 start : 12345678 1 : 1234,5678 2 : 1,234,5678 3 : 1,234,5678 1,234,5678 カンマを挿入する場所の判定が間違ってますね。 ヒント 文字列を配列と見なして逆から操作すると楽できますよ。 #処理完了後にもう一回ひっくり返す必要あり

asiuzu
質問者

お礼

すみません;; 初心者すぎて全然ゎからなぃんです;; 逆からとゎどぉゆう??ww でも、無事出来たので、ょかったです♪ 答えてくださってぁりがとぉございました♪

関連するQ&A

  • パスカル→JAVA

    下記のパスカルからJAVAに変えるのですが、わからなくてこまってます。よろしくおねがいします。 { 宣言部 } type ZISU= array[0..99] of real; var n,k :integer; p,VALREAL,VALIMAG: ZISU; { EXTERNAL procedure EVAL ( p:ZISU; n:integer; var VALREAL,VALIMAG:ZISU ); } {$I B:EVAL.SRC} { メ イ ン プ ロ グ ラ ム } begin write(lst,'Input vector'); writeln(lst); read(n); readln; write(lst,' n=',n); writeln(lst); for k:=0 to n-1 do begin read(p[k]); readln; write(lst,p[k]); writeln(lst) end; EVAL(p,n,VALREAL,VALIMAG); writeln(lst); writeln(ist); write(lst,'Output vector [THE DISCRETE FOURIER TRANSFORM]'); writeln(lst); for k:=0 to n-1 do begin write(lst,' ',VALREAL[k],'+(',VALIMAG[k],'*i)'); writeln(lst) end end. 

  • 最大公約数を再帰で求める(pascal)

    入力した整数値の最大公約数を出力するプログラムを再帰呼び出しの形式で作れ、という課題が出ました。 再帰でない形式は下のように作れたのですが、再帰形式がどうしてもできません。どなたかご教授ください。 function gcd(a,b:integer):integer; {関数部} var tmp:integer; begin if a<b then begin tmp:=b; b:=a; a:=tmp end; repeat tmp:=b; b:=a mod b; a:=tmp until b=0; gcd:=a end; repeat {計算部、i=n=入力した個数、max=入力できる最大数} i:=i+1; n:=n+1; data[i]:=x; writeln('値:'); readln(x); until (x=0) or (i=max); if i>=2 then begin p:=gcd(data[1],data[2]); if i>=3 then begin for i:= 3 to n do begin p:=gcd(p,data[i]) end; writeln('最大公約数:',p) end else begin writeln('最大公約数:',p) end;

  • 指定した長さのフィボナッチ数列を出力したい(pascal)

    例えば「長さ:6」と入力すると6桁のフィボナッチ数列の項だけを出力するプログラムを作ってるのですが、意外なところで躓いてしまいました。どこが変なのか教えてください。 program fib_search (input,output); var i,p,x,y : integer; f : array[0..500] of real; function fib(n:integer):integer; begin if(n>=0)and(n<=1) then fib:=1 else fib:=fib(n-1)+fib(n-2); end;{fib} begin writeln('数列の長さ:'); readln(p); x:=0; y:=0; for i:= 1 to 5*p do begin x:= trunc(fib(i)/(10^p)); y:= trunc(fib(i)/(10^(p-1))); if (x=0) and (y>=1) then begin writeln(fib(i)) end end; end. 例えばp=6として、10の6乗で割った数x=0&10の5乗で割った数y>=1 だと6桁、と考えました。1 to 5*p は、ざっと数列を見たところ(桁数×5)項までにその桁の数字はぎりぎり出尽くしている、と考えたからです。 これをコンパイルするとx、y共に「 Replaced '^' with a '+'」と出て、 x:= trunc(fib(i)/10^p); y:= trunc(fib(i)/10^(p-1)) と分母の()を取ると「 Expected ')'」と出てしまいます。 また、「(fib(i))」としても同様「 Replaced '^' with a '+'」と出てしまうのです。

  • 除算がなぜかできません(pascal)

    フィボナッチ数列の連続する項の差の比  z(n) = { f(n-1) - f(n-2) } / { f(n) - f(n-1) } 、 これのz(n-1),z(n)の差の絶対値がある定数以下になった時(100項まで)に計算を終了するプログラムを作ったのですが、何度コンパイルしても上の式の除算部でエラーが起きてしまいます。 どこがおかしいのかご教授ください。 program Toi3 (input,output); const dif = 1.0 * exp(-6); var n : integer; result : real; function f(n:integer):integer; begin if(n>=0)and(n<=1) then f:=1 else f:=f(n-1)+f(n-2); end;{f} function z(n:integer):real; begin z := {f(n-1) - f(n-2)}/{f(n)-f(n-1)} end; begin n:=2; while (n=100) or (result<dif) do begin n:=n+1; result:= abs(z(n)-z(n-1)) end; if n=100 then begin result:= abs(z(100)-z(99)); if result<dif then begin writeln('収束した') end else begin writeln( z(100),'収束しなかった') end end else begin writeln('収束した') end end. エラー: 17 z := {f(n-1) - f(n-2)}/{f(n)-f(n-1)} E 18460--------------------------------^--- Replaced '/' with a identifier In function z: w 18270 variable n is never used

  • Pascal言語で小町算

    Pascal言語で、『1~9の順に数字を並べ、+、-を補い式を作り、 値が100になる組み合わせをすべて出力するプログラムを作成せよ(例:12 - 3 - 4 + 5 - 6 + 7 + 89 = 100)。』 という課題が出ました。自分なりに組んでみたのですが、 12個あると聞いたのに、4個しか出力されません><; どこが間違っているのかご教授いただけると幸いですっ ------------------------------------------------------- program KomachiZan(output); var i,s:integer; var sign:array[1..9] of integer; var x,n:longint; begin writeln('< 小町算 -Komachi Zan- >'); for i:=1 to 9 do sign[i]:=-1; repeat x:=0; n:=0; s:=1; for i:=1 to 9 do begin if sign[i]=0 then n:=10*n+1 else begin x:=x+s*n; s:=sign[i]; n:=i; end; end; x:=x+s*n; if x=100 then begin for i:=1 to 9 do begin if sign[i]=1 then write(' + ') else if sign[i]=-1 then write(' - '); write(i); end; writeln(' = 100'); end; i:=9; s:=sign[i]+1; while s>1 do begin sign[i]:=-1; i:=i-1; s:=sign[i]+1; end; sign[i]:=s; until sign[1]>=1; end. -------------------------------------------------------

  • Pascal言語

    フィボナッチ数列の項は、その直前の連続する二つの項の和である。 f( n ) = f( n - 1 ) + f( n - 2 ) 但し、 f(0) = 0, f(1) = 1 である。   フィボナッチ数列の連続する項の差の比 z = { f( n - 1 ) - f( n - 2 ) }/ { f( n ) - f( n - 1 ) } は、 n が大きくなれば、ある値に収束する。この値の近似値を求める プログラムを書き、その値を示せ。この値は黄金分割比と呼ばれる。 フィボナッチ数列は関数 fibonacci を作って求め、項は配列に表せ。まず 30 項まで求め、黄金分割比の値が収束していく様子を出力して確かめよ。収束判定のために定数 dif = 1.0 e -6 を宣言し、 連続する z の差の絶対値が dif 以下になったとき、収束したとして計算を終了するプログラムを作りなさい。 この問題について質問なんですが コンパイルはできるんだけど、結果がうまく表示されません。 すみませんがわかる方教えてくれませんか? program pe1_2(input,output); const dif = 1.0e-6; var i,m, g : integer; f, z,q : array [0..500] of real; function fibonacci(n: integer):integer; begin if (n >=0) and (n <=1) then fibonacci:=n else fibonacci:=fibonacci(n-1)+fibonacci(n-2); end; { fibonacci } begin f[i]:=fibonacci(i); writeln('30項まで求めます '); for i :=1 to 30 do begin writeln('f(',i:2,')=',f[i]:1); end; write('m='); readln(m); for i:= 3 to m do repeat z[i]:=(f[i-1]-f[i-2])/(f[i]-f[i-1]); until dif >= z[i]-z[i-1]; writeln(z[i]); {writeln('z(',i:3,')=',z[i]:1,','); } end.

  • Delphi6で、実行後、一時停止をしたい。

    Delphi6を使ってPascalを勉強しています。 Delphi6でプログラムを記述し実行すると、MS-DOSが出てきて実行します。 しかし、実行した後すぐに終了してしまうので困っています。 合っているのか確認できません。 そのために一時停止用に型宣言のときに、 x:string;  end.の前に  readln(x)  を付けて止めるようにしているのですが、 プログラムによって止まるのと止まらないのがあります。 どうしてなのでしょうか。 ↓は止まりません。どうしたら止まってくれますか? 配列にデータを追加するプログラムです。 program ng; {$AppType Console} uses SysUtils; var  i, j, n, dat : integer;  a : array[1..100] of integer;  {一時停止のため変数名}  x:string; begin {配列にデータを入力する}  n := 6;  a[1] := 20; a[2] := 30; a[3] := 60;  a[4] := 70; a[5] := 80; a[6] := 90;  writeln('(1)現在の配列の内容');  for i := 1 to n do write(a[i]:3);  writeln;  writeln('(2)挿入するデータ?');  read(dat);  repeat    writeln('(3)挿入する位置?');    read(i);  until(i < n) and (i > 0); {配列への挿入}  for j := n downto i do a[j+1] := a[j];  a[i] := dat;  n := n+1; {挿入後の配列を表示}  writeln('(4)挿入後の配列の内容');  for i := 1 to n do write(a[i]:3);  {一時停止のためのread文}  readln(x) end.

  • 検索がうまくいきません(pascal)

    名前と電話番号を外部環境'teldata'に出力し、検索したい人の名前を入力し対応する電話番号を答えるプログラムを作りました(登録されてなければ「該当者なし」と出力、'end'が入力されるまで続く)。 コンパイルは通ったのですが検索結果はおかしなものになってしまいました。 どこが間違っているのか、ご教授ください。 ソース) program kadai(input,output,meibo); type KojinData = record name : packed array[1..20] of char; tel : packed array[1..15] of char end; var meibo : file of KojinData; x : KojinData; begin rewrite( meibo,'teldata' ); write('名前:'); readln(x.name); repeat write('電話番号:'); readln( x.tel ); write( meibo,x); write('名前:'); readln( x.name ) until (x.name='end'); reset( meibo,'teldata' ); write('名前:'); readln(x.name); repeat while not eof( meibo ) do begin read( meibo,x ) end; if x.name = x.name then begin writeln('電話番号:',x.tel) end else begin writeln('該当者なし') end until (x.name='end') end. 結果) 名前:a 電話番号:1 名前:b 電話番号:2 名前:c 電話番号:3 名前:end 名前:a 電話番号:3 電話番号:3 電話番号:3 電話番号:3 {強制終了するまで続く}

  • プログラムをおしえてください

    下記のプログラムが何を行なっているのか教えてください。 peogram test(input,output); var i,n,s,t:integer; u,v:real; begin read(n) s:=0; t:=0; i:=0; while i<=n do begin s:=s+i; t:=t+i*i; i:=i+1 end u:=s/n; v:=t/n; writeln('n=',n:3,'のときu=',u); writeln('n=',n:3,'のときv=',v); end. nには必ず整数が入力されるということが前提で、i、n、s、t の変数が作られ、結果の実行数値としてu,vが出力されることは わかるのですが、数値がs、t、iが0からどのように変化して どのような実行数値が出されるのかよくわからないので、その内容を 教えてください。よろしくお願いします。

  • pascalにおける乱数の組み込み方

    学校の課題で「1≦x≦n、1≦y≦nの範囲の点(x,y)をランダム個数選び、(0,0)から見える点の個数を数えよ」という課題が出ました。 nは自由に設定し、入力する毎に選択する個数をランダムで決めxとyもその個数分選び、それらの中でGCD(x、y)=1となる点の個数を数える問題です。 参考としてランダムを表すプログラム program seed_example(output); var i,x:integer; begin x := seed(wallclock); writeln('乱数の作成:'); for i := 1 to 10 do begin writeln(random(0)); end; end. が与えられました。(上式のxは問題のxと無関係) 今回の問題では、選ぶ個数を「h」とすると 『h := seed(wallclock);(以下略)』と設定しランダム化させxとyは 『for x(or y) := 1 to h do(以下略)』としてh個選ぶ。 このような考え方で合っているのでしょうか? 回答お待ちしております。

専門家に質問してみよう