タイトルがすべてと言えてしまうのですが、
例えば、int宣言された"4287"(この値は変動します)という数値があったとして、1桁目の"7"だけを別の変数へ引き抜きたいのですが、その場合にはANDによるマスク処理による演算で処理可能なのでしょうか?
また、他に良い方法などありましたら教えていただけますでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (3件)

★10進数ですので AND は使えませんね。


・簡単なサンプルを載せますので読み取って下さい。

サンプル1:
int value = 4287;
int a[ 4 ];

a[0] = (value % 10); value /= 10; // 1桁目を取り出す
a[1] = (value % 10); value /= 10; // 2桁目を取り出す
a[2] = (value % 10); value /= 10; // 3桁目を取り出す
a[3] = (value % 10); value /= 10; // 4桁目を取り出す

サンプル2:
int value = 4287;
int a;

a = (value % 10);
value -= a;

value → 4280
a → 7
になります。
    • good
    • 1
この回答へのお礼

丁度、複数行にわたって引き抜きたかったので、サンプル1は大変助かりました。
まだ意味を理解していませんが、繰り返し使っていけば理解できると信じつつ、利用させていただきます!

お礼日時:2007/02/13 11:54

 


#include <stdio.h>
#include <string.h>

int PicUp(int n, int d)
{
char str[16];

sprintf(str, "%d", n);
return str[strlen(str) - d] - '0';
}

int main(void)
{
int n, d;

scanf("%d %d", &n, &d);
printf("%d", PicUp(n, d));
return 0;
}
 
    • good
    • 1
この回答へのお礼

手本を書いていただいてありがとうございます。

お礼日時:2007/02/13 11:52

(10をほしい桁数乗した数で割って、int型にしたものに10をかけた数)を10を(ほしい桁数-1)乗した数で割って、int型にしたものから引くといいです。



たぶんこんな感じ
    • good
    • 0
この回答へのお礼

言っていることは、ANo.2さんとほぼ同じと理解してよいのでしょうか?

お礼日時:2007/02/13 11:55

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q「編成チャンネル」の英語訳

編成チャンネルの定義は「地上デジタル放送では,BS/CSデジタル放送と同様に,1チャンネル内で複数の番組を放送することができる。例えば,「時間延長された野球放送」と「ニュース」,「ドラマ」といった複数の番組を1チャンネルで放送できる。各チャネル内の番組は「サービス種別(テレビが[0],データ放送は[1]と[2],部分受信は[3])」+「1けたのリモコンID」+「サービス番号」の3けたの番号で表される。例えば,NHK教育のテレビ番組を視聴する場合は,[021][021][023]と3けたの番号で選択することになる。この3けたのチャンネル番号を「編成チャンネル」とも呼ぶ」です。内容は理解できたのですが、英語訳が分からずに困っています。 この「編成チャンネル」に対応する英語を教えてください。よろしくお願いいたします。

Aベストアンサー

 ひょっとしたらsub-channel(s)で意味が通じるでしょうか?

http://electronics.howstuffworks.com/dtv3.htm

ここに下記の記述がありました。
Each broadcaster has one digital TV channel, but one channel can carry multiple sub-channels if the broadcaster chooses that option. Here's how it works:

A broadcaster can divide the channel into several different streams (perhaps four streams of 4.85 Mbps each). These streams are called sub-channels, and this type of broadcasting is called multicasting. For example, if the digital TV channel is channel 53, then 53.1, 53.2 and 53.3 could be three sub-channels on that channel. Each sub-channel can carry a different program.

 ひょっとしたらsub-channel(s)で意味が通じるでしょうか?

http://electronics.howstuffworks.com/dtv3.htm

ここに下記の記述がありました。
Each broadcaster has one digital TV channel, but one channel can carry multiple sub-channels if the broadcaster chooses that option. Here's how it works:

A broadcaster can divide the channel into several different streams (perhaps four streams of 4.85 Mbps each). These streams are called sub-channels, and this type of broadcasting is call...続きを読む

