投稿

5月, 2021の投稿を表示しています

C/C++言語 char型を用いて演算

C/C++言語でchar型を用いた演算 チップ抵抗を求める際に使える. 例えば E-96系列で66Aは475Ωで, 51Bは3.32kΩ, 45Cは28.7kΩとなる. これを求めるプログラムにおいて, char型による四則演算を利用すれば処理も楽になる. サンプルプログラム1 #include <iostream> //標準入出力関数を使うときに必要なヘッダー #include <cmath> //数学関数を使うときに必要なヘッダー using namespace std; double round(double x, double n); int main(void){ int num; double ans; char cNum[3]; cout > cNum; //例 66A num = ((int)(cNum[0] - '0') * 10 + (int)(cNum[1] - '0')); //数値に変換 cout = 5){ //1の位の余りが5以上の場合 temp = temp + (10 - temp%10); //10から1の位の余りを引いて、値に足す return (double)temp * pow(10.0, -n); //計算結果を返す }else{ //1の位の余りが5未満の場合 temp = temp - temp%10; //1の位の余りを引く return (double)temp * pow(10.0, -n); //計算結果を返す } } char型は1文字分のデータを格納できる. 例えばAは10進数アスキーコードで65. つまり, 変数cNum[2]にAを代入して, 数値として'A'を引く計算を行うと0となる. また, cNum[2]='D'とした場合, cNum[2] - 'A' = 3 となる. 参考 なし ※間違ってたらすみません。 わかった時点で修正します。

C/C++言語 ポインタとは

C/C++言語でポインタを使う サンプルプログラム1 #include <stdio.h> //標準入出力関数を使うときに必要なヘッダー int main(void){ int *p; int n; printf("数値を入力してください。n:"); scanf("%d", &n); p = &n; //ポインタpに変数nのアドレスを代入 printf("&n = %p p = %p\n",&n, p); //ポインタpに代入されたアドレスと、変数bのアドレスを表示 printf("*p = %d\n", *p); //ポインタpに格納されたアドレスから値を取り出して表示 return 0; } サンプルプログラム1ではポインタpに変数nのアドレスを代入している。 このプログラムを実行すると、&nとpのアドレスが一致することがわかる。 つまり、&nでアドレスを取得し、ポインタpに代入されている。 また、*pは値が取り出されており、変数nと同じ値が表示されるはずだ。 ここで、出てきた&と*はポインタ演算子という。 *は値を取り出す。 &はアドレスを取り出す。 ア ス タ リスクで値 ア ン ド でアドレス と覚えるといい。 ポインタはサンプルプログラム2のように使うことができる。 #include <stdio.h> //標準入出力関数を使うときに必要なヘッダー int main(void){ char *p; char n[] = "abcdefghijklmnopqrstuvwxyz"; p = &n; //ポインタpに配列nの先頭のアドレスを代入 printf("p = %c", *p); //ポインタpの値を表示 p++; //1を加算 printf("p++...

c++ 配列を使う

C++で配列を扱う サンプルプログラム1 #include <iostream> using namespace std; int main() { int a[10]; //int型配列を宣言 for(int i= 0; i サンプルプログラム1では10個の配列を宣言し、その中に0から数値を代入していくプログラムである。 宣言の仕方は”データ型 変数名[要素数];”である。 配列の指定は整数で、基本的に負は入らないが負となる例は 「c言語 malloc関数 動的にメモリ確保する」 の投稿後半で触れているため、そこを参照してくれ。 配列カッコ内で整数になればよいので四則演算も可能。 参考 ※間違ってたらすみません。 わかった時点で修正します。

C++ round関数を使わずに小数第n位の四捨五入をする

C++でround関数を使わずに小数第n位の四捨五入を行う サンプルプログラム1 #include <iostream> #include <cmath> using namespace std; double round(double x, double n); //プロトタイプ宣言 int main() { //round(数値, 小数位); cout = 5){ //1の位の余りが5以上の場合 temp = temp + (10 - temp%10); //10から1の位の余りを引いて、値に足す return (double)temp * pow(10.0, -n); //計算結果を返す }else{ //1の位の余りが5未満の場合 temp = temp - temp%10; //1の位の余りを引く return (double)temp * pow(10.0, -n); //計算結果を返す } } サンプルプログラム1では関数を自作して処理を行っている。 そのため、主に解説していくのは下に記述されている自作round関数である。 動作原理は簡単で、四捨五入をしたい桁数を指定したらその分、10 n 倍して、1の位の余りを求める。 その余りが5以上か未満かで判別して、余り分を引くか「10―余り分」を足すかを決めている。 そして、値を逆に10 -n 倍して返している。 ちなみに、10 n 倍している理由は%を使用して余りを求めるためである。 浮動小数点は%を使用して余りを求めることができないからである。 cmathがインクルードされているためfmod関数を使用することができるが、このプログラムを作成した時の気分で使わなかった。 数式は以下に示す。 $temp=x10^{n}$ $temp \mod 10 \geqq 5$ の場合 $ans = temp + \{10 - (temp \mod 10)\}\times10^{-n}$ $temp \mod 10 \lt 5$ の場合 $ans = \{temp - (temp \mod 10)\}\times10^{-n}$ ほかにもっといいアルゴリズム...

