アキヒロの日誌

新社会人一年目の記録

c言語学習2019/1/4

 
苦しんで覚えるc言語から一部引用しています。
 

 

苦しんで覚えるC言語

苦しんで覚えるC言語

 

 

気づきやメモ
 
15章
改めて学んだこと
  • メモリ上の番号を表示する方法
  • ポインタという単語
  • ポインタの役割
  • 他言語のポインタ
 
 
 
 
 
  • メモリ上の番号を表示する方法
 
実は、変数につけられた番号は、プログラムで調べることが出来るのです。
 
番号を調べるのは意外に簡単で、printf関数で%p指定子を使うだけです。
ただし、変数名の前には、&をつける必要があります
次のプログラムは、int型変数iの番号を表示する例です。

#include
 
int main(void){
int i;
printf("%p\n",&i);
return 0;
}
このプログラムの実行結果は、次のようになるかもしれません。

0012FF80
これは筆者の環境で実行した結果ですが、結果の数字は、
パソコンや使用するコンパイラによって異なります。
指定された変数をどの番号のメモリに割り当てるのかは、
コンパイラ(正確にはリンカ)が自動的に決めてしまい、
更にその値もOSの仮想メモリ機能によって変化するからです。
 
 
  • ポインタという単語
1つ目は、ポインタ型です。
今まで出てきたint型やdouble型と同じような型です。
ただし、ポインタ型の場合、それらとは少し異なる特徴があります。
 
2つ目は、ポインタ値です。
これは、ポインタ型で扱える数値、要するにアドレスのことです。
整数や実数といった数値の区別と同様に、ポインタ値という区別があるのです。
 
3つ目は、ポインタ変数です。
これは、ポインタ型で宣言された、ポインタ値を記憶出来る変数のことです。
int型の変数やdouble型の変数と基本的には同じことです。
 
 
①ポインタ型
ポインタ型は、要するにアドレスを記憶する変数の型
他の型とポインタ型を合体させて作ります。
例: int型とポインタ型を合体させると、intへのポインタ型という型が出来ます。
double型の場合なら、doubleへのポインタ型が作り出されます。
また、intへのポインタ型に更にポインタ型を合体させて、
intへのポインタのポインタ型という、多重のポインタ型を作ることすら出来ます。
合体させる理由:
指定アドレスに記憶された数値を取り出すため
ポインタ型は、どんな型の変数のアドレスだったかわかる必要があります。
そこで、あらかじめ他の変数と合体した形でポインタ型として作っておけば、
そのポインタ型の変数に記憶された数値は、合体されている型であるとすぐわかります。
 
②ポインタ値
変数のアドレスの値
 
疑問: アドレスが単なる整数値であるなら、int型に記憶すれば事足りるはずなのに、何故、わざわざポインタ値などという新しい数値として扱う必要があるのでしょうか?
解答:ポインタ地と整数値ではその意味が違い、目的が全く別である。
通常の整数値は、プログラムの中で計算などを行うための数値ですが、
ポインタ値は、計算に使われる数値ではない。
結論:int型の変数で両方を扱っても、何のメリットもありません。むしろ、変数に記憶される数値が整数値なのかポインタ値なのかわかりにくくなります。であれば、いっそのこと、2つを別々の数値とした方がよほど便利になります。
 
 
③ポインタ変数
ポインタ型で宣言された実際の変数のこと。 この変数には、その元となった型の変数のアドレスを自由に代入できます。更に、記憶しているアドレスのメモリを読んだり書き換えたりすることが出来ます。
ポインタ変数の役目:
それが指し示しているアドレス番号のメモリの値を計算することです。
ポインタ変数そのものを計算に使うのではなく、それが指し示している変数を計算するのが、ポインタ変数の目的です。言い換えると、普段はポインタ変数として振る舞っているのですが、
指し示している変数の計算が必要な時には、普通の変数に変身する必要があるのです。
 
2つのモード:
ポインタ変数モードでは、たいした機能は備えていません。
具体的には、アドレスへの代入と足し算引き算だけしかありません。
何故なら、ポインタ変数モードに必要なのはアドレスの記憶だけだからです。
アドレスさえ記憶していれば、後は特に何もする必要がありません。
 
