• ベストアンサー

このプログラム見てもらえませんか??

#include <stdio.h> int main(void) { int a=1, b=2, c=3, d=4, e=5; int *pb, *pd; int tmp; printf("values = %d %d %d %d %d\n",a,b,c,d,e); pb = &b; printf("*pb = %d, pb = %x\n",*pb,pb); pd = &d; printf("*pd = %d, pd = %x\n",*pd,pd); printf("Before : a=%d, b=%d, c=%d, d=%d, e=%d\n",a,b,c,d,e); tmp = *pd; *pd = *pb; *pb = tmp; printf("After : a=%d, b=%d, c=%d, d=%d, e=%d\n",a,b,c,d,e); return 0; } 現在プログラミングについて勉強中の者です。このプログラムの意味はなんとなく理解はできるのですが、実際のところプログラムがどうゆう風に組まれているか(仕組みや流れみたいなもの)?一つ一つがどうゆう意味を成しているのかがあまりわかりません。よければ、下のようにコメントつきで説明のほどよろしくお願いできないでしょうか?? strLen = strlen(src); /* 入力文字列の長さ*/ strcpy(wkStr ,src); /* 入力文字列の退避*/ desCnt = strLen-1; for(srcCnt=0;srcCnt<strLen ;srcCnt++) /*入力文字の最初から最後まで1文字ずつ拾う*/ ご鞭撻のほどよろしくお願いします。。

質問者が選んだベストアンサー

  • ベストアンサー
  • smzdai
  • ベストアンサー率40% (2/5)
回答No.2

/*ポインタはメモリ上のアドレスを格納します /*まずはその前提をしっかり理解して下さい。*/ #include <stdio.h> /* スタンダード入出力ライブラリの読込*/ int main(void) { int a=1, b=2, c=3, d=4, e=5; /* 変数 */ int *pb, *pd; /* ポインタ変数 */ int tmp; /* 一時変数 */ printf("values = %d %d %d %d %d\n",a,b,c,d,e); /* 「values = 1 2 3 4 5」と出力 */ pb = &b; /* &bは変数bのポインタ(メモリ上のアドレス /* これをポインタ変数pbに代入 */ printf("*pb = %d, pb = %x\n",*pb,pb); /*「*pb = 2, pb = xxxxxx」と出力。xxxxxxは /* メモリ上に保存されたポインタの実アドレスが /* 出てくる(16進数表記)*/ pd = &d; /* &dは変数dのアドレス(すなわちポインタ /* これをポインタ変数pdに代入 */ printf("*pd = %d, pd = %x\n",*pd,pd); /* 「*pd = 4, pd = yyyyyy」と出力。 /* yyyyyyはメモリ上に保存されたポインタの /* 実アドレスが出てくる(16進数表記) */ printf("Before : a=%d, b=%d, c=%d, d=%d, e=%d\n",a,b,c,d,e); /* 「Before : a=1, b=2, c=3, d=4, e=5」と出力*/ /***** 以下はbとdの値を入れ替える処理 *****/ tmp = *pd; /* *pdはポインタの指す先(変数dのことね)の /* 値を示す=つまりは4、これをtmpに代入 */ *pd = *pb; /* *pbはポインタの指す先(変数bのことね)の /* 値を示す=つまりは2、これを*pdに代入。 /* pdはdを指しているので、この代入でdの値が /* 2になる */ *pb = tmp; /* tmpの値すなわち4を*pbに代入。pbはbを指して /* いるので、この代入でbの値が4になる */ printf("After : a=%d, b=%d, c=%d, d=%d, e=%d\n",a,b,c,d,e); /* 「After : a=1, b=4, c=3, d=2, e=5」と出力*/ return 0; }

spider1984
質問者

お礼

とても分かりやすい解説ありがとうございます!!

その他の回答 (1)

  • DIGAMMA
  • ベストアンサー率44% (620/1404)
回答No.1

おはよう 大学・専門学校、もしくは企業の新人教育において、ポインタの使い方を説明するためのサンプルプログラムかと思います。 ・5つの値を表示し、 ・bとdの格納アドレスとその内容を表示し、 ・ポインタを使って両者を入れ替える前と、後の状態を確かめる。 といった主旨でしょう。 ポインタとかアドレスとかが良くわからないなら、手元にある本で学ぶのではなく、それが自分にとって良くわかる書き方をしている本を探しに、本屋さんへ直行しましょう。

spider1984
質問者

お礼

どうもありがとうございます!!

