馬鹿な質問かもしれませんが、C言語で|a+b|<=cを入力してコンパイルし、
実行しようとしてもエラーが出て実行できません。C言語では絶対値のプログラム
は存在しないのでしょうか?もし存在するなら教えてください。

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

A 回答 (6件)

abs(a+b)で絶対値が取れます。

    • good
    • 0
この回答へのお礼

回答ありがとうございました。おかげさまで無事解決しました。
今後ともよろしくお願いします。

お礼日時:2001/05/23 11:20

質問の内容とは関係ないのですが、


もうすこしタイトルのつけ方に気をつけたほうがいいと思います。

今回の質問ならば「絶対値を使用できません」など
質問の内容がわかりやすいものがいいと思います。
初心者というのは本文の最後にでもちょこっと書いておけばいいことですから。

偉そうなこと言ってすいません。
    • good
    • 0
この回答へのお礼

偉そうなことだなんてとんでもないです。以後気を付けます。

お礼日時:2001/05/23 11:38

もう回答の必要はないと思いますが、老婆心ながら。

。。

 NINJA104さんのおっしゃるように、絶対値程度のものなら、マクロを使った方が関数を使うよりも高速で手軽です。
 ただ、
  ABS(a++);
などとしてしまうと、マクロの副作用で結果が不明(処理系によって結果が異なる)なので注意が必要です。

 C++などならインライン関数があるので、こんな問題ないのですが。
    • good
    • 0
この回答へのお礼

アドバイスどうもありがとうございました。以後参考にさせて頂きます。
今後ともよろしくお願いします。

お礼日時:2001/05/23 11:34

絶対値を求める関数 ~abs系 を使用し、先述の方々の様に用いるのが正攻法?ですが、いちいち変数の型を気にしなければならないので、私の場合は以下の様なマクロ関数を定義して使っています。



#define ABS(c) (((c)<0)?-(c):(c))

参考まで。
    • good
    • 0
この回答へのお礼

アドバイスどうもありがとうございました。以後参考にさせて頂きます。
今後ともよろしくお願いします。

お礼日時:2001/05/23 11:31

a+bの型によって、関数を使い分ける必要があります。



実数なら
double fabs(double x);  math.h

整数なら
long labs(long n);  stdlib.h
int   abs(int n);   stdlib.h
    • good
    • 0
この回答へのお礼

アドバイスどうもありがとうございました。以後参考にさせて頂きます。
今後ともよろしくお願いします。

お礼日時:2001/05/23 11:27

abs()は整数型なので、もし、a,b,cが実数値なら、



fabs()

を使ってください。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。以後参考にさせて頂きます。
今後ともよろしくお願いします。

お礼日時:2001/05/23 11:24

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

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

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

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

QC言語のコンパイルと実行ファイル作成について

Cで人が書いたプログラムを修正しています。
IDEではなくLinux環境でのコード修正が初めてで、デバックでのバグ潰しや実行ファイル生成がうまく行かず困ってます。
warningをきちんと治したいというのと、gdbの起動がうまくいかない、という2点です。

あるディレクトリに保存された、ABCという文字を含んだサブディレクトリに対して処理を行うプログラムです。
まず1つめ、warningの修正について教えてください。