通常変数モードに切り替わった場合、その性質は通常変数と全く同じになります。
おかげで、通常の変数と同様に様々な演算子を使って計算することが出来ます。
当然、その時に使われるメモリは、ポインタ変数モードで記憶したアドレスになります。
 
 
 
 
  • ポインタの役割
疑問点: ポインタとは何の役に立つ機能なのか????
 
解答: ポインタの本当の使い方は、ショートカットとして使用することです。
Windowsのデスクトップに並んでいる、あのショートカットと同じです。
 
ショートカットは、どこか別の場所にあるファイルを指し示すファイルです。
ショートカットを開けば、その指し示しているファイルが開かれます。
にも関わらず、ショートカットは指し示すファイル自体ではないので、
ショートカットはどこにでも自由に作ることが出来ますし、
複数個作ったり削除したりしても、指し示すファイルには何の影響もありません。
 
これこそが、まさにポインタの役割そのものです。
ポインタ変数に、実際に存在する変数のアドレスを記憶しておけば、
そのポインタ変数が使える場所であれば、元の変数が使えない場所(→それぞれどこですか???)であっても、
ポインタ変数を通常変数モードに切り替えれば、元の変数と同じく使うことが出来ます。
まさに、ショートカットのような働きをさせることが出来るわけです。
 
 
 
 
 
  • 他言語のポインタ
他言語のポインタ

一般には、ポインタはC言語C++のみの機能だと言われています。 確かに、指定したメモリのアドレスを操作するという意味ではその通りです。 しかし、ポインタの本当の使い方はショートカットとして使うことであり、 その観点ならば、実用的なほとんどの言語にポインタがありますJavaの参照はまさしくそんな機能で、しかも頻繁に使われますし、 VisualBasicのSETステートメントなども同様と言って良いでしょう。 そもそも、ポインタがないのでは、連結リストや木構造などの、 複雑なデータ構造を実現出来ませんし、オブジェクト指向も困難です。 その意味では、仕組みが不明なJavaVisualBasicのポインタより、 仕組みがはっきりしているC言語のポインタの方が理解しやすいです。 他の言語の参照と、C言語のポインタの最大の違いは、自動なのか手動なのか、です。 他の言語の参照は、ほとんど自動でショートカットとして機能するようになっていますが、 C言語のポインタは、完全に手動であり、プログラマーが完全に理解して使わなければなりません。 そのかわり、上級者がC言語のポインタを使いこなすと、ポインタだけで、 ほぼあらゆる制御構造、あらゆるデータ構造、を実現可能な強力すぎる機能となります。 実際、C言語の様々な機能って、ほとんどポインタで成り立ってるといっても過言ではありませんし
 
 
 
 
 
 
 
 
 
 
 
 
 
15章の後半で学んだこと
  • ポインタ型の引数
  • 配列型の引数