Qint main の前のint add(int a,int b) ってなんですか?

int main の前のint add(int a,int b)
ってなんですか?

Aベストアンサー

関数のプロトタイプ宣言です。

賢いコンパイラだと後ろに書いてある実体を見て関数値や引数の型を読み取ってくれたりしますが、コンパイラによっては先に(つまりソースコードのより上の行に)型を宣言しておかないと正しく値の引き渡しができないものもあります。そういったトラブルを避けるために、add()という関数を使う箇所よりも上に、その返り値や引数の型を宣言しておくのです。

ちなみに、#include <stdio.h>というインクルードがありますが、このstdio.hファイルの中には、main()内で利用しているprintf()等の標準関数についてのプロトタイプ宣言なども書かれています。

QACCESSで10桁の中から中の3桁を抜き出す関数

ACCESSで7けたの数値7654321から765の部分3桁と43の部分の2桁、21の桁を分けて抜きとりたいのですが、どういう関数を使ったらよいかわかりません、LEFT関数を使ってみたりしたのですがどうも欲しいものが取り出せないので基礎的なことですが教えてください
よろしくおねがいします

Aベストアンサー

クエリのデザイングリッドの「フィールド」のセルに

a: [x] \ 10000
b: ([x] Mod 10000) \ 100
c: [x]-[a]*10000-[b]*100

と入力してください。ここで、x は 7654321 などが入っているフィールドの名前、a, b, c は計算結果が入るフィールドの名前です。

7654321 に対しては、a に 765、b に 43、c に 21 が得られます。

Q「void ( *signal(int sig, void (*func)(int)) ) (int)」の (int)

signal関数の書式についてですが、

  void ( *signal(int sig, void (*func)(int)) ) (int);

最後に付く(int)は一体何でしょうか?
このような関数の書式ははじめて見ました。
UNIX系の何かでしょうか。
回答よろしくお願いします。