C++ cout関数とcin関数を用いた基本的な入出力

C++でコンソール上で入力と出力を行う サンプルプログラム1 #include <iostream> //標準入出力関数を使うときに必要なヘッダー using namespace std; int main(void){ int a; cout > a; //整数をコンソール画面から入力する cout cout関数は文字列などの出力において使われる基本的な関数である。 サンプルプログラム1ではcout関数のダブルクォーテーション内の文字列が出力される。 また、 cout のように左シフト演算子を用いて変数も並べて記述することができる [1] 。 cin関数はコンソール上から数値や文字などを入力する際に使用する。 cin関数を用いて変数に代入する際は、cout関数とは逆に右シフト演算子を用いる [1] 。 複数のデータをスペース区切りで入力したい場合は、次のように記述すると入力することができる。 //入力:15 12 int a, b; cin >> a >> b; cout となるはずである。 シフト演算子の詳細は参考文献[1]を見てほしい。 cout関数とcin関数で使用するシフト演算子の原理は置いておいて、私個人の覚え方は、 「coutに"文字列"を代入して出力したい。」つまり、「cout ← "文字列"」という感覚である。 代入したいデータを矢印でどこに代入するかを指定している感覚である。 cin関数も同様だが複数入力の場合は少しこじつけではある。 入力が"12 15"だとする。 「cin(12) → a, cin(15) → b」これを略して「cin → a →b」 というcin関数から値を取り出す感覚で記述している。 正直、わかりにくい場合は自分の都合のいいように解釈して覚えるのがよいと思う。 参考 [1] 左シフト演算子と右シフト演算子 ( > > および ※間違ってたらすみません。 わかった時点で修正します。

c言語 printf関数とscanf関数で入出力をする

c言語でコンソール上で入力と出力を行う サンプルプログラム1 #include <stdio.h> //標準入出力関数を使うときに必要なヘッダー int main(void){ int a; printf("出力する数値を入力してください。 a ="); //画面に文字を出力する scanf("%d", &a); //整数をコンソール画面から入力する printf("a = %d\n", a); //%dに変数aの内容が代入され出力する printf("ax2 = %d\n", a*2); //aを2倍した値が出力される return 0; } printf関数は文字列や数値を出力することができる。 サンプルプログラム1ではprintf関数のダブルクォーテーション内の文字列が出力される。 また、最後のprintf関数ではダブルクォーテーション内に%dがある。 これは、フォーマット指定子という。 詳細は参考文献[1]を見てほしい。 簡単に言えば入出力時のデータ型を指定している。 サンプルプログラム1のscanf関数でも使用している。 scanf関数で代入したい変数をしているが変数名の前に&が付いている。 これは、ポインタ演算子というものである[2]。 変数名の先頭に&がついていると変数のアドレスを取り出すことになる。 今度、これが*になると値を取り出すことになる。 scanf関数から変数に代入する際は変数のアドレスを使用して行われるからである[3]。 最後にprintf関数内で基本的な計算を記述した。 このように、printf関数内でも基本的な計算を行って出力することができる。 参考 [1] フォーマット指定子一覧 [2] 林晴比古 : “新C++言語入門ビギナー編”, ソフトバンク クリエイティブ株式会社, p.209, 2006 [3] Herbert Schildt : “C/C++ Programmer's Reference Second Edition”, ...

c言語 malloc関数 動的にメモリ確保する

c言語でメモリを必要な時に必要なだけ確保する 例 #include <stdio.h> //標準入出力関数を使うときに必要なヘッダー #include <stdlib.h> //malloc関数を使うために必要なヘッダー int main(void){ int *p; //ポインタp int n; printf("サンプル数を入力したください。n = "); scanf("%d", &n); p = (int *)malloc(n); //n分のint型サイズでメモリ確保 if(p == NULL){ printf("メモリ確保失敗"); return -1; } for(int i = 0; i malloc関数によりメモリの確保が失敗した場合はNULLを返す。 そのため、サンプルプログラムで示した通りif文で判定してあげると状況がわかる。 最後にはfree関数でメモリを解放してあげる。 補足↓ #include <stdio.h> //標準入出力関数を使うときに必要なヘッダー #include <stdlib.h> //malloc関数を使うために必要なヘッダー int main(void){ int *p; p = (int *)malloc(5); //メモリ確保 for(int i = 0; i 上のプログラムは代入されたアドレスから相対的に配列を指定して、 データを読みだしている。 ポインタpにp[2]のアドレスを代入した時の関係を下に表として示す。 配列の場合 p[-2] p[-1] p[0] p[1] p[2] 0 1 2 3 4 アドレスの場合 p-2 ...