①ポインタ型の引数
void func(int *pvalue);
int main(void)
{
int value = 10;
printf("&value=%p\n",&value);
func(&value);
printf("value=%d\n",value);
return 0;
}
void func(int *pvalue)
{
printf("pvalue=%p\n",pvalue);
*pvalue = 100;
return;
}
②配列型の引数
double getaverage(double data[10]);
int main(void)
{
double average,array[10] = { 1,2,3,4,5,6,7,8,9,10 };
average = getaverage(array);
printf("%f\n",average);
return 0;
}
double getaverage(double data[10])
{
int i;
double sum = 0;
for (i = 0; i < 10; i++)
{
sum += data[i];
}
return sum / 10;
}
double getaverage(double data[10]);
int main(void)
{
double average, array[5] = { 1,2,3,4,5 };
average = getaverage(array);
printf("%f\n", average);
return 0;
}
double getaverage(double data[10])
{
int i;
double sum = 0;
for (i = 0; i < 10; i++)
{
sum += data[i];
}
return sum / 10;
}
おかしな結果となった
引数の型は10要素になっているにもかかわらず、5個しか要素のない配列が渡せる。
その結果、関数側では強引に10個の要素を処理してしまい、おかしな結果となっています.
→要素数は無視されたという結果となった
double getaverage(double data[10]);
int main(void)
{
double average, array[10] = { 1,2,3,4,5,6,7,8,9,10 };
average = getaverage(array);
printf("%f\n", average);
printf("%f\n",array[3]);
return 0;
}
double getaverage(double data[10])
{
int i;
double sum = 0;
for (i = 0; i < 10; i++)
{
sum += data[i];
}
data[3] = 12;
return sum / 10;
}
→呼び出された関数の中で引数の値を変更すると、呼び出し元の引数の値を変更できた。
double getaverage(double data);
int main(void)
{
double average, array[10] = { 1,2,3,4,5,6,7,8,9,10 };
average = getaverage(array);
printf("%f\n", average);
printf("%f\n",array[3]);
return 0;
}
double getaverage(double data)
{
int i;
double sum = 0;
for (i = 0; i < 10; i++)
{
sum += data[i];
}
data[3] = 12;
return sum / 10;
}
→配列の宣言時に要素数を書かなくても実行された
→要素数は無視されている
素数を書かない状態でも、呼び出し元の引数(array[3])の値を変更することが出来た
→ポインタ型の引数を使った時と似ているのでは???
少し実験をする↓↓↓
double getaverage(double *data);
int main(void)
{
double average, array[10] = { 1,2,3,4,5,6,7,8,9,10 };
average = getaverage(array);
printf("%f\n", average);
printf("%f\n", array[3]);
return 0;
}
double getaverage(double *data)
{
int i;
double sum = 0;
for (i = 0; i < 10; i++)
{
sum += data[i];
}
data[3] = 12;
return sum / 10;
}
問題なく実行され1つ上のプログラムと同じ結果を得た
→配列要素をコピーして関数に渡していたのではない
→→配列の先頭のアドレスを渡していたことになる
つまり配列の先頭アドレスを渡すだけなら、要素数は関係ないので、上記のように関数宣言時に要素数が無視されることになる。
まとめると、下の①②③は同じ意味の仮引数宣言になる。
①int getaverage(int data[10]);
②int getaverage(int data)
③int getaverage(int *data);
ただし、この3つが同じ意味になるのは関数の仮引数宣言の場合のみ。
おかしなところはないだろうか??上記のプログラムをもう一度見てみる。
double getaverage(double *data);
int main(void)
{
double average, array[10] = { 1,2,3,4,5,6,7,8,9,10 };
average = getaverage(array);
printf("%f\n", average);
printf("%f\n", array[3]);
return 0;
}
double getaverage(double *data)
{
int i;
double sum = 0;
for (i = 0; i < 10; i++)
{
sum += data[i];//dataはポインタ変数なのに配列として要素を指定して計算している
}
data[3] = 12;
return sum / 10;
}
苦Cより説明すると↓↓
「数式の中に配列名を記述した場合、の記号の有無にかかわらず、
配列名は、配列の先頭要素へのアドレス(ポインタ値)として扱われます。
そして、その配列名にをつけた場合、そのアドレスに番号の値だけ足し算を行い、
その結果として、足し算された分の番号の要素として扱われているのです。」ということ。
→「ポインタ変数」を「配列」のように使うことが出来る
ポインタ変数を配列のように使用するプログラムを作ってみる
int main(void)
{
int *data;
int i, average = 0, array[10] = { 1,2,3,4,5,6,7,8,9,10 };
data = array;//ポインタ変数に配列を代入する
for (i = 0; i < 10; i++)
{
average += data[i];//ポインタ変数を配列のように使っている
}
printf("%d\n",average/10);
return 0;
}
→ポインタ変数に配列を代入すると、ポインタ変数を配列のように使うことが出来る=演算子で要素番号の指定が出来るという意味
→動的メモリ確保をする時に必要になるプログラム
普段は使わない
[]演算子で要素番号の指定する以外にも他の方法がある
実はポインタ変数用の書き方がある
int main(void)
{
int *data;
int i, average = 0, array[10] = { 1,2,3,4,5,6,7,8,9,10 };
data = array;//ポインタ変数に配列を代入する
for (i = 0; i < 10; i++)
{
average += *(data+i);//ポインタ演算!!(他の方法)
}
printf("%d\n", average / 10);
return 0;
}
こんな書き方もある
int main(void)
{
int *data;
int average = 0, array[10] = { 1,2,3,4,5,6,7,8,9,10 };
for (data = array; data!= &array[10]; data++/*++ポインタ演算は高速な処理が出来る*/)
{
average += *data;
}
printf("%d\n", average / 10);
return 0;
}
組み込み系の話
ほとんどのパソコン向けのコンパイラは適切な最適化を行ってくれます。
さらに、パソコン用のCPUは内部のキャッシュの仕組みが複雑かつ高性能であり、
繰り返し処理をCPUが独自に最適化して、速度を向上するような仕組みがあります。
そのため、現代的なパソコンでは、どちらの書き方でも、結局同じ速度になります。
しかし、組み込み(家電などに内蔵される低性能なコンピュータ)ではそうとは限りません。
コンパイラによる最適化は十分には機能しないことも多いですし、
CPUの仕組みが単純なので、プログラムの書き方が、速度にそのまま反映されやすくなっています。
そういった場合には、ポインタ演算は現代でも有用です。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

