Newer
Older
2020-kazuki / kadai.html
<!DOCTYPE html>
<html lang="ja">
<head>
<title>問題</title>
<link rel="stylesheet" type="text/css" href="kadai.css">
</head>
<body>
<h1>各設問の答えと説明</h1>	
<h2>問1、自分の誕生日の西暦年、月、日を全部足した数を 2進数と16進数に直せ</h2>
<p>
自分の誕生日の西暦2001年01月01日を全部足した数<br>
2001+01+01=2003<br>
<答え><br>
 2進数・・・11111010011     16進数・・・7d3<br>
 <br>
<説明><br>
「2進数」・・・10進数の値から2進数を求める場合には、2進数に変換したい10進数の商が0になるまで2で割っていき余りの値を求める。<br>
        そして、その際に求められた余りの値を下から上に読むと「11111010011」となる。<br>
</p>
<pre>
   2)<span class="line">2003</span>   余り<br>
   2)<span class="line">1001</span>・・・1<br>
  2)<span class="line"> 500</span>・・・1<br>
   2)<span class="line"> 250</span>・・・0<br>
   2)<span class="line"> 125</span>・・・0<br>
   2)<span class="line">  62</span>・・・1<br>
   2)<span class="line">  31</span>・・・0<br>
   2)<span class="line">  15</span>・・・1<br>
   2)<span class="line">   7</span>・・・1<br>
   2)<span class="line">   3</span>・・・1<br>
   2)<span class="line">   1</span>・・・1<br>
   2)<span class="line">   0</span>・・・1  ↑ 下から上に読む<br>
 </pre>  

<p>「16進数」・・・2進数の計算にて求められた値「11111010011」を右から4桁ごとに区切と「111,1101,0011」というように分けられる。<br>
                分けた2進数の値を16進数に直すと「7d3」となる。<br>
   0111→7<br>
   1101→d<br>   
   0011→3<br>
   
<h2>問2、ローマ字で書いた自分の名前の文字列の 各文字の文字コードを16進数で表記せよ。</h2>
<pre>自分の名前「Adachi Kazuki」<br>
<答え><br>
 「A」・・・0x41<br>
 「d」・・・0x64<br>
 「a」・・・0x61<br>
 「c」・・・0x63<br>
 「h」・・・0x68<br>
 「i」・・・0x69<br>
 
 「K」・・・0x4B<br>
 「a」・・・0x61<br>
 「z」・・・0x7A<br>
 「u」・・・0x75<br>
 「k」・・・0x6B<br>
 「i」・・・0x69<br>
 <br></pre>
<p><説明><br>
課題であるローマ字で書いた自分の名前「Adachi Kazuki」を16進数で表記するために講義にて説明されたASCIIコード表を使用した。<br>
表から「A」は4行目の1列目にあるため「41」、「d」は6行目の4列目にあるため「64」、「a」は6行目の1列目にあるため「61」<br>
「c」は6行目の3列目にあるため「63」、「h」は6行目の8列目にあるため「68」、「 i 」は6行目の9列目にあるため「69」<br>
「K」は4行目のB列目にあるため「4B」、「a」は6行目の1列目にあるため「61」、「z」は7行目のA列にあるため「7A」<br>
「u 」は7行目の5列目にあるため「75」、「k」は6行目のB列にあるため「6B」、「i」は6行目の9列目にあるため「69」となる。<br>
(2進数を表記する場合には「0b」、16進数を表記する場合には「0x」、8進数を表記する場合には「0」を数値の先頭に付ける。10進数の場合には何もつけない。)<br>
 </p>
 <h2>新しく作成したプログラム</h2>
 <p>
 課題番号...第7回の6番の問題<br>
 「作成プログラム」<br></p>
<pre>#!/usr/koeki/bin/ruby
#-*- coding: utf-8*-

name=[]
bunrui=[]
syouhin=[]
kakaku=[]
i= 0
sum=0
a=0
open("receipt.txt","r")do|rece|
  open("result.txt","w")do|kotae|
  kotae.puts"      公益スーパー"
  kotae.puts""
  kotae.puts"        <領収書>"
  kotae.puts""
  kotae.puts"         公益店"
  kotae.puts"TEL:090-1234-5678     レジ:2番"
  kotae.puts"2020年6月30日"
  kotae.puts"<商品>"
  while line = rece.gets
    if/(\S+\s*+\S+)\s+(\d+)\s+(.+)\s+(\d+)/=~ line
      name[i]= $1
      bunrui[i]= $2.to_i
      syouhin[i] = $3
      kakaku[i] = $4.to_i
      printf("%d %s %d円\n",i,$1,$4.to_i)
      i+=1
    end
  end
 while true
  print"注文?(qで終了)\n"
  line=gets.chomp!
  if line =="q"
    break
  end
  number = line.to_i
  if number<0 ||number>=name.length
    puts"ないです"
    redo
  end
  printf("%sを買いました\n",name[number])
  sum+=kakaku[number]
  kotae.printf("%s %d円\n",name[number],kakaku[number])
 end
 STDOUT.printf("合計金額は%d円です\n",sum)
 kotae.puts"----------------------------"
 kotae.printf("合計金額%d円\n",sum)
  end
