プログラミング学習記録【11日目】
キーボード
PCを何台か所有しているが、特に使うのが自作したデスクトップと、SurfaceProの2台。デスクトップはモニタが2枚つながっているので、作業しながら調べ物もしてアニメも見る、みたいなマルチに使う際に大活躍している。この子は青軸キーボードにトラックボールのマウス、Razer製のマクロキーパットをつなげて遊んでいるので、多少面倒な作業もマクロ化して行うなど、楽しんで作業できる環境のつもりである。
一方Surfaceは、奮発して当時最高スペックにしたおかげで、プログラミングやエクセルなどそこそこハードな作業でも軽々こなしてくれる他、モバイルなのでこたつなどで作業するときや、外に持っていくときもこの子を用いる。純正のキーボードも非常に使いやすく、長時間タイピングしていても疲れにくいし、静音性が高いのに打鍵感が非常に良い。打鍵時に少し撓むのも丁度いいのだ。
ただ、Surfaceについて残念に思っていることもあるにはある。
それは膝の上で使用しにくいことだ。
一般的なノートPCは電車等の移動時に膝上に乗っけても作業が行えるのだが、SurfaceProに関しては構造が特殊で、PCの画面側についているキックスタンドを用いることで自立するため、安定しないところや狭いテーブルなどでは使いにくい。
もともとタブレット+キーボードも使えるWindows、という位置づけなので、そういった場所で作業したいなら別のノートPCを使え、という話なのだが、SurfacePro使いたいやん…
どうにかならないか、カバーなどを探したのだが良さげなものは見つからず、諦めて移動時はおとなしくしとこうか迷っていたところ、素晴らしいキーボード(?)を見つけてしまった。tap strapだ。
指にはめ、指を動かすだけで文字が打ててしまうのだ。
これだよ、僕の探していたのは!と思い早速ポチろうとしたのだが頭悪いほど値段が高い…移動時に使いたいだけで¥21,000は流石に難しい出費だ。
色々見てみたのだが、慣れたとしても普通のキーボードのブラインドタッチを上回ることはないだろうな、くらい。
これがブラインドタッチを上回るほど早く打てて、キーボードの利用から乗り換えられるならもっと迷ったかもしれない…。
2つ同時にも使えるらしく、そのときにキーボード並みか以上の速度でタイピングできるなら再検討…でも¥42,000だもの…かっこいいんだけどね。
2.04.参照
そういうわけで大人しくタイプカバーでタイピングしますとも。
参照を用いると、ある変数に別名をつけることができる。
ある変数への参照を行った際、参照からその変数へアクセスできる。
&変数名 = 参照元変数名
で定義することができる。
参照を用いると、無駄なコピーを減らすことができ、実行速度を早めることができる。複数回呼び出される配列などの値渡しなどは参照を用いると実行時間が短くなる。
どのような状況でこれを使うのか上手くイメージが沸かないので、問題に進んで考えることにする。
EX19.九九の採点
九九の採点をするプログラムを作る。
入力は2次元配列でおこなわれ、誤った値が書き込まれたマスは正しい値に直し、正しい値が書き込まれたマス、誤った値が書き込まれたマスをそれぞれ数えて出力する。参考プログラムは以下。書き換える形での提出。
#include <bits/stdc++.h>
using namespace std;
// 参照渡しを用いて、呼び出し側の変数の値を変更する
void saiten(/* 呼び出し側に対応するように引数を書く */) {
// 呼び出し側のAの各マスを正しい値に修正する
// Aのうち、正しい値の書かれたマスの個数を correct_count に入れる
// Aのうち、誤った値の書かれたマスの個数を wrong_count に入れる
// ここにプログラムを追記
}
// -------------------
// ここから先は変更しない
// -------------------
int main() {
// A君の回答を受け取る
vector<vector<int>> A(9, vector<int>(9));
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
cin >> A.at(i).at(j);
}
}
int correct_count = 0; // ここに正しい値のマスの個数を入れる
int wrong_count = 0; // ここに誤った値のマスの個数を入れる
// A, correct_count, wrong_countを参照渡し
saiten(A, correct_count, wrong_count);
// 正しく修正した表を出力
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
cout << A.at(i).at(j);
if (j < 8) cout << " ";
else cout << endl;
}
}
// 正しいマスの個数を出力
cout << correct_count << endl;
// 誤っているマスの個数を出力
cout << wrong_count << endl;
}
まず参照引き渡しを用いた呼び出しの変数の値の変更で、void saitenの型を指定。九九の表なのでvector<vector>でAを参照して初期値に入れておく。入力のところを見てみると
saiten(A, correct_count, wrong_count);
となっていたので、これらも参照で受け取っておく。
受け取った表を、間違っているところは修正し、正誤それぞれの個数を数えるループを作る。
for (int j = 0; j < 9; j++)
{
if (A.at(i).at(j) != (i + 1) * (j + 1)) //"!="で九九が間違ってる場合をピックアップ
{
A.at(i).at(j) = (i + 1) * (j + 1);
wrong_count++; //間違ってるマスの数 +1
}
else
{
correct_count++; //正解のマス +!
}
}
}
全形はこれ。
#include <bits/stdc++.h>
using namespace std;
// 参照渡しを用いて、呼び出し側の変数の値を変更する
void saiten(vector<vector<int>> &A, int &correct_count, int &wrong_count)
{
// 呼び出し側のAの各マスを正しい値に修正する
// Aのうち、正しい値の書かれたマスの個数を correct_count に入れる
// Aのうち、誤った値の書かれたマスの個数を wrong_count に入れる
// ここにプログラムを追記
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
if (A.at(i).at(j) != (i + 1) * (j + 1)) //"!="で九九が間違ってる場合をピックアップ
{
A.at(i).at(j) = (i + 1) * (j + 1);
wrong_count++; //間違ってるマスの数 +1
}
else
{
correct_count++; //正解のマス +!
}
}
}
}
// -------------------
// ここから先は変更しない
// -------------------
int main()
{
// A君の回答を受け取る
vector<vector<int>> A(9, vector<int>(9));
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
cin >> A.at(i).at(j);
}
}
int correct_count = 0; // ここに正しい値のマスの個数を入れる
int wrong_count = 0; // ここに誤った値のマスの個数を入れる
// A, correct_count, wrong_countを参照渡し
saiten(A, correct_count, wrong_count);
// 正しく修正した表を出力
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
cout << A.at(i).at(j);
if (j < 8)
cout << " ";
else
cout << endl;
}
}
// 正しいマスの個数を出力
cout << correct_count << endl;
// 誤っているマスの個数を出力
cout << wrong_count << endl;
}
この下は変更しないこと、となっているのでこれでコンパイルし提出。
早めに終わらせてAtCoderに参加したい。
ちらっと覗いたときはAはなんとか理解できたけどBは意味わからんかった。過去問で対策とかもしなきゃいけないかも。