246riserのプロフィール

@246riser 246riser
ありがとう数12
質問数16
回答数7
ベストアンサー数
2
ベストアンサー率
50%
お礼率
83%

  • 登録日2008/09/27
  • C言語の基礎 . 2乗値の差について

    ---------------------------------------------------------------- /*二つの整数の二乗の差を求める*/ #include<stdio.h> /*二乗値を返す*/ int sqr(int x) { return (x*x); } /*--------差を返す-------*/ int diff(int x, int y) { return (x>y? x-y : y-x); } int main(void) { int kx,ky,kx2,ky2; printf("二つの整数を入力してください"); printf("整数kx:"); scanf("%d", &kx); printf("整数ky:"); scanf("%d", &ky); kx2 =sqr(kx); /* kxの二乗*/ ky2 =sqr(ky); /*kyの二乗*/ printf("kxの二乗とkyの二乗の差は%dです。\n", diff(kx2,ky2)); return 0; } 教えてください! 上のプログラミングの部分的にわからないです。 (1)最初の int sqr(int x)というのはどういう風に読めばいいのでしょうか? sqrというのはintのようにきめられた語ですか??? あとどうしてカッコの中にint xというのが入ってるのでしょうか。 今まではint iとか int noとかしてあったのですが、急に難しくなりました >_< (2)そのあと、{}の中は return (x*x)となっています。 これはxかけるxだと思いますが、良く分かってません。 コンパイルして実行した後は、プログラムを上から読むと習ったのですが、 そうすると意味はどうなるのでしょうか? (3)ここは多分重要なんだと思います int diff(int x,int y) return (x>y ? x-y : y-x); ここも多分条件だと思います。もしxがyより大きければ、 そのあとの?の意味を教えてください。 あとx-y:y-xの間の:意味はなんでしょうか?? どうしても今まで単純にfor(i=2;i<no;i++)という単純な式だったのですが 関数の項目になった途端に難しくなりました。。上はiは二からスタートで noまで行い、iの値は一つずつ増加していくです。 (4) in main (void)の下の分は大体OKです。(scanf)まで。 Kx2=sqr(kx); ky2=sqr(ky);とありますが、int main(void)の中で int kx,ky,kx2,ky2と 4つの箱を作ったとイメージしてます。 その中で、整数kxの値を実行した際に数字を入力したとします。 たとえば10.そうした場合scanfの分が &kxとなってますので kxに読み込みにいけという命令文になると思います。 では10の値をkxにいれたとして、 なぜkx2=sqr(kx);なのでしょう? sqr(kx)ってなんですか? 一番最初に作成した int sqr(int x)の部分に関連してますか? 先ほど10と入力したものは"kx"の箱の中には入ってると思いますので kx2=sqr(10)とは多分ならないと思ったのですが。。。 ごめんなさい、良く分かってないです、ただ、関数を最初に作成して diff(kx2,ky2)で読み込みに行ってるようには何となく本を読んで 理解してるのですが、まだよくわかってません。 どなたか、このプログラムの読み方を教えてください、お願いします!

  • プログラムの内容

    以下のプログラムは答えとして渡されたものなんですが、 コマンド引数を使ったプログラムの流れがよくわかりません。 簡単に解説してくれる方、いませんか? #include <stdio.h> int leapyear(int year){ if(year%400 == 0) return 1; else if(year%4 == 0 && year%100 != 0) return 1; else return 0; } void addmonth(int *day, int *month, int *year){ *day = 1; (*month)++; if(*month > 12) { *month = 1; (*year)++; } } int main(int argc, char *argv[]){ int year, month, day, a=0, max_days; int month_days[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; if(argc < 2) max_days = 10000; else max_days = atoi(argv[1]); printf("今日は西暦何年 何月 何日? "); scanf("%d%d%d",&year,&month,&day); while(a<max_days) { a++; day++; if(month == 2 && leapyear(year)) { if(day > 29) addmonth(&day, &month, &year); } else { if(day > month_days[month-1]) addmonth(&day, &month, &year); } } printf("今日から%d日後は、%d年%d月%d日です。",max_days, year, month, day); }

  • c言語のワーニングを無くしたい

    c言語のダブルポインタ(char **)の引数渡しで困っています。 ワーニングが取れず、無視して実行するとセグメンテーション違反 となります。 ワーニングを取る方法をご存じないでしょうか? もしくは言語仕様、gcc仕様が要因でしょうか? バージョンはgcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-44)です。 001 void func(char **p1) 002 { 003 static char *s="AAA"; 004 **p1 = s; 005 } 006 int main(void) 007 { 008 char *q1; 009 func(&q1); 010 return(0); 011 } $ cc -Wall -o pp pp.c pp.c: In function ‘func’: pp.c:5: 警告: assignment makes integer from pointer without a cast 実行すると004行目で 'セグメンテーション違反です (core dumped)'となります。 004行目を *p1 = s; にするとワーニング無しとなり、 問題無くcall側のq1に先頭アドレスがセットされますが、 何か納得がいきません。 ちなみに、最初のcore吐きプログラムのアセンブルリストは 以下のようになります。 (*)位置で変なコードとなっていまが、ワーニングが出て いるので当然なのかもしれません。 (gdb) disass Dump of assembler code for function func: 0x08048354 <func+0>: push %ebp 0x08048355 <func+1>: mov %esp,%ebp 0x08048357 <func+3>: mov 0x8(%ebp),%eax 0x0804835a <func+6>: mov (%eax),%edx 0x0804835c <func+8>: mov 0x8049560,%eax *0x08048361 <func+13>: mov %al,(%edx) 0x08048363 <func+15>: pop %ebp 0x08048364 <func+16>: ret End of assembler dump. そして 004行目を *p1 = s;にした場合が以下となります。 想定通りのコードですが、何故なのかわかりません。 Dump of assembler code for function func: 0x08048354 <func+0>: push %ebp 0x08048355 <func+1>: mov %esp,%ebp 0x08048357 <func+3>: mov 0x8049560,%edx 0x0804835d <func+9>: mov 0x8(%ebp),%eax 0x08048360 <func+12>: mov %edx,(%eax) 0x08048362 <func+14>: pop %ebp 0x08048363 <func+15>: ret End of assembler dump.

  • 本当に分からないので教えてください3

    問題5 ○×ゲームを作成せよ。 <実行結果> PLAYER1(○) 行:2 列:3 ・・・ ・・○ ・・・ PLAYER2(×) 行:2 列:2 ・・・ ・×○ ・・・ PLAYER1(○) 行:1 列:3 ・・○ ・×○ ・・・ PLAYER2(×) 行:3 列:3 ・・○ ・×○ ・・× PLAYER1(○) 行:1 列:3 入力し直してください。 PLAYER1(○) 行:1 列:2 ・○○ ・×○ ・・× PLAYER2(×) 行:5 列:5 入力し直してください。 PLAYER2(×) 行:3 列:2 ・○○ ・×○ ・×× PLAYER1(○) 行:2 列:1 ・○○ ○×○ ・×× PLAYER2(×) 行:3 列:1 ・○○ ○×○ ××× PLAYER2の勝ちです。 <実行結果> PLAYER1(○) 行:2 列:2 ・・・ ・○・ ・・・ PLAYER2(×) 行:1 列:1 ×・・ ・○・ ・・・ PLAYER1(○) 行:2 列:1 ×・・ ○○・ ・・・ PLAYER2(×) 行:2 列:3 ×・・ ○○× ・・・ PLAYER1(○) 行:1 列:3 ×・○ ○○× ・・・ PLAYER2(×) 行:3 列:1 ×・○ ○○× ×・・ PLAYER1(○) 行:1 列:2 ×○○ ○○× ×・・ PLAYER2(×) 行:3 列:2 ×○○ ○○× ××・ PLAYER1(○) 行:3 列:3 ×○○ ○○× ××○ 引き分けです。

  • C言語のエラーが無くなりません

    はじめまして。 現在C言語でプログラムを組んでいるのですが、不明な点がありますので質問させて頂きます。 while文とかif文を使って、プログラムを書き終える時に当然いくつかの「}」を使って締めます。そのとき、「}」が自動でだんだん左寄せになってくのですが、自動で左寄せにならない場合、原因は何でしょうか。 以上です。何卒ご教授の方よろしくお願いいたします。

    • ベストアンサー
    • noname#142623
    • C・C++・C#
    • 回答数7