質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

760閲覧

C言語 基礎的な数学部分の考え方について

kakedasiKUN

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2023/09/25 06:31

編集2023/09/25 06:33

実現したいこと

10bitで表現できる10進数(1023)をタイマーで使用する3分(1秒区切りのため180)に変換する

前提

組み込みC言語勉強中のものです。

試したこと

現在私のバカな頭では1023を180で割り切れる数900だけを5で割って残った123を二分割して0~180を表現しようと思っています。

ex)0~61→変換→0
61~65→変換→1
66~70→変換→2
71~75→変換3
.
.
.
.
.
966~→変換→180//ここはずれているかも

こういう形で表現しようと思っています。正直無理やりならこのような形で実現可能ですがもっといい方法があれば教えていただきたいです。
急いでいるので文章めちゃくちゃかもしれませんが理解できた方だけ答えていただけたら幸いです。

また、小数点は使いたくない(おそらく使えない?)です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KOZ6.0

2023/09/25 10:57

そのまま 0 ~ 1023 秒として扱うのはダメなんでしょうか?
ikedas

2023/09/25 12:28

5で割らなければならないと思った理由は何でしょうか。
ikedas

2023/09/25 12:32

なお。「急いでいる」は禁句です。このような言葉が入った質問は、急いで回答してあげても必ず質問者さんからの反応がなくなり、質問のクローズ処理もされないまま放置されます。 「急いでいる」云々の語句は削除しておかれることをおすすめします。
jimbe

2023/09/25 14:30 編集

1024 個の数値の中の 180 個の数値で 3 分(180 秒) を表す為にどの値を用いるのが良いかということでしょう。そして、その数値自体・数値間には大した関係は無く、また開始・終了値もプログラムで決めて良いようです。…仕様としてそんなの使えるものなのかと思いますが。 確かに「文章めちゃくちゃ」で、想定しても合っているのか分かりません。 数学でも無くただ仕様としてどうするかというだけですし。
thkana

2023/09/25 22:47

やりたいことをちゃんと整理して日本語で書き表す(英語でもいいけれど)ということはプログラミングの第一歩だ、という思いを新たにしたりします。 急がば回れ、まずは慣れた日本語で状況を整理してみてはいかがでしょうか。
guest

回答3

0

ベストアンサー

0~1023の値域を180分割したいと解釈しました。

ex)0~61→変換→0

ではなく
ex)0~4→変換→0
ではないでしょうか。

単純に均等に割り当てればいいかと思います。

C

1 for (i = 0; i < 1024; i++){ 2 x = i / (1024.0/180); 3 printf("%d ------ %d\n", i, x); 4 }

また、小数点は使いたくない(おそらく使えない?)です。

浮動小数点演算が使えない環境なのでしょうか。
こうなら大丈夫ですか?

C

1 for (i = 0; i < 1024*180; i+=180) { 2 x = i / 1024; 3 printf("%d ------ %d\n", i/180, x); 4 }

投稿2023/09/25 13:37

naitou

総合スコア141

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2023/09/26 02:39 編集

質問文に示されている例を見る限りだと, > 61~65→変換→1 とか書かれているので, 【0と180だけは特例(?)で,他の値(1,2,...179) よりも広い値が割り振られる】という話を所望しているようにも見えます. (何故そうしたいのか? 等々,意味不明ではありますが,「均等」を目指しているようには見えない)
naitou

2023/09/26 03:54

確かに文章をよく読むと残った123(124?)を二分割して0と180(179?)に割り当てるって感じがしますね。 先頭と末尾に67、中間に5ずつ割り当てる感じですかね。
fana

2023/09/26 04:16

目的や理由は不明ですが,何かそんなことをしているっぽいですよね. まぁ, > もっといい方法があれば… という話なので,「均等でよくね?」という話でOKと思いますが.
guest

0

1列目と2列目は増分5の等差数列,3列目は増分1の等差数列であることに着目して仕様の表を完成させると以下のようになります。

0 ~ 60 -> 0 # 61 を 60 に修正
61 ~ 65 -> 1
66 ~ 70 -> 2
71 ~ 75 -> 3
... ... ...
951 ~ 955 -> 179 # 71 + (179 - 3) x 5 = 951
956 ~ 1023 -> 180

これを基にした記述例を下記に示します。

なお,「61 ~ 65」が「1」になるように「5」で割る前に「56」を引いています。つまり,この整数間の割り算((x - 56) / 5)は通常の演算結果の小数点以下を切り捨てた整数が演算結果になります。

C

1#include <stdio.h> 2 3int main(void) { 4 int x, y; 5 6 for (x = 0; x < 1024; x++) { 7 if (x < 61) 8 y = 0; 9 else if (x < 956) 10 y = (x - 56) / 5; 11 else 12 y = 180; 13 14 printf("%4d %3d\n", x, y); 15 } 16 17 return 0; 18}

投稿2023/09/26 02:02

little_street

総合スコア317

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

10bitで表現できる10進数(1023)をタイマーで使用する3分(1秒区切りのため180)に変換する

「3分に変換する」という意味が全く不明です。

「試したこと」の内容から想像すると、0から1023までの数字を、0から180までの数字に変換するということでしょうか?

0~180を表現しようと思っています。

(1~180 や 0~179 の180個じゃなくて 0~180 の181個で間違いないのでしょうか?)

具体例で言うと「1024人の人を出来るだけ均等な人数の181グループに分ける」ということ?
であれば、剰余(割り算の余り)を使います。

C

1int i, x; 2for(i=0; i<1024; i++){ 3 x = i % 181; // 0~180 の場合 4 // x = i % 180; // 0~179 の場合 5 // x = i % 180 + 1; // 1~180 の場合 6 printf("%d ------ %d\n",i,x); 7}

投稿2023/09/25 11:30

otn

総合スコア84566

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問