c言語学習10日目

今日も進捗を書いていきます。

 

今日は「苦しんで覚えるc言語」の練習問題16を解きました。

その中で書き取り問題を記事にします。

 

苦しんで覚えるC言語

苦しんで覚えるC言語

 

 

 

 

問題: 3人分の、名前、年齢、性別、を入力して表示するプログラムを作りなさい。 ただし、データは構造体で記憶することとし、 また、データの入力と表示はそれぞれ専用の関数を作って行うこととする。
 
自分のプログラム(解答を少し見て修正した)と解答をアップします。
 
自分のプログラム
↓↓↓
typedef struct
{
       char name[256];
       int age;
       int sex;//man:0 or woman:1
}info;
info data[3];//「data」という変数名のinfo型構造体配列(3要素)の宣言
void input(info inputdata);
void output(info outputdata);
int main(void)
{
       input(data);
       output(data);
       return 0;
}
void input(info inputdata)//関数の引数としてinfo型の配列引数を宣言
{
       int i;
       printf("名前と年齢と性別を入力してください\n");
       for (i = 0; i < 3; i++)
       {
              printf("名前:");
              scanf_s("%s", &inputdata[i].name, 256);
              printf("年齢:");
              scanf_s("%d", &inputdata[i].age);
              printf("性別(1-男性、2-女性):");
              scanf_s("%d", &inputdata[i].sex);
       }
       return;
}
void output(info outputdata)
{
       int i;
       for (i = 0; i < 3; i++)
       {
              printf("名前:%s\n", outputdata[i].name);
              printf("年齢:%d\n", outputdata[i].age);
       }
       char sex[16];
       if (data->sex == 1)
       {
              strcpy_s(sex, 16, "男性");
       }
       else
       {
              strcpy_s(sex, 16, "女性");
       }
       printf("性別:%s\n", sex);
       
       return;
}
 
 
 
著者の解答
↓↓↓
typedef struct {
       char name[256];
       int age;
       int sex;
} People;
void InputPeople(People *data);
void ShowPeople(People data);
int main(void)
{
       People data[3];
       int i;
       for (i = 0; i < 3; i++) {
              InputPeople(&data[i]);
       }
       for (i = 0; i < 3; i++) {
              ShowPeople(data[i]);
       }
       return 0;
}
void InputPeople(People *data)
{
       printf("名前:");
       scanf("%s", data->name);
       printf("年齢:");
       scanf("%d", &data->age);
       printf("性別(1-男性、2-女性):");
       scanf("%d", &data->sex);
       printf("\n");
}
void ShowPeople(People data)
{
       char sex[16];
       printf("名前:%s\n", data.name);
       printf("年齢:%d\n", data.age);
       if (data.sex == 1) {
              strcpy(sex, "男性");
       }
       else {
              strcpy(sex, "女性");
       }
       printf("性別:%s\n", sex);
       printf("\n");
}
 

c言語学習9日目

学習メモを書いていきます。
記事内のプログラムは苦しんで覚えるc言語から引用しています。
苦しんで覚えるC言語

苦しんで覚えるC言語

 

 

 
 
 
構造体
・構造体型の宣言の仕方の復習→typedef
・構造体の引数 
 ・構造体で情報を渡す
  構造体変数は、それ自体が1つの変数として扱われる。したがって「構造体型の引数」を使うことが出来る。
  →メリット:一度に複数の情報を渡すことが出来る
 