Aベストアンサー

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t sighandler);
より後半部分のtypedefを置き換えると
sighandler_t signal(int signum, void (*sighandler)(int));
つぎに戻り値の部分のtypedefを置き換えると
void (*signal(int signum, void (*sighandler)(int)))(int);
となります。
(
sighandler_t signal(int signum, void (*sighandler)(int));
の「signal(int signum, void (*sighandler)(int))」をAと置き換えて
sighandler_t A;
からtypedefを置き換えると
void (*A)(int);
となり、Aを戻すと
void (*signal(int signum, void (*sighandler)(int)))(int);
となる。
)

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t sighandler);
より後半部分のtypedefを置き換えると
sighandler_t signal(int signum, void (*sighandler)(int));
つぎに戻り値の部分のtypedefを置き換えると
void (*signal(int signum, void (*sighandler)(int)))(int);
となります。
(
sighandler_t signal(int signum, void (*sighandler)(int));
の「signal(int signum, void (*sighandler)(int))」をAと置き換えて
sighandler_t A;
からtypedefを置き換...続きを読む

Q10^210/(10^10+3)の整数部分の桁数と一桁目の数を求めよ。

10^210/(10^10+3)の整数部分の桁数と一桁目の数を求めよ。

10^210/(10^10+3)=(10^210+3^20-3^20)/(10^10+3)
=(10^210+3^20)/(10^10+3)-(3^20)/(10^10+3)
と変形して考えたら、
桁数は201けた、一桁目は0になりました。
解答がないので、正解がわかりません。
これでよいでしょうか。

Aベストアンサー

(10^210)/(10^10)>(10^210)/(10^10+3)>(10^210)/(10^11)

10^200>(10^210)/(10^10+3)>10^199

10^200は201桁の最小整数、10^199は200桁の最小整数なので

∴(10^210)/(10^10+3)は200桁の整数

次に
x=10^10とおくと
10^210/(10^10+3)=x^21/(x+3)
=x^20-3x^19+9x^18- … -3^19*x+3^20-3^21/(x+3)
=x(x^19-2x^18+ … -3^19)+3^20 -3^21/(x+3)

x(x^19-2x^18+ … -3^19) は 10^10の倍数なので整数部に1桁目には関係なし。
3^20=3486784401
-3^21/(x+3)=-10460353203/(10^10+3)=-1.046…
3486784401-1.046… = 3486784399.953…
∴整数部の1桁目は「9」

Qint rev_int(int num)文  関数の入門

#include<stdio.h>
/*---非負の整数を読み込んでます*/

int scan_uint(void)

//関数scan_uintは、キーボードから非負の整数値を読み込んでその値を返す関数です。
{
//この関数には受け取るべき仮引数がありません。仮引数がないことを示すためには()の中をvoidとします。

int tmp;//テンプの箱作成

do {
printf("非負の整数を入力してください:");scanf("%d",&tmp);
if(tmp< 0)
printf("\a負の数を入力しないでください");

}

while(tmp<0);

return (tmp);
}

/*非負の整数を逆転した値を返す*/

intrev_int(int num)
{


inttmp = 0;

if(num> 0){
do{
tmp = tmp * 10 + num % 10;
num /= 10;
}while (num > 0);

}

return (tmp);

}

int main(void)
{

int nx = scan_uint();

printf("反転した値は%dです。\n", rev_int(nx));

return 0;

}

教えてください!参考書に書いてあることをまとめて
プログラムを読んでるのですが、わからない部分があります。
(1)まずint scan_uint(void)からこのプログラムは読み込んでるのでしょうか? どこかのサイトを調べたら、最初にint mainからプログラムは
読み込むというのを観たのですが、コンパイルして実行した動きをみるかぎり一番最初はint scan_uint(void)から読んでるように見えます。。。

(2)int scan_uint(void)の文は理解できました。私なりに解釈したのは
ここでは正の数を入力しないと次に進まないことと
負の数を入力した場合、負の数を入力しないでくださいと注意がずっと
でるという文です。
質問ですが、このあとint rev_int(int num)文に移ると思うのですが
ここの int tmp = 0; これはこのint rev_int(int num)文のみの
tmpの箱と参考書に記載がありました。つまり int scan_uint(void)で
出てきたtmpとは別個と解釈しました。

そうなると、int rev_int(int num)文を読んでみると

tmpの箱を作成。そこは0を代入。
if文で num>0の時、 do文に入る (ここでいうnumは int numと宣言してないですけど、またscanfとか作って値はまだいれてないですけど??)

do文は
tmp = tmp*10 + num %10
num /=10
wile(num>0)

これを見る限り、numという箱が見えません。全体を見渡しても
どこかでnumに値が代入されたのち、このint rev_int(int num)
という文を読みこんでいき if num>0のときと宣言されていますが
もっと前の段階でnumの値が入力されていない限り
このif文は適用されないと思ったのですが、プログラムは動いてます

三つ目の質問です
tmp = tmp *10 + num % 10
num /=10 の部分がわかりませんでした。
tmpはまず、int scan_uint(void)で作成したtmpと
int rev_intで登場してきたtmpとは別個と参考書に書いてあるのが
正しいのであれば
tmpの値はここでは初のはずです。
一体いつ値を入力したのでしょうか?
もしも一番最初のscanfの時に入力した例えば12345が此処でも適用されるなら tmp = 12345 ×10 + num % 10を tmpに代入するって文になりますが
どうしてtmpを10かけるのですか?123450になり、
そのあとnumの値が此処でもまだ不明なのですがnum/10したものと
足すみたいですが、わかりませんでした。。。

まとめると、tmp = tmp*10+num%10がわかりません。
また、numとは何かわかりません、値もどの値がどこで代入されていて
while(num>0)が引っかかるのか不明です。
tmpはint scan_uint文内で入力した値(scanfの部分で)
12345と仮に入力したら、それは次のint rev_int(int num)でも続いて活用されてるのですか?
参考書はなぜ別個と書いてるのかわかりません。

ごめんなさい>_< とても長くなりました。
どなたか解る方、教えてください、よろしくおねがいします。

#include<stdio.h>
/*---非負の整数を読み込んでます*/

int scan_uint(void)

//関数scan_uintは、キーボードから非負の整数値を読み込んでその値を返す関数です。
{
//この関数には受け取るべき仮引数がありません。仮引数がないことを示すためには()の中をvoidとします。

int tmp;//テンプの箱作成

do {
printf("非負の整数を入力してください:");scanf("%d",&tmp);
if(tmp< 0)
printf("\a負の数を入力しないでください");

}

while(tmp<0);

return (tmp);
}

/*非負の整数を逆転...続きを読む

Aベストアンサー

(1)
C言語の場合「書いてある順番」と「実行する順番」は、まったく関連がありません。

決まっているのは「必ずmain関数から実行する」と言う事だけです。

因みに「実行を開始する場所(ポイント)」のことを「エントリポイント」と呼び、Cでは「main関数の先頭がエントリポイント」と決まっています。

(2)
>質問ですが、このあとint rev_int(int num)文に移ると思うのですが
いいえ。移りません。

これが「そもそもの誤解の始まり」です。

上記(1)で言った通り、必ずmainからプログラムが動き始めます。

main関数で

int nx = scan_uint();
printf("反転した値は%dです。\n", rev_int(nx));

と、それぞれの関数を呼んでいるので、実際の動作を実行順に羅列すると
1.必ずmainの先頭からプログラム開始。
2.mainからscan_uintが呼ばれる。
3.呼ばれたscan_uintが処理を行う(内容は理解しているようなので省略)
4.scan_uintからmainに帰ってくる。その時の戻り値がnxに入る。
5.printfの引数にrev_int(nx)があるので、nxを引数にしてrev_intを呼ぶ。
6.呼ばれたrev_intは、nxの値をnumとして受け取る。
7.rev_intは受け取ったnum(mainのnxと同じ値)を元に処理を行う。
8.rev_intはtmpに作った値を戻り値として関数を終わる。
9.rev_intからmainに帰ってくる。その時の戻り値がprintfの引数になる。
10.mainからprintfが呼ばれる。
11.呼ばれたprintfは何かを画面に表示し、関数を終わる。
12.printfからmainに帰ってくる。printfの戻り値は受け取ってないので捨てられる。
13.mainがreturn 0;で関数を終わらせ、プログラムが終了する。
となります。

>これを見る限り、numという箱が見えません。全体を見渡しても
上記の6.で「引数の実体として、mainから渡してもらってる」でしょう?

それが判らなかったのは「プログラムはmainの先頭から実行する」と言うのを理解できていないからです。

(3)
>tmp = tmp *10 + num % 10
>num /=10 の部分がわかりませんでした。
>どうしてtmpを10かけるのですか?123450になり、
123450にはなりません。

rev_intに入ってきたら
int tmp = 0;
ってやってるので、tmpは「最初は0」です。別の場所(scan_uintなど)にあるtmpは「同姓同名の赤の他人」なので忘れましょう。

scan_uintで「12345」を入力すると、12345がmainのnxに返って来て(nxが12345になって)、そのnxの値である12345がrev_intに渡され、rev_intは12345をnumに受け取ります。

つまり「最初は、numは12345、tmpは0になっている」のです。

そして、numが0かどうか調べます。

numが0でない(12345になっている)ので、次に
tmp = tmp *10 + num % 10;
を実行します。

tmp(中身が0)を10倍した値と、numを10で割った余りを足し、tmpに戻しています。

つまり0を10倍した0に、12345を10で割った余り5を足し、足した結果5をtmpに戻します。なのでtmpは5になります。

次に
num /=10;
を実行します。

これは「numを10で割って、numに戻す」です。
num = num / 10;
と同じです。

numは12345なので、10で割った商1234がnumの新しい値になります。

なお、Cでは、整数の割り算の答えは「商」だけです。小数点以下はありません。例えば、1を10で割ると0になります。

次は、while文で「numが0より大きいなら繰り返し」です。

numが0より大きい(1234になっている)ので繰り返すことになり、また
tmp = tmp *10 + num % 10;
を実行します。

tmpは5になっているので10倍して50、それにnum(1234)を10で割った余り4を足し、足した54をtmpに戻します。

次に
num /=10;
を実行します。

numは1234なので、10で割った商123がnumの新しい値になります。

これを「numが0より大きい間、繰り返し」すると

tmp=0、num=12345

tmp=5、num=1234

tmp=54、num=123

tmp=543、num=12

tmp=5432、num=1

tmp=54321、num=0

となり、numが0になって繰り返すのをやめた時、tmpは54321になっています。

そして、最後に
return tmp;
として、54321をmainに返します。

mainに帰って来ると、前述の9.~11.の処理で
反転した値は54321です。
と表示されます。

>参考書はなぜ別個と書いてるのかわかりません。

「別の場所にある、同じ名前の変数は、同姓同名の赤の他人」なので「別個」です。

(1)
C言語の場合「書いてある順番」と「実行する順番」は、まったく関連がありません。

決まっているのは「必ずmain関数から実行する」と言う事だけです。

因みに「実行を開始する場所(ポイント)」のことを「エントリポイント」と呼び、Cでは「main関数の先頭がエントリポイント」と決まっています。

(2)
>質問ですが、このあとint rev_int(int num)文に移ると思うのですが
いいえ。移りません。

これが「そもそもの誤解の始まり」です。

上記(1)で言った通り、必ずmainからプログラムが動き...続きを読む

Q英語の翻訳できるひといます??

この世には、勝者と敗者しかいない。勝者は周りから賞賛をあびて敗者は誰からも注目を浴びることはできない、しかし負けることによって得られる者は勝者より多い、なぜ負けたのか次はどうしたら勝てるのか、敗者は勝つための準備をすることができる。だから私はこの試合に負けたに関して感謝しています

このパラグラフを英語に翻訳できるひといますか?できれば大学に提出するので文法間違いなしのきれいな英語に直してほしいのですけど、自分の英語力のなさに悲しいです。。

Aベストアンサー

There are only two parties in the world after competition. The winner and the loser
The one could enjoy the honor and the other are not.
However it is fact the looser could study more than a winner, as he coud investigate the reason why he lost, seriously,and prepare for the next, so as he could revenge.
So I am now rather appreciating for the game we lost.

Qint型とfloat型の演算結果

C初心者です。
int型とfloat型で割り算をして処理を表示させてます。
以下、実処理の一部です。
int a;
int b;

a = 3;
b = 2;
(1)printf("答え=%d:1のはず\n",a/b);
(2)printf("答え=%d:1のはず\n",a/(float)b);
(3)printf("答え=%d:1のはず\n",(float)a/b);
(4)printf("答え=%d:1のはず\n",(float)a/(float)b);

私の予想では(1)~(4)まですべて1が表示されると思っていました。
実際は(1)のみ1で(2)~(4)は0でした。
(2)~(4)はなぜ0と表示されるのですか?
・整数型と実数型で演算した場合、実数型に合わせられてること
・表示が整数型であること
なので1が表示されると予想したのですが・・・。

Aベストアンサー

結論を先に言えば、偶然です(x86系だと、多分、0になる処理系が多いはず)
b=11
とかに変えると・・・

メモリ上で変数がどのように格納されるのかとか、intのビット数や浮動小数点の扱いで結果は変わるはずです

演算は、より大きな桁数を扱える方の型になるので、
(1)はint
(2)-(4)はfloat
になって、printfは、%dから、引数をintとして処理しますが、intにあたる部分の値が偶然0になっていたため、全て0になったはず
デバッガなどでメモリのダンプなどするといいかも

Q開店祝いの英語メッセージ

初めて質問させていただきます。

お店(飲食店)をオープンする友人に、ライターをプレゼントしようと思っているのですが、そこに「お店の灯りがともり続けますように・・・」という意の英語のメッセージを刻印したいです。「ライター」とかけた上手い(ユーモアのある)表現があるといいなと思います。

少し意味が変わっても、違う表現でもいいので、英語好きの友人が喜ぶような気の利いた開店祝いのメッセージがあれば教えてください。

よろしくお願いいたします。

Aベストアンサー

Yahoo!Answersで聞いてきたところ、
◆May the light of your soul bless “Café Paradaisu”.は sounds fineだよ。
By 18歳アメリカ人

◆"May Cafe Paradaisu be blessed by the light of your soul." が自然なのでは?
By アメリカ人(元ジャーナリスト、エディター)

◆文法的に正しくて、とてもセンチメンタルだ。
By 正体不明(文法を指摘しているので多分アメリカ人かとにかく英語に堪能な人だと思います。)

※「Café Paradaisu」は私が仮につけた店の名前です。
笠原弘子さんの「カフェパラダイス」が好きなので ^^;

質問者さんも英語が分かるということなので、ご参考までに、私が質問したURLを記します。
あと2日くらいYahoo!Answersの質問は閉じずにいる予定です。
よろしかったら、リンク先をご覧ください。

参考URL:http://answers.yahoo.com/question/index;_ylt=AnK4V2CnSbawYkmD.mbUuxHsy6IX;_ylv=3?qid=20110707163827AARhbiN

Yahoo!Answersで聞いてきたところ、
◆May the light of your soul bless “Café Paradaisu”.は sounds fineだよ。
By 18歳アメリカ人

◆"May Cafe Paradaisu be blessed by the light of your soul." が自然なのでは?
By アメリカ人(元ジャーナリスト、エディター)

◆文法的に正しくて、とてもセンチメンタルだ。
By 正体不明(文法を指摘しているので多分アメリカ人かとにかく英語に堪能な人だと思います。)

※「Café Paradaisu」は私が仮につけた店の名前です。
笠原弘子さんの「カフェパラダイス」が好きなので ^...続きを読む

Q※int nyuuryoku_kosuu = 0; ※の部分は何を宣言しているのでしょうか?

#include <stdio.h>
struct tanka_ kosuu {
  構造体名
int tanka;
int kosuu;         型 構造体のメンバ(変数名)
int kingaku;
};
int main()
{
struct tanka_kosuu data [10];
構造体宣言 構造体名  変数名 値・・10を代入
      struct tanka_kosuu kari_nyuuryoku = {-1, 0, 0};
               型 構造体メンバ(変数名)の初期化
※int nyuuryoku_kosuu = 0;
以上※の部分は何を宣言しているのでしょうか?
while(kari_nyuuryoku.tanka != 0){
scanf("%d %d", &kari_nyuuryoku.tanka,
&kari_nyuuryoku.kosuu);
data [nyuuryoku_kosuu] = kari_nyuuryoku;
nyuuryoku_kosuu++;
}
return 0;
}
 
以上よろしくお願いいたします。

#include <stdio.h>
struct tanka_ kosuu {
  構造体名
int tanka;
int kosuu;         型 構造体のメンバ(変数名)
int kingaku;
};
int main()
{
struct tanka_kosuu data [10];
構造体宣言 構造体名  変数名 値・・10を代入
      struct tanka_kosuu kari_nyuuryoku = {-1, 0, 0};
               型 構造体メンバ(変数名)の初期化
※int nyuuryoku_kosuu = 0;
以上※の部分は何を宣言しているのでしょうか?
while(kari_nyuuryoku.tanka != 0){
scanf("%d ...続きを読む

Aベストアンサー

※のところでnyuuryoku_kousuuの初期値を0と置くことで、data[nyuuryoku_kosuu]=kari_nyuuryoku;でkari_nyuuryokuの値をnyuuryoku_kosuuに正しく入れるための宣言だと思います


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報