test=opendir(buff); //DIR変数ポインタ  *test にパスを代入して、
//そのパスにABCという文字が含まれていたら以下を実行、というところ
if(test==NULL&&errno!=){
check=strchr(test,"ABC"); //checkはchar型ポインタです。ここでincomparableな変数だというwarningが出ます。

DIRポインタで取得したパス名をstrchrで比較することはできないのでしょうか。char変数mojiを追加しcheckもchar型に変更して
 moji = test
 check=strchr(moji,"ABC")
としてみましたがNGでした。

このwarningは単に警告なのでとりあえず実行ファイルを作ってデバックしてみたら、と言われ a.outファイルを生成しました。デバッカgdbを起動したところで、2つ目の疑問が発生しました。

gdb 対象ファイル名.c
(gdb) break main   //と打つと、ここで
No symbol table is loaded. Use the "file" command.  //と表示されます。
これは、どう対処したらいいのでしょうか?

調べてあれこれ対応してみたのですがどうにも対処できず困っています。
ぜひ教えていただけると助かります。
宜しくお願い致します。

Cで人が書いたプログラムを修正しています。
IDEではなくLinux環境でのコード修正が初めてで、デバックでのバグ潰しや実行ファイル生成がうまく行かず困ってます。
warningをきちんと治したいというのと、gdbの起動がうまくいかない、という2点です。

あるディレクトリに保存された、ABCという文字を含んだサブディレクトリに対して処理を行うプログラムです。
まず1つめ、warningの修正について教えてください。

test=opendir(buff); //DIR変数ポインタ  *test にパスを代入して、
//そのパスにABCという文...続きを読む

Aベストアンサー

対処法がまるで逆になってます。
IDEとかLinuxとかデバッガとかそんなの関係ありません。

strstrがエラーになるのなら、そのエラーの原因を探るのが本筋でしょう。
それを、まったく目的の違うstrchrを使ったって上手く動作するはずがありません。

例えるなら、「printfで表示が乱れたので、scanfにしたら、まったく表示されなくなりました」ってくらい、おかしな対処法です。


他にも
> sprintf(buff, "%s%s\\",dirpath,entry->d_name);

bufの型は?初期化とか領域確保とかしてますか?
それが出来てたら

> if(buff!=NULL){

こんなタイミングでNULLチェックするのはあきらかに変です。
このsprintfではbuff自体の値は変わりません。

> check=strchr(entry->d_name,"ABC");
これをstrstrに変えたとして
> if(checkabc!=NULL){ ・・・
使ってる変数はcheckなんですか?checkabcなんですか?
エラーになったのはこの変数の間違いとかないですか?
エラーメッセージが無いので判断できません。


他にもおかしなところがあるような気がします。
gcc に -Wall オプションを付けて、警告をできる限り出して、一つ一つ潰していくことをお勧めします。

対処法がまるで逆になってます。
IDEとかLinuxとかデバッガとかそんなの関係ありません。

strstrがエラーになるのなら、そのエラーの原因を探るのが本筋でしょう。
それを、まったく目的の違うstrchrを使ったって上手く動作するはずがありません。

例えるなら、「printfで表示が乱れたので、scanfにしたら、まったく表示されなくなりました」ってくらい、おかしな対処法です。


他にも
> sprintf(buff, "%s%s\\",dirpath,entry->d_name);

bufの型は?初期化とか領域確保とかしてますか?
それが出来てたら

> if...続きを読む

QC言語で乱数がうまく効きません。下記のソースでコンパイルして実行すると

C言語で乱数がうまく効きません。下記のソースでコンパイルして実行すると結果が130固定となってしまいます。

#include <stdio.h>
#include <stdlib.h>

int main(void){
int x;
x = rand();
printf("%d",x);
return 0;
}

使っているコンパイラはBorland C++ 5.5.1です。何か間違いでもあるのでしょうか?よろしくお願いします。

Aベストアンサー

コンピュータが出す「乱数」は正確には「疑似乱数」と呼ばれるもので、一見ばらばらの数値に見えますが、実際は一定の法則で計算して出した値です。
疑似乱数には「種」と呼ばれる初期値があって、この種から乱数を発生→その乱数を元に次の種を作る→その種を元に次の乱数を発生→....というようにしていきます。
計算式は一定なので、種が同じなら、同じ乱数が同じ順番で出てきます。

さて、あなたのプログラムですが、種を設定するsrand関数を使っていません。
Cのrand関数では、srandで設定しない場合、種として特定の値が使われます。
種が特定の同じ値なので、それから発生させた乱数も同じ乱数列になります。

種はsrand関数を使って設定します。
常套手段としては、time関数を使って現在時刻(を表す値)を種にするものです。

参考URL:http://www001.upp.so-net.ne.jp/isaku/rand.html

QC言語 動的なメモリの確保 コンパイル時エラーも警告もないのに実行できない

配列A[3]を{2, 4, 6}と初期化させ、malloc関数を使いメモリを確保しそこへ先程の配列Aの要素を記憶させ、ポインタ*Nを使い確保したメモリの要素を表示するプログラムです。

*********************************************
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  int A[3] = {2, 4, 6};
  int i;
  int *N;

  N = (int *) malloc (3);

  for(i = 0; i < 3; i++){
    N[i]= A[i];
  }

  for(i = 0; i < 3; i++){
    printf("%d", N[i]);
  }

  free(N);

  return 0;
}
*********************************************

VCを使いF10のデバッグテストでは正常に動くのですが、コマンドラインからではエラー報告画面がでます。なぜなのでしょうか?

配列A[3]を{2, 4, 6}と初期化させ、malloc関数を使いメモリを確保しそこへ先程の配列Aの要素を記憶させ、ポインタ*Nを使い確保したメモリの要素を表示するプログラムです。

*********************************************
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  int A[3] = {2, 4, 6};
  int i;
  int *N;

  N = (int *) malloc (3);

  for(i = 0; i < 3; i++){
    N[i]= A[i];
  }

  for(i = 0; i < 3; i++){
    printf("%d", N[i]);
 ...続きを読む

Aベストアンサー

malloc(3)とは、3バイト確保するという意味です。
しかしint型は4バイトあるため実行時にエラーになります。
正しくは、malloc(sizeof(int)*3)です。

QC言語 コンパイルできるが実行するとエラー

非負の数字を入力してもらい表示させ、数字以外を入力した場合は終了するプログラムです↓(VC使用)
━━━━━━━━━━━━━━━━━━━━━━━━━━
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h> /* atoi使用 */
#include <ctype.h> /* isdigit使用 */

int main(void)
{
  char cx;
  int nx;

  printf("非負の整数を入力してください。:");
  scanf("%s", cx);

  if(isdigit(cx) == 0){
    printf("数字を入れてください。\n");
  }else{
    nx = atoi((const char*) cx);
  }

  printf("%d", nx);

  return 0;
}
━━━━━━━━━━━━━━━━━━━━━━━━━━

実行し文字を入力するとDebug Error!と小窓がでます。どこがおかしいのでしょうか?

非負の数字を入力してもらい表示させ、数字以外を入力した場合は終了するプログラムです↓(VC使用)
━━━━━━━━━━━━━━━━━━━━━━━━━━
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h> /* atoi使用 */
#include <ctype.h> /* isdigit使用 */

int main(void)
{
  char cx;
  int nx;

  printf("非負の整数を入力してください。:");
  scanf("%s", cx);

  if(isdigit(cx) == 0){
    printf("数字を入れてください。\n");
  }else{
    nx = atoi((const char*...続きを読む

Aベストアンサー

コンパイルすると警告が出るはずですが、それは確認しましたか?
原因はずばりその表示されているはずの警告文の通りです。

ヒント:変数cxに注目

QC言語をコンパイルしたいのですが、無料のコンパイル環境はありますか?

学校で、C言語習いました。
課題で出されたレポートの動作確認をしたいのですが、コンパイル環境がありません。
学校に行けばコンパイルできるのですが、エラーが出たら持ち帰り家で考える→再度学校で実行→以下続く
をしていたら時間がかかってしょうがありません。

フリーのコンパイル環境はあるのでしょうか?
あれば入手方法を教えてください。(PC環境はWindowsXPです。)
もちろん、違法入手ではなくて安全なものを探しています。
ない場合は、どのくらいの値段で売っているものなのでしょうか?

検索してよく見かけるのは、『Borland C++Compiler 5.5 』なのですが、Windows2000(!?)までしか対応しておらず、現在はサイトが停止(!?よくわからないのですが、DL不可)していたので入手できませんでした。

入手方法を知りたいのはもちろんなのですが、Cファイルを作成して実行する方法など、短くても簡単でもよいので合わせて使い方を教えていただければ嬉しいです。

あと、素人質問で申し訳ないのですが、C言語のコンパイラでC++やその他の言語のコンパイルはできますか?(その逆もできますか?)

学校で、C言語習いました。
課題で出されたレポートの動作確認をしたいのですが、コンパイル環境がありません。
学校に行けばコンパイルできるのですが、エラーが出たら持ち帰り家で考える→再度学校で実行→以下続く
をしていたら時間がかかってしょうがありません。

フリーのコンパイル環境はあるのでしょうか?
あれば入手方法を教えてください。(PC環境はWindowsXPです。)
もちろん、違法入手ではなくて安全なものを探しています。
ない場合は、どのくらいの値段で売っているものなのでしょうか?

...続きを読む

Aベストアンサー

Visual C++ Express Edition ダウンロード~Cプログラムをビルド&トレース実行するまでの簡単な説明。
http://www.asahi-net.or.jp/~qb3k-kwsk/rpg/program/tool/vsee/vsee.html

それでも分からなければVisual C++ Express Edition のCD-ROMが添付している冊子
「図解でわかるVisual C++ 2005 Express Edition 」
出版社: ソフトバンク クリエイティブ (2007/2/1)
ISBN-10: 4797336811
ISBN-13: 978-4797336818

学生ならアカデミックエディションが買えるでしょ。
製品版「Visual Studio 2005 Academic Edition」は5千円位。


このカテゴリの人気Q&Aランキング

おすすめ情報