関数abs()について、はたらきやどういった使い方をすればよいのか教えてください

A 回答 (3件)

abs()は、絶対値を求める関数で、


C言語では、 int abs(int n);で、引数にint型の整数をわたすとint型整数で返してくれます。
例として、abs(10)→10、abs(-10)→10

C++では、引数の型が、何でも良くなり、その型で返してくれると思います。
    • good
    • 0

絶対値というのは、「原点までの距離=大きさ」を意味します。


つまり、マイナスだったらプラスにするということです。

使い方としては、例えば、A さんと B さんがマラソンをしていて、A さんが a メートル走っていて、 B さんが b メートル走っていて、2人が今どれだけ離れているかを求めるときに、

x = abs(a - b);

としてやれば、A さんが前でも、B さんが前でも、2人の差の「大きさ」になります。
    • good
    • 0

abs()は、int型の整数の絶対値を返します。


例:abs(2)=2 abs(-3)=3

書式は以下の通りです。
#include <stdlib.h>
int abs(int n)

参考URL:http://www.trpt.cst.nihon-u.ac.jp/programing/C_i …
    • good
    • 0

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

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

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

QC言語のソースコードの書き方

C言語のソースコードの書き方に関する質問です。
0を5個と1を4個の、合わせて9個の数字を並べて出来上がる数列のパターン(126通り)を全て羅列させるプログラムを作りたいと考えていますが、そのためにどういった方針を立ててソースコードを書けばよいかが分かりません。
どういった構造かだけでも構いませんので、教えて頂けると幸いです。
よろしくお願いします。

Aベストアンサー

という方針で書くとこんな感じね。
#include <stdio.h>

void
print_pattern(char pattern[], int size)
{
for (int i = 0; i < size; i++) {
printf("%c", pattern[i]);
}
printf("\n");
}

void
iter(char pattern[], int end, int n, int m)
{
if (n == 0 && m == 0) {
print_pattern(pattern, end);
return;
}

if (n == 0) {
pattern[end] = 'b';
iter(pattern, end + 1, n, m - 1);
return;
}
if (m == 0) {
pattern[end] = 'a';
iter(pattern, end + 1, n - 1, m);
return;
}

pattern[end] = 'b';
iter(pattern, end + 1, n, m - 1);
pattern[end] = 'a';
iter(pattern, end + 1, n - 1, m);
}

int
main(void)
{
int m = 5, n = 4;
char pattern[m + n];
iter(pattern, 0, m, n);
return 0;
}

という方針で書くとこんな感じね。
#include <stdio.h>

void
print_pattern(char pattern[], int size)
{
for (int i = 0; i < size; i++) {
printf("%c", pattern[i]);
}
printf("\n");
}