関連するQ&A

  • ポインタを使ったソートプログラム

    #include<stdio.h> void swap(double *a,double *b) { double tmp; tmp=*a; *a=*b; *b=tmp; } void sort3d(double *pa,double *pb,double *pc) { if(*pa>*pb) { swap(pa,pb); } if(*pb>*pc) { swap(pb,pc); } if(*pa>*pc) { swap(pa,pc); } } int main(void) { double num1=3.14; double num2=2.97; double num3=0.01; sort3d(&num1,&num2,&num3); printf("d1の値=%.3d\n",num1); printf("d2の値=%.3d\n",num2); printf("d3の値=%.3d\n",num3); return 0; } ポインタを使ったソートプログラムを作ってみました。 ところが、コマンドプロンプトを使って動作させたら、 結果がうまく表示されませんでした。 どこがおかしいのか指摘していただけると嬉しいです。

  • プログラムが動きません

    一昨日教えていただいた入力された文字を13ずつずらして表示する暗号化プログラム(文字列は一行最大80文字、10行分の入力を受け付けたら終了)、がまだ動きません(下記のプログラム)。エラーにはならないのですが、何も表示されませんが10回入力すると終了はするが、何も表示がされません。どういうプログラムならよいのかもう一度どなたかお教え下さらないでしょうか? #include <stdio.h> #include <stdlib.h> #include <ctype.h> char e[81]; int anngou (int c, char b[81]) { if(b[c] >= 'a' && b[c] <= 'z') { if(b[c] >= 'a' && b[c] <= 'm') { e[c] = b[c] + 13; } else { e[c] = b[c] - 13; } } else { if(b[c] >= 'A' && b[c] <= 'Z') { if(b[c] >= 'A' && b[c] <= 'M') { e[c] = b[c] + 13; }else{ e[c] = b[c] - 13; } } } return e[c]; } int main(void) { int a, c, d; char b[81]; a = c = 0; while (a <= 9) { printf("Input some words: "); fgets(b, 81, stdin); for (c = 0; c <= 81; c++) { if (b[c] == '\0') { d = c; break; } } c = 0; while (c >= d) { anngou(c,b); printf("%c", e[c]); c++; } printf("\n"); a++; } exit(0); }

  • プログラムがうまくいきません。教えてください。

    プログラムがうまくいきません。教えてください。 #include <stdio.h> int main(void){ int a, b, c, d, f; printf("国語="); scanf("%d", &a); printf("算数="); scanf("%d", &b); printf("理科="); scanf("%d", &c); printf("社会="); scanf("%d", &d); f = ((a>90)?1:0)+((b>90)?1:0)+((c>90)?1:0)+((d>90)?1:0); printf("\n合計[%d],平均[%.2f]\n",(a+b+c+d),((double)(a+b+c+d)/4.0)); printf("国語[%d],[%.3f%%],[%d]\n",a,((double)a/1.5),((a>90)?1:0)); printf("算数[%d],[%.3f%%],[%d]\n",b,((double)b/1.5),((b>90)?1:0)); printf("理科[%d],[%.3f%%],[%d]\n",c,((double)c/1.5),((c>90)?1:0)); printf("社会[%d],[%.3f%%],[%d]\n",d,((double)d/1.5),((d>90)?1:0)); printf("総合判定[%d],\n", ((f>=3)?1:0)); return (0); } と入力したのですが、実行結果の国語から社会までの[]部分を上下揃えたいのですが揃いません。このプログラムにどのようなことを追加すれば揃えることができますか?教えてください!

  • プログラムについて

    2進数を文字としてgets()関数を使って入力し,入力された値と宣言している変数(初期値は0)とのビット演算和を取り,2進数に変換し直すという3つの動作を繰り返すプログラムを作成しようとしています。 現在は,現在は最後の出力の部分が前回演算和した値が反映されずに出力してしまうのでこまっています。現在作成しているプログラムを添付します。ここを直したほうがよい,または,このプログラムの方がよいのではと思う方は返信願います。 int main(void) { char a[100],e[100]; int len,k,p,g; int c=0,d; int nisin[16]; int i; printf("2進数を入力:"); gets(a); while(a[1]!=0){ len=strlen(a); for(k=0;k<=len-1;k++){ e[k]=(a[k]-'0')<<(len-(k+1)); } g=0; for(p=0;p<=len-1;p++){ g+=e[p]; } printf("10進数は:%d\n",g); c|=g;/**/ printf("演算和:"); /*変換*/ for(i=0; i<16; i++){ nisin[i] = c % 2; c = c / 2; } /*出力*/ for(i=16-1; i>=0; i--){ printf("%d",nisin[i]); } printf("\n"); printf("2進数を入力:"); gets(a); } return 0; }

  • 長方形、円、三角形の計算するプログラムでエラーがでます

    タイトルの通りなんですがエラーがでます>< コンパイラはできたのですが、実行して二つ目の入力するとこで、入力したあと止まります。 どこがおかしいのでしょうか? #include <stdio.h> int sikaku(void); int en(void); int main(void) { char ch; int a,b; printf("円(A) 長方形(B) 三角形(C)\n"); printf("入力してください:"); ch = getche(); if(ch == 'C'){ printf("\n底辺を入力してください:"); scanf("%d ",a); printf("高さを入力してください:\n"); scanf("%d",b); printf("%dです",a * b); } else if(ch == 'B') sikaku(); else if(ch == 'A') en(); return 0; } int en(void) { int a; float f; printf("\n半径を入力してください:"); scanf("%d",a); printf("円周率を入力してください:"); scanf("%f",f); printf("%fです",a * a * f); return 0; } int sikaku(void) { int a,b; printf("\n縦を入力してください:"); scanf("%d",a); printf("横を入力してくさい:\n"); scanf("%d",b); printf("dです",a * b); return 0; }

  • 整数を3つ読み込み、一番大きいものを表示するプログラム

    3つが違う数であるとしてこうしたんですが、 #include<stdio.h> int main() {int a,b,c; scanf("%d",&a); scanf("%d",&b); scanf("%d",&c); if(a>b && a>c){ printf("%d\n",a);} if(b>a && b>c){ printf("%d\n",b); if(c>a && c>b){ printf("%d\n",c); }}return 0;} で、コンパイルはできたんですが、実行できません。3つの数値を入力してもその一番大きい数が出てきません。ifの条件は間違ってはいないと思うんですがやはり、最大が2つあるときのことを考えないとできませんか?

  • 分割コンパイルについて

    現在分割コンパイルが分からずに苦戦しています。 下記のリストは構造体を使わなければコンパイラを通すことができましたが、 使うとなぜか通りません。 あれこれ試しましたがどうしても分かりません。 何がおかしいのでしょうか? *define.hで全てのファイルへの定義や宣言を行わせています。 ////////////// //Main.cpp ////////////// #include <stdio.h> #include <conio.h> #include "define.h" int main( void ){ Tmp[0].c = 15; printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); aaa(); bbb(); getch(); return 0; } ////////////////// // A.cpp ///////////////// #include <stdio.h> #include "define.h" void aaa( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // B.cpp ///////////////// #include <stdio.h> #include "define.h" void bbb( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // define.cpp ///////////////// #include "define.h" int a = 10; int b = 20; struct Parameter { int c; }; struct Parameter Tmp[NUM]; ////////////////// // define.h ///////////////// #define NUM 100 extern int a; extern int b; extern struct Parameter Tmp[NUM]; void aaa( void ); void bbb( void );

  • このプログラムみてもらえますか?

    課題は標準入力から正整数aを読み込み、aが素数であるか否か判定するプログラムを作れ、です。 #include <stdio.h> int main(void) { int a,b,c; for(;;){ printf("正整数を入力して下さい。\n"); scanf("%d",&a); c=a%b; for(b=2;b=a-1;b=b+1){ if(c==0) printf("素数でない。\n"); break; } printf("素数です。\n"); break; return(0); } } コンパイルはできますが、実行すると9が「素数です」と表示されます^^; よろしくおねがいします。

  • このプログラム見てほしいです!!

    #include <stdio.h> int gcd2(int a, int b) { if (!b) return a; return gcd2(b, a%b); } int main() { int a, b, c; printf("2つの任意の整数を入力せよ:"); scanf("%d %d",&a,&b); c=gcd2(a,b); printf("最小公倍数は%d\n",a*b/c); printf("最大公約数は%d\n",c); return 0; } で、最小公約数を出すことはできたのですが、全ての公約数を表示させたいんです!!どうやったらいいのでしょうか??プログラミングまだ初心者なので、ちょっと行き詰ってしまいました。。。 お時間があればでいいのですが、もう一つわからないプログラムがあります。 自然数nを入力し、x^2+y^2=z^2 (x<y)を満たすようなn以下の自然数の組(x,y,z)がいくつあるのかを出力するプログラムなのですが、全くわからず行き詰っています。。どなたかお時間があれば教えて頂きたいです。 色々と申し訳ありません。お願いします(__)

  • 外積のプログラムについて質問があります

    ベクトルの外積のプログラムについて質問があります 環境はリナックスです 問題は2つの実ベクトルa,bをキーボードから入力しその外積を求めるプログラムです i<jである組み合わせに対してai*bj-aj*biを並べたものです 次元nについてはキーボードから入力します wedge内で外積を求める計算をします #include <stdio.h> int *wedge(int *a, int *b, int *c); int main() { int n; int a[100]; int b[100]; int i; int j; printf(" nの値を入力" ); scanf("%d", &n); for(i = 0; i < n; i++){ scanf("%d",&a[i]); } for(i = 0; i < n; i++){ scanf("%d",&b[i]); } for(i = 0; i < n; i++){ printf("a[%d]=%d\n",i, a[i]); } for(i = 0; i < n; i++){ printf("b[%d]=%d\n",i, b[i]); } } int *wedge(int *a, int *b, int *c) { int i; int j; *c = a[i] * b[j] - a[j] * b[i]; if ( i < j ){ *c = a[i] * b[j] - a[j] * b[i]; } else { *c = 0 ; } printf("*c = %d",a[i] * b[j] - a[j] * b[i]); } このようなプログラムを作ったのですが外積を表示させることができません。 修正したプログラムをおしえていただけないでしょうか