生徒の身体測定
プログラム①
typedef struct//構造体タグを省略している
{
       int year;
       int group;
       int number;
       char name[64];
       double stature;
       double weight;
}student;//「student型」という名の「構造体型」を宣言した
              
              
//プロトタイプ宣言
void student_print(student data);
//main関数で構造体要素を決めている→関数の呼び出し
int main(void)
{
       student data;//「student型」を使用するための構造体変数dataを宣言
       data.year = 3;
       data.group = 4;
       data.number = 18;
       strcpy_s(data.name, 64, "MARIO");
       data.stature = 178.0;
       data.weight = 81.0;
       student_print(data);//関数の定義でstudent型(構造体型)の構造体変数dataを引数として定義したので、引数として通常の関数と同様にdataを使用している。
       return 0;
}
//構造体型の変数(構造体変数)を引数とした関数を定義
void student_print(student data)
{
       printf("[学年]:%d\n", data.year);
       printf("[クラス]:%d\n", data.group);
       printf("[出席番号]:%d\n", data.number);
       printf("[名前]:%s\n", data.name);
       printf("[身長]:%f\n", data.stature);
       printf("[体重]:%f\n", data.weight);
       return;
}
 
 
 ・構造体型のポインタ変数
  整数型のポインタ変数同様、構造体型のポインタ変数も作ることが出来る。
  書式としては二通りある
  →(*構造体ポインタ変数名).要素名
  →構造体ポインタ変数名->要素名
プログラム②
typedef struct//構造体タグを省略している
{
       int year;
       int group;
       int number;
       char name[64];
       double stature;
       double weight;
}student;//student型を宣言
int main(void)
{
       student *pdata,data;
       pdata = &data;
       (*pdata).year = 10;
       strcpy_s((*pdata).name, 64, "MARIO");
       printf("(*pdata).year:%d\n", (*pdata).year);
       printf("data.year:%d\n", data.year);
       printf("(*pdata).name:%s\n", (*pdata).name);
       printf("data.name:%s\n", data.name);
       return 0;
}
 
 ・構造体型のポインタ変数を引数に持つ関数の作成
 
生徒の身体測定
プログラム③
typedef struct//構造体タグを省略している
{
       int year;
       int group;
       int number;
       char name[64];
       double stature;
       double weight;
}student;
void student_print(student *pdata);//プロトタイプ宣言
int main(void)
{
       student data;//「student型」を使用するための構造体変数dataを宣言
       data.year = 3;
       data.group = 4;
       data.number = 18;
       strcpy_s(data.name, 64, "MARIO");
       data.stature = 178.0;
       data.weight = 81.0;
       student_print(&data);//構造体変数dataのアドレスを関数のポインタ変数に渡している
       return 0;
}
void student_print(student *pdata)
{
              printf("[学年]:%d\n", (*pdata).year);
              printf("[クラス]:%d\n", (*pdata).group);
              printf("[出席番号]:%d\n", (*pdata).number);
              printf("[名前]:%s\n", (*pdata).name);
              printf("[身長]:%f\n", (*pdata).stature);
              printf("[体重]:%f\n", (*pdata).weight);
              return;
}
 
 
プログラム①と③を比較してみる
①は関数に直接、構造体情報のコピーを渡している。
③は構造体型のポインタ変数を使用して、関数に構造体情報を渡している。
「苦しんで覚えるc言語」では③のように書くメリットは、
(1)関数内で値を変更ずることが出来る
(2)関数の呼び出しの高速化
らしいが、(1)の場面がまだ思い浮かばない
 
・構造体の配列
 プログラム例:
 student data[10];
   data[1].year=3;
   strcpy_s(data[1].name,64,"MARIO");
複数の生徒の身体測定の情報を記録しておくことは可能かと

「直感力を高める数学脳のつくりかた」を読み始めました!

「直感力を高める数学脳のつくりかた」を読み始めました!

直感力を高める 数学脳のつくりかた

直感力を高める 数学脳のつくりかた

 

 

今回も読書の仮設作りをしていきたいと思います。

 

目標:

1,数学力(数学脳)について知り手に入れたい

2,数学、科学の学習のコツが知りたい

3,その他の学習の頭の使い方が知りたい

 

 

目標達成までの道筋:

1,ゆっくりやること

2,うたた寝から学ぶこと

3,チャンクを増やし直感力を高める

4,自分の習慣の役立たせ方

5,勉強に取り掛かるためには

6,専門知識を増やし不安を和らげる

7,記憶力の高め方

8,自分の能力の正しい判断の仕方

9,脳の作り直し方

10,想像力を磨く

11,独習について

12,自信過剰にならないことについて

13,試験の効用

14,潜在能力の解き放ち方

1-14を学べば目標達成‼️

 