end
 </pre>
<p>プログラムの結果とtxtファイル<br>
「プログラムの結果」<br></p>
<pre>
0 "モコモコスパゲッティ" 880円
1 "suidou ざ・movie" 3980円
2 "無邪気白熊" 240円
3 "ウィリーCUB" 180000円
4 "恋愛大皿左巻き" 54000円
注文?(qで終了)
0
"モコモコスパゲッティ"を買いました
注文?(qで終了)
1
"suidou ざ・movie"を買いました
注文?(qで終了)
2
"無邪気白熊"を買いました
注文?(qで終了)
3
"ウィリーCUB"を買いました
注文?(qで終了)
4
"恋愛大皿左巻き"を買いました
注文?(qで終了)
q
合計金額は239100円です
</pre>
<p>「結果txtファイル」</p>
<pre>
      公益スーパー

        <領収書>

         公益店
TEL:090-1234-5678     レジ:2番
2020年6月30日
<商品>
"モコモコスパゲッティ" 880円
"suidou ざ・movie" 3980円
"無邪気白熊" 240円
"ウィリーCUB" 180000円
"恋愛大皿左巻き" 54000円
----------------------------
合計金額239100円
</pre>
<p>「プログラムの説明」</p>
<pre>
6番の課題内容は「receipt.txt にあるデータを入力として 購入したものや合計
金額などを本物のレシートのような書式で result.txt ファイルに出力するプロ
グラム 」の作成だったため最初に読みこむファイル「receipt.txt」と、商品名
と価格を抜きだし書き出すファイル「result.txt」を指定した
      open("receipt.txt","r")do|rece|
      open("result.txt","w")do|kotae|
今回は読みこむファイルと書き出すファイルの指定だったためモードは読み込みのモードである"r"と書き込みのモードである"w"を使用した。
その後、open("receipt.txt","r")do|rece|で開いたファイルからデータを読みこみ処理するプログラムとopen("result.txt","w")do|kotae|に抜き出し、書き出す内容を指定し処理するプログラムを作った。
また、kotae.puts""とすることで出力先に""の中の文字が表示されるようにした。今回の課題では本物のレシートのような形で出力する必要があったためkotae.puts""のようなプログラムを作成した。printやprintfでは改行をするために最後に\nを入れる必要があるが、putsでは\nを入れなくても自然と行の終りに改行が入る形になるため\nを入れる必要がない.
open("receipt.txt","r")do|rece|
  open("result.txt","w")do|kotae|
  kotae.puts"      公益スーパー"
  kotae.puts""
  kotae.puts"        <領収書>"
  kotae.puts""
  kotae.puts"         公益店"
  kotae.puts"TEL:090-1234-5678     レジ:2番"
  kotae.puts"2020年6月30日"
  kotae.puts"<商品>"
  while line = rece.gets
    if/(\S+\s*+\S+)\s+(\d+)\s+(.+)\s+(\d+)/=~ line
      name[i]= $1
      bunrui[i]= $2.to_i
      syouhin[i] = $3
      kakaku[i] = $4.to_i
      printf("%d %s %d円\n",i,$1,$4.to_i)
      i+=1
    end
  end

次にお客様に自由に注文してもらうためのプログラムを作成した。まず始めに何
を注文するかを聞く画面を表示しその後、メニュー番号を入力することでその番
号の食べ物を注文できるようにしその後、注文を繰り返し取れるようにし、qを
入力することで注文を終らせる事が出来るプログラムを作成した。
また、if number<0 ||number>=name.length
    puts"ないです"
    redo
  end
 とすることで0から4番以外の数字が入力された際には「ないです」と表示されるようにした。

while true
  print"注文?(qで終了)\n"
  line=gets.chomp!
  if line =="q"          #"q"を入力したら
    break                #   終了
  end
  number = line.to_i      #メニューに番号をつける(整数にする)
  if number<0 ||number>=name.length
    puts"ないです"
    redo
  end
  printf("%sを買いました\n",name[number])
  sum+=kakaku[number]
  kotae.printf("%s %d円\n",name[number],kakaku[number])
 end

そして最後に、標準出力をし注文した商品の合計金額を出力を出来るようにした。

STDOUT.printf("合計金額は%d円です\n",sum)
 kotae.puts"----------------------------"
 kotae.printf("合計金額%d円\n",sum)
  end
end
</pre>
 
</body>
</html>