void
iter(char pattern[], int end, int n, int m)
{
if (n == 0 && m == 0) {
print_pattern(pattern, end);
return;
}

if (n == 0) {
pattern[end] = 'b';
iter(pattern, end + 1,...続きを読む

QC#で自分のウインド・ハンドルを取得するにはどうすればよいのでしょうか

C#を勉強中のものですが、教えて下さい。

タイトル通りですが、自分自身のウインドハンドルを取得する方法はあるのでしょうか?

Aベストアンサー

フォーム(コントロール)のHandleプロパティで取得できます。

QC言語のソースコードについて教えてください。

以下のソースコードを学習用C言語開発環境で行ったのですが、
『ファイル「C:/Users/ユーザー名/AppData/Local/EasyIDEC/project/タイトル/main.c」の
「41行目」で記述エラーを発見しました。
「,」を付け忘れています。』

という、コンパイルエラーが表示されました。
何度も見直したのですが、よくわかりません。

#include <stdio.h>

int main(int argc, char *argv[])
{
char answer ;
answer = 'n' ;

while(answer =='n')
{
int input ;
input = 0 ;
int add ;
add = 1 ;
int sum ;
sum = 0 ;

printf("数値を入力して下さい。:") ;
scanf("%d", &input ) ;

int i ;
i = 0 ;

while(i < input)
{
sum =sum + add ;
printf("\n%d",sum) ;
i++ ;
add++ ;
}

printf("\n1から%dまでの総和は、%dです。" , input , sum) ;

while(1)
{

printf("\n終了しますか? y/n:") ;
scanf(" %c , &answer) ;

if( (answer != 'y') && (answer != 'n') )
{
printf( "y or nを入れてください。") ;
}
else
{
break ;
}
}
}
return 0 ;
}

以下のソースコードを学習用C言語開発環境で行ったのですが、
『ファイル「C:/Users/ユーザー名/AppData/Local/EasyIDEC/project/タイトル/main.c」の
「41行目」で記述エラーを発見しました。
「,」を付け忘れています。』

という、コンパイルエラーが表示されました。
何度も見直したのですが、よくわかりません。

#include <stdio.h>

int main(int argc, char *argv[])
{
char answer ;
answer = 'n' ;

while(answer =='n')
{
int input ;
input = 0 ;
int add ;
add = 1 ;
int sum ;
sum = 0 ;

printf("...続きを読む

Aベストアンサー

>>おかげで、エラー表記されずに、プログラムが実行されました。

これはコンパイルがうまく完了したってことでしょうか?できあがったプログラムが実行できたってことではないですよね?そうなら

>>’タイトル’は内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。」

なんて問題は起きないはすですからね。

できあがったファイルは、XXXX.EXEのように拡張子のEXEがついていますか?もしXXXX.OBJであれば、リンクができていませんから、実行できません。

学習用C言語開発環境の使い方を確認してみてください。

P.S.
昔は、コンパイラを使うのは大変でしたが、今は楽ですね。CではなくPascal系コンパイラーですが、カセットテープに入っていて、コンパイラの読込にテープレコーダで15分かかったりとか、まあ大変だけど面白い時代でした。

QWaitForMultipleObjects関数の待機状態から抜けるにはどうすればいいのですか。

初心者です。XPとVC++ 6.0で開発しています。
シリアル通信プログラムを作成しておりますが、クロスケーブルでPC同士をつないで、片方はハイパーターミナル(以下H)を立ち上げて、もう片方は、作成しているプログラム(以下P)を走らせて通信しようとしています。Pから、Hへの送信はできるのですが、Hを走らせているPCのキーボードをたたいても、Pで受信ができません。WaitForMultipleObjects関数のところで待機状態になったままです。DEBUGの進め方についてアドバイスをいただけますでしょうか。
Pを実行した際には、GetLastError関数がERROR_IO_PENDINGを返しており、IOからのデータ待機状態に入っています。(※P,H共に、COM1,9600bps,8bit,NONEに設定しています。)ご教示お願いいたします。
// PURPOSE: This is the starting point for the Read Thread.
DWORD WINAPI StartReadThreadProc(LPVOID lpvParam)
{
char szInputBuffer[INPUTBUFFERSIZE];
DWORD nNumberOfBytesRead;
HANDLE HandlesToWaitFor[3];
DWORD dwHandleSignaled;
DWORD fdwEvtMask;
OVERLAPPED overlappedRead = {0, 0, 0, 0, NULL};
OVERLAPPED overlappedCommEvent = {0, 0, 0, 0, NULL};
overlappedRead.hEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
overlappedCommEvent.hEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
// We will be waiting on these objects. このイベントが立つまでRX動作は待機状態になる。
HandlesToWaitFor[0] = g_hCloseEvent1;
HandlesToWaitFor[1] = overlappedCommEvent.hEvent;
HandlesToWaitFor[2] = overlappedRead.hEvent;
// Keep looping until we break out.
while (TRUE)
{
// Wait until some event occurs (data to read; error; stopping).
dwHandleSignaled = WaitForMultipleObjects(3,HandlesToWaitFor, FALSE, INFINITE);
switch(dwHandleSignaled)
{
case WAIT_OBJECT_0: // Signal to end the thread.
{
// Time to exit.
}
case WAIT_OBJECT_0 + 1: // CommEvent signaled.
{
// Handle the CommEvent.
// Start waiting for the next CommEvent.
break;
}
case WAIT_OBJECT_0 + 2: // Read Event signaled.
{
// Get the new data!
break;
}
case WAIT_FAILED: // Wait failed. Shouldn't happen.
{
goto EndReadThread;
}
default: // This case should never occur.
{
OutputDebugString("Unexpected Wait return value");
goto EndReadThread;
}
} // End of switch(dwHandleSignaled).
} // End of while(TRUE) loop.
// Time to clean up Read Thread.
EndReadThread:
OutputDebugString("Read thread shutting down\n");
PurgeComm(g_hCommFile1, PURGE_RXABORT | PURGE_RXCLEAR);
CloseHandle(overlappedRead.hEvent);
CloseHandle(overlappedCommEvent.hEvent);
g_dwReadThreadID1 = 0;
CloseHandle(g_hReadThread1);
g_hReadThread1 = 0;
return 0;
}

初心者です。XPとVC++ 6.0で開発しています。
シリアル通信プログラムを作成しておりますが、クロスケーブルでPC同士をつないで、片方はハイパーターミナル(以下H)を立ち上げて、もう片方は、作成しているプログラム(以下P)を走らせて通信しようとしています。Pから、Hへの送信はできるのですが、Hを走らせているPCのキーボードをたたいても、Pで受信ができません。WaitForMultipleObjects関数のところで待機状態になったままです。DEBUGの進め方についてアドバイスをいただけますでしょうか。
Pを実行した...続きを読む

Aベストアンサー

見た目はOKですね。
イベントハンドルが渡っているなら、通信エラーが考えられます。
ACEにどんな設定をしたか、調べてみて下さい。
http://www.ys-labo.com/BCB/2007/070512%20RS232C%20zenpan.html
http://members.jcom.home.ne.jp/0434383301/vc10.htm
いきなりではなく、先ず1バイトの送受信を割り込みでなく、
普通に実行してみましょう。

QC言語ソースコードに関する質問です。

以下の数列について,初項から第15項までを求めるプログラムと実行結果を示せ。
0 1 1 2 3 5 8 13 21(ただし,初項=0,第1項=1とする。)

ソースコードを書くと、エラーがでた。
#include <stdio.h>
int fib(int n)
{
if(n==1 || n==2)
return 1;
else
return fib(n-1)+fib(n-2);
}
int main(void)
{
int n;
for(n=0;n<17;n++)
printf("%d,",fib(n));
}

正しソースコードを教えてください!

よろしくお願いします。

Aベストアンサー

#include <stdio.h>

void fib(int i, int j, int n)
{
if (n == 1)
{
printf("%d\n", i);
}
else
{
printf("%d\n", i);
return fib(j, i + j, n - 1);
}
}

int main(void)
{
fib(0, 1, 15);

return 0;
}

Q基本的なことを勉強したあとはどうすればよいのでしょうか。

基本的なことを勉強したあとはどうすればよいのでしょうか。

入門書などで、ポインタや構造体など一通りのことを勉強しましたが、使っている関数が
<stdio.h>の標準関数だけでした。

この標準関数というものを調べてみましたが、どうやらあまり高機能でないというか
Windowsで使えるようなアプリケーション開発を行うのは無理があるようです

といっても、すぐにアプリケーションが作れるとは思っていないのですが
このあとどういう勉強をしたらよいでしょうか。

最終的な目標としては、C言語を通してOSの仕組みやPCの基本的な構造を理解できればと思っています。

Aベストアンサー

基本的なことを理解したと思うなら、応用に進めばいいんじゃないでしょうかね。
実際、言語仕様を理解したつもりでも、処理系によっては挙動が変わってしまうことが少なくないのがC言語ですし。
そういえば、どの処理系で学習されたのでしょうか?
(WindowsならVisual Studioシリーズは便利なのですが、癖が強いので学習に向くかといえば疑問があります。)

本当にC言語だけでWindowsアプリケーション開発をしてみたいと思うなら、以下のページの第2章程度までは理解しておいたほうが良いでしょう。
http://www.geocities.jp/ky_webid/win32c/index.html

ただ、C言語だけでWindowsアプリケーションを作成しようとするのは、愚かな行為であると感じるんじゃないかなと思いますよ。主に生産性の点で。

Qc言語のソースコードを教えて下さい

キーボードから10個の正整数値を読み込み,合計値を表示するプログラムを作りなさい。
ただし,キーボードから読み込んだ値はint型変数xにしまわれるものとし,変数はこのxと回数を数えるint型変数countと合計値をしまうint型変数sumのみを用いることとする。

このプログラムのソースコードを教えて下さい。
解説もよろしくお願いします。

Aベストアンサー

一例です。
添付のURLを参照して下さい。
因みに、平均値も算出しているが気にせずに、後はご自身で変数、コードを要調整して下さい。

参考URL:http://www.geocities.jp/kenji_y0328/crenshu/renshu/r021.gif

QWin32APIで入力した数値を反映させたアプリケーションを動かすにはどうすればよいでしょうか?

C++をはじめたばかりなのですが、waveout関数に興味を持ち、今現在勉強中です。

http://www13.plala.or.jp/kymats/study/MULTIMEDIA/waveOut_stereo_16.cppに載っているサンプルをhttp://oshiete1.goo.ne.jp/qa5223409.htmlで頂いたアドバイスを参考にして、「CPad for Borland C++ Compiler」でも警告なしでコンパイルできるようにしました。

サンプルでは、
>#define F400//周波数(1秒間の波形数)
で周波数が設定されてあります。

これを、ユーザがキーボードで数値を入力して自由に周波数を設定できるように変更しようと思いました。
コマンドプロンプトで数値を入力するのではなく、新しくウィンドウを開いて、数値を入力するためのボックスを開きたいと思います。

ですが、これをC++とWin32APIで実行するための専用の関数が見当たりません。

たとえば、『C/C++によるWin32API -APIサンプル集(http://homepage1.nifty.com/MADIA/vc/api/)』にあるサンプルプログラムを拝見させていただいたのですが、発見することができませんでした。予め設定された選択肢から選択するメニューについては紹介されていたのですが、入力フォームを作る方法については紹介されていなかったように思えます。

Win32APIで数値を入力して
>#define F400
の「400」の部分を変えるためには、どのようにすればよいでしょうか?

C++をはじめたばかりなのですが、waveout関数に興味を持ち、今現在勉強中です。

http://www13.plala.or.jp/kymats/study/MULTIMEDIA/waveOut_stereo_16.cppに載っているサンプルをhttp://oshiete1.goo.ne.jp/qa5223409.htmlで頂いたアドバイスを参考にして、「CPad for Borland C++ Compiler」でも警告なしでコンパイルできるようにしました。

サンプルでは、
>#define F400//周波数(1秒間の波形数)
で周波数が設定されてあります。

これを、ユーザがキーボードで数値を入力して自由に周波数を設定でき...続きを読む

Aベストアンサー

『猫でもわかるプログラミング』というサイト(参考URL)の
Windows SDK編 第34章 エジットコントロールの張り付け
という記事が参考になるかもしれません。

参考URL:http://www.kumei.ne.jp/c_lang/

Qソースコードの間違い (C言語)

変数に、文字列を入れた配列の文字列の最後の要素数を入れたいのですが(つまり'\0')、うまくいきません。いつも2個多い値になってしまいます。

#include <stdio.h>

void main() {
char moji[100]={0};
int c=0;

fgets(moji,sizeof moji,stdin);

while( moji[c] != '\0' ) ++c;

printf("\n%d\n",c); //
}

例えば5文字の1ビット文字を入れると、最後の文字はmoji[4]にあるのでprintfで4と表示されるはずじゃないですか。でも6になるんです。いつも+2の値になるんですよ。どうやらfgetsを使っているからそうなるらしく、scanfを使うと結果は1多い値に、普通に配列に直接文字列を代入すると正常な結果になります。別にcに-2してもいいのですが、それはなんだか癪といいますか・・・。なぜこういうことがおきるのでしょうか?回答よろしくお願いします。

Aベストアンサー

>なぜこういうことがおきるのでしょうか
そのmoji[]の余計な部分にはどんなコードが入っているかは確認していますか?
リターンキーも「キー入力」の一つですよ。

Qregex関数を理解するには、何を説明すればよいか?

unixを使っているゼミにいます。c言語でregex関数の使い方や仕組みをゼミで発表しないといけないのですが、manのregcomp()やregexec()の解説を読んでも、
人に説明できるほどわかりません。まずregex関数を説明する上で、何を最初に説明すればいいでしょうか?
また、regcomp()などの関数のソースファイルなどがありましたら、教えてください。

Aベストアンサー

regex 使用例であれば、Google に regex、regcomp、regexec などのキー
ワードを入れて検索してみるだけでも結構見つかります。

中でも以下は比較的わかりやすく解説されているように思います。

http://sometime.minidns.net/~ccgi/posix_regex.html

> また、regcomp()などの関数のソースファイルなどがありましたら、教えてください。

http://ftp.gnu.org/glibc/

glibc (最新バージョンは 2.7) のソースコードを展開すると posix とい
うディレクトリがあるので、そこに regex のソースコードがあります。

ただし、非常に難解です。アルゴリズムなども含めて知る必要があるので
あれば、NFA や DFA というキーワードでも調べてみるとよいでしょう。

http://www2.starcat.ne.jp/~fussy/algo/algo7-5.htm


人気Q&Aランキング

おすすめ情報