スタート地点:

1,理系学生だが、少し数学や科学に苦手意識があり、不安な気持ちがある。

2,理系科目の自分なりの効率的な学習法

(1)大枠を捉える

(2)式や公式のイメージ化

(3)反復練習

(4)自分の言葉で要約

が思いつく。

 

 

読み終わりましたら、気づきや感想をまとめていこうと思います‼️

「ムダにならない勉強法」を読み始めました!

今日から樺沢紫苑氏の「ムダにならない勉強法」を読み始めました!

 

ムダにならない勉強法

ムダにならない勉強法

 

 

今回も、「東大読書(東洋経済新報社)」で学んだ、読解力を養うための仮説作りをしておきたいと思います。

「読む力」と「地頭力」がいっきに身につく 東大読書

「読む力」と「地頭力」がいっきに身につく 東大読書

 

 

仮説作り:

①目標

  • 科学的に裏付けがある、自分が知らない勉強法を知って実践したい。
  • 自分が今までやってきた勉強法が科学的にどれだけ正しいのか知りたい。
  • 今よりも無駄にならない勉強時間を過ごしたい

②目標達成までの道筋

  1. 勉強によって得られること、勉強がうまくいかない理由
  2. 脳楽勉強法
  3. 大人の勉強法
  4. 真似ぶ勉強法
  5. 入出力勉強法
  6. スーパーアウトプット勉強法
  7. 10年連続勉強法
  8. 1~7を学べば目標達成

 

③現状

  • 新しいことを学ぶ時に成長が遅いと感じる
  • 自分の中で積み上げてきた勉強法はある
  • 中々結果が出ないときや空回りしてしまう事がある

 

 

今後、「自分なりの気付き」、「これはためになったなという内容」、「これだけは覚えておきたいという内容」、「全体の感想」をまとめる予定です。

読書をする際にメモを「ノート」にするか「ブログ」にするか??

皆さんは読書をする時にどこにメモを取っていますか?
ノートですか?
それともブログなどに書いて情報発信をしていますか?
 
今回、ノートとブログの両方をなんとなくで使い分けていたので、「読書をする際にメモを「ノート」にするか「ブログ」にするか??」という名前のもと、ノートとブログの利点・欠点などをまとめ、読書して得た知識をどう自分のモノにしていくかを考えてみました。
 
 

ノートとブログの利点と欠点

ノート
~利点~
  • 「書く」ことで長期的な記憶に繋がる(気がする)
  • 楽に見返すことが出来る
  • 自分が後から見て分かりやすいようにまとめることが出来る
~欠点~
  • 時間がかかる
  • 情報発信が出来ない
  • 人に見られることがないため上手な文章(深い理解が求められる)が書けない
  • 持ち運びに不便
ブログ
~利点~
  • 短時間で書ける
  • 情報発信が出来る
  • 人に見られるため上手な文章(深い理解が求められる)を書こうとする
  • クラウド上に文章が残るため外出時でも、スマホさえあれば本の情報を持ち運べる
~欠点~
  • 文章の内容によっては時間がかかる
  • ネット環境を必要とする

 

 

読書の目的と道筋

自分なりの目標を書いてみます。

読書の目的:
長期的に記憶し自分の人生に役立てたい
道筋:
2週間に3回以上のインプットとアウトプットをする(樺沢紫苑氏が言っていた)
  • 書く→脳が重要なものだと判断し長期記憶にインプットされる
  • 文章をまとめて情報発信してみる→深い理解に繋がる
  • 実践する
道筋の詳細
目標達成までの流れを書いてみました。
(読書想定期間:1週間~2週間)
  1. 読書開始 インプット1回目
  2. ノートに要約・気づき・覚えておきたい言葉・感想などを「書く」 アウトプット1回目
  3. 書いたことを実践(→人に話したり、実生活で活用してみる)しながら読書をする アウトプット2回目
  4. 読書終了
  5. ノートを見直しその時点で自分がより記憶に留めておきたい文章を選ぶ
  6. その箇所をもう一回読み直す インプット2回目
  7. ブログに感想や要約を書く(→文章力が鍛えられる、内容が整理される) アウトプット3回目
 
 

まとめ

  • ノートに「書く」という記憶に起因する動作を取りいれる。
  • 再度情報を整理して、ブログで情報発信をしてみる。
  • その整理された情報を行動に移す。

