カテゴリ: 13.実際にやってみる

windows8.1の環境でJavaのプログラミング

Eclipseを丸ごとインストール
https://blog.codecamp.jp/eclipse


以下、順番に入れていったが、日本語化もうまくいかなかったし、ちょっと面倒。
■1.JDKのダウンロードとインストール
①以下からJava Platform (JDK) をダウンロード
http://www.oracle.com/technetwork/java/javase/downloads/jdk10-downloads-4416644.html

②ダウンロードしたjdk-10_windows-x64_bin.exeをインストール。特に設定を変える必要はなく、そのまま次へ
③PATHの設定
このままだとJavaの実行ファイルのPATHが通っていないので、PATHの設定をする
「システムのプロパティ」「詳細設定」「環境変数」「システム環境変数」「Path」の先頭に
C:\Program Files\Java\jdk-10\bin
を追記
→うまく動作しなければ、再起動が無難(私は再起動して初めて動いた

■2.Eclipseのダウンロードとインストール

Eclipse IDE for Java EE Developersをダウンロード

http://www.eclipse.org/downloads/eclipse-packages/
Java EE
②実行

※日本語化もできるが、うまく行かず。

■3.eclipse.exeを起動

■画面に表示するプログラム (pg.c) 
#include<stdio.h>
int main(){ 
 printf("こんちくは\n");
}

実行結果は以下です。コンパイルして、pgという実行ファイルを作ります。
c:\work>gcc -o pg pg.c
c:\work>pg
こんちくは

順に解説します。
#include<stdio.h> // 標準入出力の関数が定義されたファイルを読み込む
int main(){ //引数が無い(=値を渡さない)関数main関数。
 printf("こんちくは\n"); //「こんちくは」と表示。文字列は""で囲う
}

2行目のintは、戻り値の変数の値の型です。この場合はint(整数)です。

じゃあ、戻り値が無いのにこんなふうにかくの?

→以下で試してみましょう。
main(void){  ⇒エラー
int main(void){  ⇒正常動作
void main(void){  ⇒正常動作
int main(){  ⇒正常動作
void main(){   ⇒正常動作

次に、戻り値の returnを試してみましょう。
returnは、main関数を修了するという意味です。このとき、int mainとして戻り値の型を整数に宣言しています。return 0は、戻り値として0をセットしています。この戻り値ですが、他の関数からこの関数を呼んだ場合、呼び元の関数に戻り値を渡します。 
#include<stdio.h>
int main(){ 
 printf("こんちくは\n");
 returun 0;
}

①returnなし ⇒正常動作
②return;  ⇒voidで宣言すれば、正常動作。intで宣言した場合は、エラー
③return 0; ⇒正常動作。ただし、voidではなく、int mainで開始した場合にのみ。intでは戻値の型を指定しているので、当然といえばそうである。 
④returun19; ⇒正常動作。ただし、voidではなく、int mainで開始

配列を作ると、メモリにアドレスが確保されます。その様子をプログラムで実行します。
#include <stdio.h>
void main() {
    int A[100];  // 配列変数Aを定義。保存可能個数は100個でA[1]-A[100]を使用可能。
    int k;// 整数型の変数kを定義
    // kを1から100まで、1ずつ増やす(k++)
    for (k = 1; k <= 100; k++) {
        A[k] = k; 
        printf("A[%d]_add:%p\n",k,&A[k]); //A[k]のアドレスを表示
    }
}

結果は、以下のようになります。

c:\work>pg1.exe
A[1]_add:0028FDA0
A[2]_add:0028FDA4
A[3]_add:0028FDA8
A[4]_add:0028FDAC
A[5]_add:0028FDB0
A[6]_add:0028FDB4
A[7]_add:0028FDB8
・・・・
続きを読む

■H25春
問7 配列Aに対して次の手続を実行して,2≦k≦100である素数kだけを全て出力したい。a,b,cに入るループの初期値,終値,増分として,適切な組合せはどれか。

for k = 2 to 100 step 1:
  A[k] = 1;
for m = 2 to 10 step 1:
    for k =[   a   ] to [   b   ] step [   c   ]:
   A[k] = 0;
for k = 2 to 100 step 1:
  if A[k]≠0:
   print k;

H25h-問7
【正解】イ
実際のプログラムの例は以下
#include<stdio.h>   // stdio.h(標準入出力を行うための関数が定義されたファイル)を読み込む
// main関数。引数は取らない。処理後に値を返さない
void main() {
    int A[101];    // 配列変数Aを定義。保存可能個数は101個でA[0]-A[100]を使用可能。
    int k, m;  // 整数型の変数kとmを定義
    // kを2から100まで、1ずつ増やす(k++)
    for (k = 2; k <= 100; k++) {
        A[k] = 1;  // A[2]-A[100]をすべて1にしている
    }
    // 2の倍数-10の倍数をリストから消していく
    for (m = 2; m <= 10; m++) { // mを2から10まで1ずつ増やす
        for (k = 2*m; k <= 100; k += m) {
            // kを2mから100までmずつ増やす
            // つまりkは2m, 3m, 4m,・・・と変化
            A[k] = 0;  // kはmの倍数=素数ではないから0にする
        }
    }
    for (k = 2; k <= 100; k++) { // kを2から100まで1ずつ増やす
        if (A[k] != 0) {  // A[k]が0でない、つまりkが素数なら
            printf("%d,", k);  // kを表示
        }
    }
}
【処理の解説】
・エラトステネスのふるい法を使って素数を求めています。
・変数Aは、0か1の値になるが、A[k]=0なら非素数、A[k]=1なら素数(処理の途中では「素数の可能性」)
・まず2から100をすべて素数かもしれないリストに入れる
   (k=2-100についてA[k] = 1)
素数とは「約数として自分と1だけもつ」ことから、「何かの倍数であれば素数ではない」という考えで、倍数をすべて消していく。具体的にはA[k] = 0

与えられたa,bは正の整数です。a,bの最大公約数を求めます。
フローチャートは、情報処理技術者試験(H29春AP問6)にあります。

終了時にxに格納されているものが、最大公約数です。
※mod(x,y)はxをyで割った余りです。
H29h-問6
たとえば、以下の数字で考えます。
x=20、y=25

■ループ1:t=20、x=25、y=20
■ループ2:t=5、x=20、y=5
■ループ3:t=0、x=5、y=0 ←ループ終了

終了時にはxに、a(20)とb(25)の最大公約数である5が入ります。

プログラム
実際にCでプログラムを書いてみると、以下のようになります。
#include <stdio.h>

//mod関数("x"を"y"で割った余りを計算する)
int mod(int x, int y)
{
 //"%"は余りを計算する演算子
 return x%y;  //"x"を"y"で割った余りを返す
}

//main関数
void main(){
 int x, y;
 int t;   // 余りを入れる

 //標準入力からxとyの値を取得
 printf("整数aを入力してください:");
 scanf("%d", &x);
 printf("整数bを入力してください:");
 scanf("%d", &y);

 //while文で"y"が0以外の場合はループ1を実施
 while(y!=0){
  t = mod(x, y);  //定義したmod関数の戻り値を"t"に代入
  x = y;  //"y"の値を"x"に代入
  y = t;  //"t"の値を"y"に代入
 }

 printf("x=%dです\n", x);
}

プログラム(xとyの入力チェックを含めた少し詳細なもの)
#include <stdio.h>

int mod(int x, int y)
{
 return x%y;
}

void main(){
 int x, y;
 int t;

 printf("input x:");
 if(scanf("%d", &x)!=1){  //数値の取得に失敗した場合
  printf("入力エラー\n");
  return;  //プログラムの途中終了
 }

 if(x<=0){  //xが正の整数で無い場合
  printf("数値が不正です\n");   //プログラムの途中終了
  return;
 }

 printf("input y:");

 if(scanf("%d", &y)!=1){
  printf("入力エラー\n");
  return;
 }

 if(y<=0){
  printf("数値が不正です\n");
  return;
 }

 while(y!=0){
  t = mod(x, y);
  x = y;
  y = t;
 }

 printf("x=%dです\n", x);

}

fact(n)は,非負の整数nに対してnの階乗を返す。
たとえば、fact(4)=4×3×2×1=24 です。これを求めるプログラムを書いてみます。

1.再帰的に書く場合
#include <stdio.h>

//fact関数
int fact(int n)
{
 if(n==0){  //"n"が0の場合
  return 1;  //1を返す
 }
 else{//"n"が0以外の場合
  //"n-1"を引数としてfact関数の再帰呼び出し
  return n*fact(n-1);  //"n"と戻り値の積を返す
 }
}

//main関数
void main(){
 int n;  //"n"をint型変数で定義
 //標準入力からnの値を取得
 printf("nの値を入力してください:");
 scanf("%d", &n);   //scanfを利用して整数入力させ、nに入れる

 //fact関数を階乗の結果を呼び出して表示する
 printf("fact(n)=%dです\n", fact(n));
}
ああ

2.再帰的に書かない場合
#include <stdio.h>

void main(){
 int n; //ある整数n
 int fact = 1; //nの階乗。最初は1とする
 int i; //ループに使う値
 
 // 標準入力からnの値を取得
 printf("nの値を入力してください:");
 scanf("%d", &n);   //scanfを利用して整数入力させ、nに入れる
  
 //階乗の計算。iを1から順にnになるまで掛け算する
 for(i=1; i<=n; ++i) {
     fact = fact * i;
  }; 

 //結果を表示する
 printf("%dの階乗は、%dです\n",n,fact);
}
 

if文とelseを使って、条件分岐をする。

◆シンプルにプログラムを書いてみた。
正の整数を入力してもらう。xが0以下の場合はエラーとして強制終了する。
#include <stdio.h>

void main(){
 int x;

 printf("正の整数xの値を入力してください:");
 scanf("%d", &x);   //scanfを利用して整数入力させ、xに入れる

 if(x<=0){  // "x"が0以下の場合
  printf("正の整数ではありません\n");
  return;  //プログラムの途中終了
 }
 else{
  printf("入力された値は%dです。\n", x); 
 } 
}

※今回の場合、else {}でくくらなくてもいい。

まず、言葉の定義から
・引数:関数に渡す値
・戻り値:関数の処理をした結果、呼び出し元に返す値
・関数(function):サブプログラムとでもいうのでしょうか。値を渡され、その演算をして結果を返す。
たとえば、2つの値、xとyがあって(←xとyが引数)、
それを、hikakuという関数で、大きい値を求めます(←この値が戻り値)

関数の書き方は、以下です。

戻り値の型 関数名(引数)

(例1)一般的な場合(戻り値がある)
  int fact(int n)
  引数:nというint型の値
  戻り値:関数factによる演算結果で、int型
  関数:factという処理。内容は、そのあとの{}で囲まれた中に記載される。
returnで戻り値を返す
 
(例2)戻り値が無い場合
  voidを使う
voidは戻り値が無いという意味です。(returnを使わない、またはreturn 10などと戻り値を入れず、returnのみと記載)。例えば、printfにて表示する。
 
(例3)main関数
void main(){
 メイン関数。

■プロトタイプ宣言
いろいろな処理をする関数を書き、最後にmain関数を書きます。先にmain関数を書いて、後ろにその他の関数を書く場合、関数の型だけを先に宣言しておく必要があります。それをプロトタイプ宣言といいます。

scanf(スキャンエフ)を使って、キーボード入力。この場合は、整数値をxに入れる
 scanf("%d",&x);

◆1.シンプルにプログラムを書いてみた。
整数入力としてxに値を入れて、それを表示する
#include <stdio.h>

void main(){
 int x;
 printf("xの値を入力してください:");
 scanf("%d", &x);   //scanfを利用して整数入力させ、xに入れる
        //%dは整数の場合で、%fは浮動小数点、%cは文字などと決められている
 printf("入力された値は%dです。\n", x);   // "\n" は改行コード。%dにxの値が入る。
}

※戻り値がなく、単に表示するだけなのでvoidを使っている。
※実行してきちんと動くと、うれしい。

◆2.数字が入力されているかをチェック
文字ではなく数字が入力されているかのチェックし、数字ではない場合には「入力エラーです」と表示する場合は次のようになります。
#include <stdio.h>

void main(){
 int x;
 printf("xの値を入力してください:");

// 文字ではなく数字が入力されたかのチェック。scanfは取得に成功したデータの数を返す。よって、値が1でなければエラー
if(scanf("%d", &x)!=1){ //数値の取得に失敗した場合
  printf("入力エラーです\n");
  return;  //プログラムの途中終了  
 }
 
 printf("入力された値は%dです。\n", x);  
}


プログラムを書いてみた。
printfを使って、「こんちくは」と表示する

#include<stdio.h>

void main(){

 printf("こんちくは");

}

戻り値がなく、単に表示するだけなのvoidを使っている。
※実行してきちんと動くと、うれしい。

■WindowsでのCの環境
WindowsでCのコンパイル環境(gcc)が欲しいので、以下に従う
http://yohshiy.blog.fc2.com/blog-entry-292.html

MinGW のダウンロード
https://sourceforge.net/projects/mingw/?source=typ_redirect

欲しいのはCのコンパイル環境だけなので
mingw32-base
mingw32-gcc-g++
を選択してInstllationタブからApply Chagesから「apply」
※格安SIMからのテザリングのせいか、結構時間がかかる

PATHの設定をします。システム環境変数のPATHのところを編集して、最後に「;C:\MinGW\bin」を追記

これで完成。再起動は必要なかった。

■コンパイル
コマンドプロンプト(cmd)を起動して、以下のコマンドでコンパイル。
gcc -o test test.c

※テキストでtest.cというファイルを作り、上記コマンドを実行するとtest.exeという実行ファイルが完成する。上記にて、以下のように実行しても結果は同じ
gcc -o test test.c
※拡張子は「.c」である必要あり。「.d」にしてみると、エラーになる。
※文字化けするときは、メモ帳ではなくなんらかのエディタで文字コードを「Shift-JIS」で保存すると治る可能性がある。

こっちの方がわかりやすいかな。
gcc pg1.c -o pg1
※-oで出力するファイルを指定する。指定しないとa.outという名で出力される

■Linuxでc
こちらは環境があるからそのまま実行できる。私はAWSの上で実行した。

①プログラムのソースファイル(pg1.c)を作成
#include<stdio.h>
int main(){
 printf("こんちくは\n");
}

②コンパイル
# gcc pg1.c

すると、a.outというファイルが作成される
# ls
a.out    pg1.c

③ファイルの実行     
# ./a.out
こんちくは

■ドットインストール C言語入門
http://dotinstall.com/lessons/basic_c
とてもわかりやすいVTR。

■メモリのアドレスを表記   
#include<stdio.h>
int main(){
 int a=10; //整数aを定義してaに10を代入
 printf("a=%d\n",a); //aの値を表示
 printf("aのアドレス=%p\n",&a); //aのメモリ上のアドレスを表示
}

実行結果は以下です。
c:\work>pg4
a=10
aのアドレス=0028FF2C

http://sc.seeeko.com/archives/5377814.html

■LinuxでPython
①インストール
# yum -y install python36

※Centos7だと、デフォルトでPython2がインストールされていると思う。

②バージョンの確認
# python3 --version
Python 3.6.8

③Pythonの実行。対話モードで実験
[root@localhost user]# python3
>>> 1+2
3

このように、プログラムが動いてくれる。

■PythonをLinuxで
いろいろと処理をしてもらった。やはりPythonは便利だと思う。

①Pythonの起動
#python3
>>>
②四則演算の実行
>>> 1+3
4
③抜ける
>>>quit()

(1)CTF問題。配列を降順に並び替える
https://ctf.cpaw.site/questions.php?qnum=14

単純化して、[15,1,93,52,66,3]を降順に並べ替えたいと思う。

# python3
>>> a=[15,1,93,52,66,3]  ←aという配列に値を入れる
>>> a.sort()    ←ソートする(昇順)
>>> print(a)
[1, 3, 15, 52, 66, 93]
>>> a.reverse()   ←降順に並べ替え
>>> print(a)
[93, 66, 52, 15, 3, 1]
>>> b=map(str,a)   ←数字はこのあとのjoinが使えないので、文字に変換
>>> c=''.join(b)  ←結合して結合した間には''として何も入れない
>>> print(c)   
9366521531  ←CTFの目的の結果が得られた。

---以下は設定メモ
https://python3.hateblo.jp/entry/2019/02/03/103544

◆Python(パイソン)
・Pythonは、ニシキヘビの意味らしく、ロゴも蛇が2匹である。
・バージョン 2.x代と3.0代では大きく違う
現在では、Python3.6か3.7を使うだろう
 ・攻撃コード(PoCコード)などはPythonで書かれることが多い。セキュリティ系のエンジニアはPythonを使うことがよくある。
・Googleのサービスでは主にPythonで書かれている。AIでも活用されている。
・Pythonは手続き型のCとは異なり、オブジェクト指向型の言語です。これは、Javaと同じなのですが、Javaは基本はコンパイルしますが、
VBScriptやJavascriptなどのように、スクリプト言語です。※スクリプト言語の方がわかりやすくて便利ですよねー。
・Cなどに比べてシンプルな構文になっているので、初心者でもわかりやすい言語かもしれない。
・感覚でしかないが、Javaの半分以下で書けると思う。→習得も早い
 ・Pythonは基本はLinuxで使いましょう。Windowsでも使えるが、モジュールなどが不十分だったりする。
・解説は以下がありがたい。
http://www.tohoho-web.com/python/index.html

◆print 文字を表示する
#文字列を表示する。文字列は"で囲う
print("こんちくは") 

#改行を含めて表示するには"""で囲う
print("""ab
 cde
 fg""")

※・スライス
[開始位置, 終了位置, 間隔]
moji='pythonnobenkyou'
 print(moji[2:10:3])
 2文字目から10文字目までを3文字間隔で取得

→結果はtnb

◆変数
 (1)全般
javaでもCでも型の宣言が必要だったが、不要
moji="こんちくは"

※ダブルクォーテーション”でもシングルクォーテーション’でもどちらでもいい

では、文字を変数で表示してみましょう。
moji="こんちくは"
print(moji)

(2)有効範囲
・変数は関数の中と外では、同じ変数aでも別物と扱われる
 ・関数の内で宣言された変数はローカル変数、外で宣言されたのはグローバル変数
・globalとつけることで、関数内に閉じない変数を宣言できる
 
 (3)定数
 値を変えない定数を定義する場合は、大文字で書くことが慣習。
たとえば、消費税をTAX=1.08 とする

◆データ型
cやJavaではデータ型を宣言していたが、pythonでは不要。
→便利ですよねー。
 文字を入れたら文字型に、数字を入れたら数値型にしてほしいって思ってた。

参考までにtypeは、文字の型を表示する。
 以下は文字を入れた場合と数字を入れた場合

>>> a="こんちくは"
 >>> type(a)

 >>> a=2
 >>> type(a)

 >>> a=12.345
 >>> type(a)

※Javaなどでは文字型(Char)と文字列(String)があったが、Stringで統一されている気がする

・型変換 →キャストする、とも言います。
 変数の型を指示することで、型を変換できる。
int()
 str()
(例) 整数を文字と足すとエラーになるが、以下のようにstr(a)
として文字型にしている。

>>> a=3
 >>> "こんに"+a
 Traceback (most recent call last):
 File "", line 1, in
 TypeError: can only concatenate str (not "int") to str
 >>> "こんに"+str(a)
 'こんに3'

・辞書型がある。以外に便利なので、後述

◆演算
Pythonに限らず、CやJavaでも基本的に同じである。
1.足し算
2.引き算
3.掛け算
4.割り算
// 割り算で、少数以下を切り捨てる
 → 10//3  →3になる
% あまり (例)5%2 →あまり1

5.2乗
n+=5 → n=n+5
 n-=5 → n=n-5

== 等しい
 →1==1と実行すると、一致するのでTrueが返る
!= 等しくない
><
 >=<=

・優先度は掛け算や割り算が優先
3+5*2であれば、掛け算が先
 (3+5)*2 とかっこをつけると、かっこの中が優先

・文字列の足し算、掛け算もできる。引き算はできない。
> "こんち"+"くは"
こんちくは
> "こんち"*3
こんちこんちこんち

・論理演算 AND、OR、NOTなど
 たとえば、以下
>>> True and False  ←AND条件
False
 >>> True or False   ←OR条件
True
 >>> not True  ←NOT(否定)
False

◆文字入力
javaに比べたら、驚くほど簡単である。なぜ、javaはあんなに面倒なんだろうか・・・

(例文)
print("文字を入力してください")
a=input() #1行で、a=input("文字を入力してください")としてもOK
 print("あなたが入力した文字は" + a + "ですよねー。")

入力された文字をint型にするには
a=int(input())

◆関数
 関数はあらかじめ作成されているものもあれば、自分で作ることもできる。
 関数を使うことで、毎回処理を書く必要がないので、楽である。

あらかじめ作成されている関数は以下に記載がある。
https://docs.python.jp/3/library/functions.html

先に紹介したtypeもその一例
>>> a=2
 >>> type(a)

→自分で関数を作ることに関しては、後述

◆print
C言語みたいに、変数の型に応じた表示が必要。
string(文字列)型は%s、int型は%d
 (例)
moji="モジ"
atai=123
 print("moji= %s,atai=%d" %(moji,atai))

・改行を無しにする
printで、end=''とする。
? ? ? ? ?(例)

for i in range(5):
 print(i,end='')

◆if文
if 条件式:
 処理 #{}がないので、位置が重要。tabでインデントの調整をする
elif 条件式: #else if じゃないよ
 処理
else:
処理

(例)
a=70

if a>=80: # この条件が正しければ、以降の処理は行われない
print("Good")
 elif a>60:
 print("WoW")
 else:
 print("Sorry")

※もちろん条件を組み合わせることも可能。
a>60 and a<=70

★重要
javaなどの場合、開始と終わりが{}で囲われていた。
なので、どこまでがif文の内容なのかがわかりやすかった。
しかし、pythonでは{}がないので、改行位置で終わりを判断する。

たとえば以下は、文字列mojiの中に、sがいくつ入っているかのプログラム

moji='I am a boy.I like sushi very much'

i=1
 for a in moji:
 if a=='s':
 print(str(i) + '番目にsがあった!')
i += 1   ←この位置が重要。上のprintと同じインデントの場合、
a=='s'の条件の続き、つまり一致したらiのカウントを足す。インデントを
前にずらすと、if文とは条件とは関係なくiが加算される。

◆for によるループ

for i in range(5):
処理

例)
pythonfor i in range(5):
 print(i)
else:
    print(str(i)+'でした')

・javaなどと同様に、break、continueも使える

◆while によるループ
i=0
 while i<5
 print(i)
 i +=1

※こちらも、elseやbreak、continuなども使える

◆エスケープシーケンス
// /は無効化しているので、/を意味する
/' 上と同じで’を意味する。
/n 改行
/t タブ
"""で記載すると、コメントになるが、そのあとに書いた文字の改行がそのまま使われる。

◆リスト (=CやJavaなどの配列)
 便利ですね。CやJavaで初めて学習したときは、ピンときませんでしたが・・・
以下、とても詳しいです。
https://www.sejuku.net/blog/23633

添え字というか、番号は0から始まる

・宣言方法
a=[]
 or
 a=[75,70,80,90,70] #5教科の点数をイメージ

以下を実行してみましょう。どうなるでしょうか。
a=[75,70,80,90,70] #5教科の点数をイメージ
print(a) # [75,70,80,90,70] と表示
print(a[0]) #75を表示
print(a[3]) #90を表示
print(sum(a)) #合計385を表示
print(sum(a)/len(a)) #平均点77を表示

・リストの操作
リスト(配列)のソート(小さい順に並べる)したり、逆にしたりできる
ab=[75,70,80,90,70]
 print(ab)
 ab.sort() // ソートする
print(ab) // [70, 70, 75, 80, 90]
 ab.reverse() // 逆にする
print(ab) //[90, 80, 75, 70, 70]
 ab.insert(0, 100) //先頭に100を追加する。0は位置で、先頭。-をつけると、後ろから何番目という書き方もできる。-2であれば後ろから3番目

■配列の処理 
・clear 配列の全ての要素を削除
・remove 該当する要素の最初を削除
・del  インデックスを指定するなど
 ・appendで末尾(end)に追加(app)
・extendでリストを結合できる

■( )と[ ]
 [ ]は配列です。()もあります。

x = ('word',123)
 print(x)
 y=['word',123]
 print(y)
 z='word',123
 print(z)

⇒結果
('word', 123)
 ['word', 123]
 ('word', 123)

◆range関数
range(5)を使って、[0,1,2,3,4,5]という配列を作る
http://programming-study.com/technology/python-range/

for i in range(5):
 print(i)

これにより、0から4が表示される。
 単に、0から4のループとしても使える。

さて、いくつか実行してみましょう。

>>> print(range(5))
 range(0, 5)
 >>> print(list(range(5)))
 [0, 1, 2, 3, 4]


◆関数の作成
・def 関数名:
 処理

単純な例を作ります。helloという関数を作り、hello()で呼ぶ。ただこれだけ。
? ? ? ? ?pg1.py 

def hello():
 print("こんちくは")

hello()
 
・引数を渡すことができる。引数がない関数はkan()な感じ。
・戻り値をreturnで返せる。※returnの後の処理は実行されない。

・小文字のアルファベットで作ろう。先頭に数字はダメだったはず。

・スクリプト言語なので、上から順に実行される。関数の順番にも注意が必要

(例)値を入力し、その値の2倍を返すプログラムを作る

def bai(x): #これが関数
y=x*2
 return y #2倍にして返り値をyとして返す

print("数字を入力してください") #画面に表示
x=int(input()) #入力された文字をxに入れる。intにしておかないと、文字列として扱われてしまう
z=bai(x) #bai(x)だけにすると、関数baiで実行した返り値を受け取ることができない。なので、受け取る箱としてzを用意
print(z) #返り値として受け取った値を表示する。
 
◆モジュール
関数よりも大きな次元で、ファイルとして部品化すること。
たとえば、印刷機能などは、どのプログラムでも使うので、モジュールとしてどのプログラムからでも呼び込めるようにしたほうがいい。

モジュールを使うにはimportする。
 標準モジュールの場合は、すでに組み込まれているので、宣言するだけ。
たとえば、randomのモジュールをimportすれば、ランダム数の簡単に作成できる。

作成したモジュールの場合は、たとえばそのモジュールをmod1.py とした場合は、以下を記述する。
import mod1

そして、モジュールの中の関数を使うには、モジュールを指定して関数をつける。たとえば、mod1.func

・追加のモジュールというかライブラリはpipコマンドでインストールできる。
Linuxのyumのイメージ

※パッケージとモジュール
 プログラムを部品化してモジュール化しますよね。
さらに、そのモジュールをまとめてパッケージにすることができます。
__init__.py という名前のファイルが、パッケージを含むディレクトリに(基本
 的には)必要です。
http://www.tohoho-web.com/python/module.html

◆コマンドライン引数
CやJavaと同じである。コマンドを入力する際に、引数をいくつか渡す。
※最初にsysをインポートする。
? ? ? ?pg1.py

import sys
 print(sys.argv[1])
 print(sys.argv[2])

※sys.argvという配列(リスト)に、入力された文字が格納されている
 では、上記に引数を渡して実行してみよう。

>pg1.py 10 25
 10
 25

◆文字列の処理
いろいろなメソッドが用意されている。

replace() →文字列の置換
find()→文字列の検索
lower()→文字を小文字にする
split()→文字を区切る

◆クラス
 クラス名の先頭は大文字。c.f.変数は小文字
インスタンスを作るには、インスタンス名=クラス名()とする。

(例)成績のクラスを作り、英語と数学の合計を出す
pg1.py
pythonclass Score:  #Scoreというクラスを作成
    def sum(self,english,math): #sumというメソッドを作成。最初の引数は必ずself
        return english+math
user1=Score() #Scoreクラスのuser1のインスタンスを作成
print(user1.sum(75,85))
user2=Score() #Scoreクラスのuser2のインスタンスを作成
print(user2.sum(70,65))

◆コンストラクタ
インスタンスを作成したときに実行されるもの
Classの中にインストラクタのメソッドを書く。
 具体的には、__init__で作成する。

(例)
class Score: #Scoreというクラスを作成
def __init__(self,english,math): #最初の引数は必ずself
 self.english=english #このように、self.となるので、selfはインスタンスみたいなものとも考えられる。
self.math=math
 def sum(self): #合計を求める
print(self.english+self.math)
 def avg(self): #平均を求める。
print((self.english+self.math)/2)

user1 = Score(75,85) #user1のスコアを代入←クラスにデータを持てる
user1.sum() #user1の合計を表示 ←クラスの手続きを実行できる
user1.avg()
 user2=Score(70,80)
 user2.sum()
 user2.avg()

◆インスタンス変数
インスタンスで持つ変数。→クラス変数もある
「self.変数」の形で書く。
Classは概念で、インスタンスは実体という説明をしたと思いますが、車というクラスの中に、マーチやカローラやセルシオなどの複数の実体があります。
クラスで変数を定義してしまうと、すべてのインスタンスで共通の変数になります。
 一方、インスタンス変数であれば、インスタンスごとに独立した変数を持てます。

◆クラスの継承
 親クラスのメソッドなどを子クラスに継承する。
たとえば
class Parent: #親クラスの定義
・・・
class Child(Parent): #親クラスParentを継承
・・・

親クラスのメソッドを使う場合にはsuper()を使う

◆メモリ空間
Pythonでまメモリの領域を表示するにはidを使う。

>>> a=123
 >>> id(a)
 140709562806928

◆例外処理
try:
 except:
これにより、例外発生(0で割る)などが発生したときの対処ができます。
たとえば、以下

pg1.py
pythona=int(input('数字を入力してください'))
try:
    print(10/a) #aで割るので、aが0だと例外処理にしたい
except:
    print('ダメよーダメダメ')
c:\python>test.py
数字を入力してください5
 2.0

c:\python>test.py
数字を入力してください0
ダメよーダメダメ

最後に、finallyをつけると、例外処理に関係なく処理を実行できる

◆ファイル操作
pythonでは、ログファイルを見て検索したり、ファイルから何かの処理をすることがある。
こういう使い方が多いかなー。
ファイル操作はぜひ知っておきましょう。

file1=open('file1.txt') #ファイルを開く
#通常は読み込みなので、これでいいでしょう。または、モードをつけることもできる。
w 読み(read)  ⇒w+でよみ書き
r 書き(write)
 a 追記(add)

#file1=open('file1.txt','r')
 file1.close() #ファイルを閉じる

・ファイルを読み込む。
メソッドを覚えましょう
file1.read() #すべてのファイルを読み込む
file1.readline() #1行を読み込む
file1.readline() #すべての行を配列で読み込む

・withを使うと、close()が不要になるので便利
with open('file.txt') as file1:

・1行ずつ読み込むのは以下がいいだろう

file1 = open('file1.txt', 'r')
 for data in file1:
 print(data,end='') #print(data)でもいいが、end=''で改行コードを無しにしている。
file1.close()

・読んで書き出すなどもよくあるだろう。
 一例ですが、以下
http://python4study.9isnine.com/file

◆Linux上でPythonを動かし、OSのLinuxOSのコマンドを実行する
subprocessをimportする。
いろいろなメソッドが用意されているが、たとえば、callは実行できたかを0か1で
返す。
 実際には、生のコマンド結果を見たいだろうから、check_outputのメソッドを使う。
このとき、半角スペースごとにコマンドは配列に入れて、['ls','-la']のようにする。
 。またはSplitで分ける。
また、decode()を入れておくと、結果が改行されて普通に見ることができる。

import subprocess
 print(subprocess.check_output(['ls','-la']).decode())

◆辞書型
 辞書は英語のスペルと意味を持ちます。たとえば、red:赤 のように。
このように、辞書形式というか表形式の値を持てます。
 辞書型は{}で囲います。

>>> a={'English': 70, 'Math': 40, 'Science': 80} #辞書型に値を入れる
>>> type(a) # 型を確認すると、dict(辞書型)とでる

>>> print (a['Math']) #aの中のMathの値を表示
40
 >>> print(a.values()) # こちらでも同じくいろいろなメソッドがあり。これは値を表示
dict_values([70, 40, 80])

■もろもろ
①コメント
1行コメントは#
複数行の場合は'''または """

②終わりの;
Javaなどであった;は不要。;を使って、2つの行を一つにすることもできる。
たとえば
a=10
 b=5
 →a=10;b=5

③python インタプリンタ
?i 対話モード(おそらくintructive)
?m モジュールの指定

■pycは、pythonのファイルでコンパイル済のもの

■sort
 key=lambda で、そのあとに配列の番号を指定すると、その配列でSORTをする
https://qiita.com/n10432/items/e0315979286ea9121d57

■置換 replace
 word = 'abcabcabc'
 print(word.replace('a', 'x'))


 xbcxbcxbc

最大置換回数を指定する場合は、数字をつける

print(word.replace('a', 'x',2))
 ⇒
 xbcxbcabc

■JSON形式にエンコード
import json でインポートした後
json.dumps(a) で、変数aをJSON形式にする
https://programming-study.com/technology/python-json-dumps/

■pass
何もしないけどコードを書く必要がある場合に使う

■数値
・a=1/0
としてみる。すると、0で割ることはできないので、以下のようなエラーが出る
ZeroDivisionError: division by zero

・複素数 高校でやった3+2iみたいなやつ。実数+虚数(i)
 iではなく、jを使う。
ちょっとやってみましょう
c = 1 + 2j
 d = 1 - 2j
 e = c*d
 print(e)
 print(type(c))

⇒結果
  (5+0j)
 
このように、jはcomplex型です。

■引数
?引数 とすると、任意の数の引数をセットできる。

https://note.nkmk.me/python-args-kwargs-usage/

■対話環境
python_history に履歴が入っている。

■日付関数 datetime
 import datetime
 print(datetime.date.today())
 print(datetime.datetime.today())
 ⇒
 2019-01-01
 2019-01-01 02:54:52.192751

H18春FE午前
問12 空の状態のキューとスタックの二つのデータ構造がある。次の手続を順に実行した場合,変数xに代入されるデータはどれか。ここで,
データyをスタックに挿入することをpush(y),
スタックからデータを取り出すことをpop(),
データyをキューに挿入することをenq(y),
キューからデータを取り出すことをdeq() ,
とそれぞれ表す。

push(a)
push(b)
enq(pop())
enq(c)
push(d)
push(deq())
x←pop()

ア a  イ b  ウ c  エ d
正解は、イのbです。

実行結果を先に書きます。実際のプログラムは後半に記載します。
c:\pg>stack.exe
初期状態
スタックの状態:
キューの状態:

push(a) データ a をスタック(の最後)に挿入
スタックの状態:[a]
キューの状態:

push(b) データ b をスタック(の最後)に挿入
スタックの状態:[a][b]
キューの状態:

enq(pop()) スタック(の最後)からデータを取り出して、それをキュー(の最後)に挿

スタックの状態:[a]
キューの状態:[b]

enq(c) データ c をキュー(の最後)に挿入
スタックの状態:[a]
キューの状態:[b][c]

push(d) データ d をスタック(の最後)に挿入
スタックの状態:[a][d]
キューの状態:[b][c]

push(deq()) キュー(の先頭)からデータを取り出して、スタック(の最後)に挿入
スタックの状態:[a][d][b]
キューの状態:[c]

x = pop() スタック(の最後)からデータを取り出したデータを x とする
x の値: b
スタックの状態:[a][d]
キューの状態:[c]
続きを読む

OSのコマンドを実行するプログラム。以下では、system関数を使って、pwdとdirを実行させています。
Linuxで動作させています。

https://www.ipa.go.jp/security/awareness/vendor/programmingv1/b06_04_main.html を参照

■プログラム pg.c
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char * argv[])
{
 system(pwd;dir);
}
※argc = argument count (コマンドラインからの引数の数)。argv = argument vector 

コンパイル
#gcc -o pg pg.c
 ※pg.exeとしても結果は同じで、exeファイルが作成される。

■実行および実行結果
#./pg.exe
/home   ←pwdの実行結果
pg.c pg.exe  ←dirの実行結果

Windowsの場合は” ”で囲いましょう
#include <stdio.h>
#include <stdlib.h>

int main()
{
 system("dir");
}

Windows環境にて、IPアドレスを入力してもらい、そのIPアドレスpingを打つプログラム
#include <stdio.h>
#include <stdlib.h>
int main(){
 char sbuff[512];
 char command[1024];
 printf("アドレスを入力してください");
 gets(sbuff);
 // コマンドを合成する
 sprintf(command,"ping %s",sbuff);
 // コマンドを実行する
 system(command);
 return 0;
}

■Kali linux ダウンロード
https://www.kali.org/downloads/

■VMへインストール
・VM workstation plyaerをダウンロード
・あとでOSをインストールする
インストールする際、Linuxでバージョンは「Debian」系である。version は不明
・HD 30G、メモリ1Gで設定
・VMwareツールをインストール
★CTL+ALTで仮想と実環境の切り替え
デフォルトのパスワードはtoor

■起動後
イメージを更新するには
apt-get update
apt-get dist-upgrade

3項演算子とは、以下のように書くことで、スッキリとしたプログラムになります。

条件式 ? 式1 : 式2

条件式の結果がYesならが式1を返し、Noなら式2を返します。

たとえば、以下です。これは、aの方が大きければa、bの方が大きければbになります。
a >= b ? a : b

では、以下のプログラムを書いてみましょう。
---------------------プログラム2---------------------------
aとbの大きい数字を表示するプログラムを作りましょう
----------------------------------------------------------------
➀aとbを入力させます。
②aとbで、大きな値を出力します。
応用情報技術者試験を勉強する成子 

書いてみましたが、自信はありません。




#include<stdio.h>
int main(){
 int a;
 int b;
 printf("aを入力してください:");
 scanf("%d",&a);
 printf("bを入力してください:");
 scanf("%d",&b);
 a >= b ? a:b;
}
さて、結果はどうでしょうか。
c:\work>gcc -o pg3 pg3.c

c:\work>pg3.exe
aを入力してください:5
bを入力してください:4

c:\work>
結果が表示されません。結果を表示するようになっていなからです。以下のようにしましょう。また、intでaとbをまとめています。 int main(int a,int b){ としてもいいです。
#include<stdio.h>
int main(){
 int a,b;
 printf("aを入力してください:");
 scanf("%d",&a);
 printf("bを入力してください:");
 scanf("%d",&b);
 a >= b ? printf("%d\n",a):printf("%d\n",b);
}
今度はうまくいきました。
c:\work>pg3.exe
aを入力してください:5
bを入力してください:4
5

または、関数に引き渡すことも可能です。書いてみませんか?
顔カット3 

書きました。動きましたよ。
main関数からHikakuというaとbを比較する関数を呼びます。
結果をresultに入れて、それを表示します。
#include<stdio.h>
int Hikaku(int a,int b){
 return (a>=b)? a:b;
}
 
int main(int a,int b){
 printf("aを入力してください:");
 scanf("%d",&a);
 printf("bを入力してください:");
 scanf("%d",&b);
 int result;
 result=Hikaku(a,b);
 printf("%d\n",result);
}
ただ、Hikaku関数のa,bとmain関数のa,bは別物です。その関数の中でのみ変数が有効だからです。
よって、分かりやすいように、違う文字にした方がいいでしょう。
少し整形をした完成版がこちら。
#include<stdio.h>
int Hikaku(int x,int y){
 return (x>=y)? x:y;
}
 
int main(){
 int a=0;
 int b=0;
 int result;
 printf("aを入力してください:");
 scanf("%d",&a);
 printf("bを入力してください:");
 scanf("%d",&b);
 result=Hikaku(a,b);
 printf("大きい数字は%d\n",result);
}

以下のように、実行するプログラムに引数をつけて渡す場合があります。
# program.exe 123

ping 10.1.1.1なども、pingコマンドに10.1.1.1を引数としてつけますね。
このとき、int main(int argc,const char *argv)を使います。 →int main(int argc, char *argv[]){ がいいかも 
では、以下のプログラム(arg.c)をコンパイルして実行しましょう。
#include <stdio.h>
int main(int argc, char *argv[]){
 int i;
 for(i=0;i<argc;i++){
  printf("argv[%d]=%s\n",i,argv[i]);
 }
 return 0;
}
※argc = argument count (コマンドラインからの引数の数)。argv = argument vector 
実行結果は、以下のようになります。

c:\pg>arg.exe I am a boy.
argv[0]=arg.exe
argv[1]=I
argv[2]=am
argv[3]=a
argv[4]=boy.

■書き方の基本
IPAの資料に例があります。
https://www.ipa.go.jp/files/000024729.pdf

<html>
<head〉
//文字化けしたのでmetaの記述は省略
<title>サンプルページ</title>
</head>
<body>
 <p id="p1">このページはサンプルです。</p>
<script type="text/javascript">
  setTimeout(function(){
  var p1_textnode = document.getElementById('p1').firstChild;
  p1_textnode.data = 'このページはサンプルでした。';
  },5000 );
</script>
</body>
</html>

JavaScriptですが、昔と違って今は<body>の下の方に書きます。上記でも</body>の直前に書いています。
サンプルを例に解説
・<script>~</script>で囲う
・末尾は;をつける
その他
・//はコメント

■その他補足
?変数の定義
var a = 1

②関数の定義
function()

③getElementById
上記のIPAの資料において以下の部分
document.getElementById('p1')
このドキュメントのid=p1のデータを取得する

■JavaScriptとHTML
JavaScriptですが、いろいろなことができることは間違いありません。ただ、実際に使うのはWEB(HTML)での操作が多いので、そのあたりの基本的なところをメモ

1.まずは書いてみよう
(1)HTMLのページにJavaScriptで文字を書く。タグも書ける

<html>
<head>
<title>JavaScriptサンプル</title>
</head>
<body>
<script>
document.write("JavaScriptでHTMLの本文を書く。<br>もちろん、タグも使えます");
</script>
<br>通常のHTMLの記述はこれ
</body>
</html>

(2)ポップアップ表示
<html>
<head>
<title>JavaScriptサンプル</title>
</head>
<body>
OKを押すと、この文字が表示されるはずです。
<script>
alert("Hello");
</script>
</body>
</html>

(3)DOMの理解があったうえで、ページに表示
DOM(Document Object Model)についての理解があった方がいいだろう。階層構造を持つことがポイントの1つである。
https://eng-entrance.com/what-is-dom

①Bodyを書き換え
document.bodyに対してプロパティがinnerTextで文字を指定します。すると、bodyそのものが書き換えられるので、それ以外の文字も上書きされます。
<html>
<head>
<title>JavaScriptサンプル</title>
</head>
<body>
この文字も以下のScriptで書き換えられます。
<script>document.body.innerText = "Hello"; </script>
</body>
</html>

②DOMにおいて、bodyの配下にあるdivやpタグなどを指定して書きかえ
<div id="abc">ここに文字があります</div>
ここは書き換わりません。
<script>
document.getElementById("abc").innerHTML = "書き換えます";
</script>

②-2 瞬間的に書き換わるので、setTimeout関数を使って、3秒(3000ミリ秒)後に書き換えます。
<div id="abc">ここに文字があります</div>
ここは書き換わりません。
<script>
function kakikae(){
document.getElementById("abc").innerHTML = "書き換えます";
}
setTimeout("kakikae()", 3000);
</script>

(7)いろいろな情報を取得してをAlertで表示
①Cookieの取得
<script>alert(document.cookie)</script>
※まず、Cookieを付与されていることが前提
②URL
alert(window.location.href);
③URLのハッシュ文字(#)以降の文字を取得する
alert(window.location.hash);
→URLの後ろに、#と文字を付けてみよう。たとえば、http://sc.seeeko.com#123456

#に関して補足します。まず、URLに記載されるハッシュ文字(#)は、フラグメント識別子と言われます。以下、私のサイトのSSLのページを見て下さい。
http://sc.seeeko.com/archives/3824933.html#3
URLのうしろに#3とあります。このページには以下のように目次の設定が埋め込んで、#を変えると、その部分に飛ぶようになっています。存在しない値をいれると、先頭が表示されます。
<h2 id="1">
<h2 id="2">
<h2 id="3">
 #以降はWebサーバには送られず、この仕組みを利用したDOMベースのXSSがあります。

(5)違うページへ遷移
以下のいずれかの方法で遷移
<script>window.location='http://nw.seeeko.com';</script>
<script>window.location.href='http://nw.seeeko.com';</script>

2.変数を使ってみよう
変数の宣言はvar
(1)単純な変数の足し算
<html>
<head>
<title>JavaScriptサンプル</title>
</head>
<body>
<script>
var x = 1;
var y = 2;
sum=x+y;
document.write("x+yの合計は" + sum);
</script>
</body>
</html>

(2)ボタンを作って、押したら表示する
以下で動くが、<script>がないので、JavaScriptっぽくない。
<html>
<head>
<title>JavaScriptサンプル</title>
</head>
<body>
ボタンをクリック<br>
<input type="button" value="click" onclick='alert("Hello")'>
</body>
</html>

変数の有効範囲について、実際にプログラムを実行しながら確認しましょう。
変数iを以下のようにfuncという関数とmainという2つの関数で定義しています。
どちらは互いに独立しています。

#include <stdio.h>
void func(int i){
 printf("funcでのi=%d\n",i);
}
int main(){
 int i=0;
 func(5);
 printf("mainでのi=%d\n",i);
 return 0;
}

func関数では、main関数の引数5を受け取っています。
main関数では、定義した int i=0が有効です。
なので、同じiでも、全く別物となります。実行結果は以下です。

c:\pg>pg
funcでのi=5
mainでのi=0

このように{}内で宣言した変数はローカル変数です。
一方、外に出すと、このプログラムで利用できるグローバルになります。

応用情報技術者試験を勉強する成子

どっちがお勧めですか?
ローカル変数です。
関数の先頭または、その変数を使用する直前が分かりやすくていいと思います。

↑このページのトップヘ