書評:「シンプルな勉強法」

 

以前にこのブログ記事を書きました。

programerchance.hatenablog.jp

 

今回は「シンプルな勉強法」の感想を書いていきたいと思います。

 

目次

 

本の構成

この本は、四部構成になっております。

第ゼロ章:「勉強の意義」から始まり、第一章:「勉強効率を極大化するモチベーション講義」で勉強のメリット・やりがい・楽しさなどの観点からモチベーションの上げ方について多角的に述べています。それから第二章:「逆算勉強法のススメ」では、受験や資格の勉強などを、限られた期間の中でいかに効率的に勉強するかが著者の経験談を元に書かれています。第三章:「点数を底上げするための技を身につけよう」では、第二章の逆算勉強法の効率の上げ方や時間の使い方などが書かれています。最後第四章:「高校・大学受験を完全攻略する」では字のごとく、高校・大学受験で必要な五科目の勉強法や楽しさが書かれています。

 

個人的には、第一章と第三章が役に立ったかなと思います。

 

 

 

 

本の感想

それでは感想を箇条書きにして書いていきます。

・この著者は特に変わった勉強法は実践していないことが分かった。
 東大生で医学生でありながら司法試験合格者ということで、何か特別な勉強法を実践しているのではないかと勝手に思っていたが、特に奇抜で斬新な勉強法をしているわけではなく、本の題名の如く非常にシンプルに勉強している点が最も意外でした。シンプルですがそれを突き詰めており、奥深さと説得力を感じました。
・モチベーションの上げ方は参考になる箇所が幾つかあった。
どの世代、どんな勉強にも全てに通ずるようなモチベーションの上げ方が書かれており、非常に参考になりました。
・勉強法を実践していてこれをしっかりと文章化(可視化)出来ている事が凄いと思った。
・著者が医学生だけに科学的根拠のある効率的な勉強法が書かれているともっと良かった気がする。
科学的根拠に基づいた勉強法など知ることができればなお良かった気がする。
・基本的に全体を通して賛成できた。特に反論する部分はなかった。
 
 
 
 
 

 印象的だった言葉

次に自分がこれは覚えておきたいなという文章3つを書いていきます。
(文章は「シンプルな勉強法」より引用させていただきました。)
 
「覚えておきたい言葉」
詳しい説明
自分の考え方の変化
 
1つ目
chapter0 ~勉強の意義~
「勉強を通して自分の快・不快、得意・不得意を知ることが出来る」
「将来したいこと」に向けて勉強するだけでなく、勉強をすることで将来したいことを決めていくのも、1つの手だと考えられます。本当に楽しいと思うことを仕事にするためにも、どんどん勉強してみてください。
ということです。
自分は目標を決めてからじゃないと中々動けなかったのですが、この言葉で走りながら目標を定めていくのも1つの手であることを知りました。目標先行型だった思考に行動先行型の考え方を補填することが出来て良かったです。
 
2つ目
chapter1 ~勉強効率を極大化するモチベーション講義~
「勉強の目標は何でもいい」
勉強の動機は決して世間の大多数に称賛されそうなキラキラしたものである必要は無い。自分の欲望に忠実で良い。どんな動機でも結果として自分にプラスに作用するのであれば、何も悪いことはない。
ということです。
自分は今まで大きな目標を立てる事が偉いと思っていました。その方が色んな人から称賛される気がしたからです。しかし、それが逆にプレッシャーなっていることも薄々感じていました。小さいことでもいいから自分が本当にやりたいことを意識して今後は目標立てをしていきたいと思いました。
 
3つ目
chapter1 ~勉強効率を極大化するモチベーション講義~
「自分のカッコいいという理想像に近づこう」
「自分はどういう人をカッコいいと思うのか、自分はどうなりたいのか」を抽出して自分の中の理想像を作り上げてみる。「こういう人カッコいい」と思うことがある。この感情は意外と崇高でサラッと受け流すべきではない。このカッコいいという感覚は「自分もそうなれるならなりたい!」という願望を反映していることがある。
ということです。
自分は「この人カッコいい」と思ってもどうせ自分なんかなれるわけがないと諦めることがありました。でもこれからはこの感情をもう少し大事にして自分の進む道を決めるヒントにしていこうと意識するようにします。
 
 
 
 
 
 
 
 
 
最後まで読んで頂き有難うございました。
また更新します。