• 締切済み

質問です

構造体のプログラムで、 #include<stdio.h> struct example{ char str[4]; /* 文字列 */ int num; /* 番号 */ }; int main() { struct example data[5]; /* 全て0で初期化されているとする */ struct example *ps; ps = &data[2]; ps->str[3]='A'; /* (1)この処理でどこが書き変わるか? */ ps += 2; (*ps).num = 15; /* (2)この処理でどこが書き変わるか? */ ps -= 4; ps->str[0] = 'z'; /* (3)この処理でどこが書き変わるか? */ } と、いうものがあるのですが、質問が、「上のようなプログラムのような処理を行った場合に、ポインタ変数psの中身はその時点でどのようになるか。 構造体変数data[]のアドレスは0x1000、0x1000、0x1010、0x1018、0x1020であるとする。」 という問題で、それぞれ、printf文を使ってpsの変化を実際に見てみればよいと思ったのですが、問題文の意図がよく分からないことと、仮にprintf文を入れた場合、どこにどのような中身で入れたら良いのか教えて欲しいと思っています。 お願いします。

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.7

★もう24日ですが、締め切られていないので私のアドバイス(解説)を追加します。 ・まず最初に回答者 No.2、No.3 さんのご指摘どおり質問のアドレスがおかしいです。  その後に質問者 No.4 さんの通りに2番目の構造体アドレスが 0x1008 ならば  納得します。→入力のタイプミスですね。 ・ここで問題をもう一度整理します。 正しい質問: ・上記の構造体変数 data[] のアドレスが 0x1000、0x1008、0x1010、0x1018、0x1020 としたとき  ps というポインタで変更した箇所がどこなのかを printf 文で確認して見たい。 ・ということですよね。 最初に: ・まずは構造体変数 data を初期化しましょう。質問者さんはコメントでは『0で初期化されている』  と記述していますが、回答者 No.4 さんの『回答へのお礼』で恐らくは初期化していません。 ・そこで、宣言を『static struct example data[5];』という風にします。→『static』で 0 に初期化される ・私は printf 文をどこに入れて確認すればよいかの回答はしません。 ・メモリ・イメージだけで解説します。 解析: (1)ps = &data[2]; [0x1010]{[\0][\0][\0][\0],0}{[\0][\0][\0][\0],0}『[\0][\0][\0][\0],0』{[\0][\0][\0][\0],0}{[\0][\0][\0][\0],0} (2)ps->str[3]='A'; [0x1010]{[\0][\0][\0][\0],0}{[\0][\0][\0][\0],0}『[\0][\0][\0][A ],0』{[\0][\0][\0][\0],0}{[\0][\0][\0][\0],0}←(1)の時点                                                      ↑ (3)ps += 2;     [0x1020]{[\0][\0][\0][\0],0}{[\0][\0][\0][\0],0}{[\0][\0][\0][A ],0}{[\0][\0][\0][\0],0}『[\0][\0][\0][\0],0』 (4)(*ps).num = 15; [0x1020]{[\0][\0][\0][\0],0}{[\0][\0][\0][\0],0}{[\0][\0][\0][A ],0}{[\0][\0][\0][\0],0}『[\0][\0][\0][\0],15』←(2)の時点                                                                                   ↑ (5)ps -= 4;     [0x1000]『[\0][\0][\0][\0],0』{[\0][\0][\0][\0],0}{[\0][\0][\0][A ],0}{[\0][\0][\0][\0],0}{[\0][\0][\0][\0],15} (6)ps->str[0]='z'; [0x1000]『[z ][\0][\0][\0],0』{[\0][\0][\0][\0],0}{[\0][\0][\0][A ],0}{[\0][\0][\0][\0],0}{[\0][\0][\0][\0],15}←(3)の時点                   ↑ 解説: ・上記の{}で囲った部分が、1つの構造体データを表します。 ・上記の『』で囲った部分が、ポインタ(ps)の位置を表します。 ・上記の[]で囲った部分が、ポインタ(ps)のアドレスを表します。 ・上記の矢印が変更された部分を表します。→画面の解像度からずれるかも。注意。 ・『(*ps).num』という指定は『ps->num』と同じ動作になります。→記述の違いだけです。 最後に: ・画面の関係上で折り返されていたらごめんなさい。 ・過去に似たような質問がありました。 ・http://oshiete1.goo.ne.jp/qa2627072.html→『ポインタの基礎について』回答者 No.4 ・こちらも参考にして下さい。 ・以上。おわり。→何か感想をお願いします。場合によってはまた回答しますよ。

  • yonfa
  • ベストアンサー率52% (22/42)
回答No.6

基本的なところからの理解が必要ということですね。 方眼用紙を用意してください。(方眼用紙って古いか…、エクセルシートでかまいません) 横8マス、縦5マスの大きさに切ってください。 左上のマスを起点として、横書きの方向で0から39まで順に数字で埋めてください。 それぞれのマスにいろいろな色を付けてください。 一応、メモリマップのつもりです。 マスがメモリを表します。1マスで1バイトです。 数字がメモリを識別するためのアドレスです。 色はメモリに格納された値を意味します。 「上から3段目、左から4番目のマスを赤色で塗りました、そのマスに書いてある数字は何ですか?」 というのが(1)の質問内容です。 > 「(1)アドレス0x1008の値が2293584に書き換わる > (2)アドレス0x1018の値が2293600に書き換わる > (3)アドレス0x1020の値が2293568に書き換わる」 psの値が3つありますが、それぞれから 2293568 を引いて見てください。 方眼の1段は、struct example 1レコードを意味します。 char str[4]; のサイズは4バイトです。 int num; のサイズは4バイトです。(とする) 左上マスのアドレスは 0x1000 ということになります。 念のために補足しておきます。 0x1000 は16進数です、10進数に直すと 4096 です。 C言語では、配列の添え字は0から始まります。 これで、理解してもらえるといいのですが…。 以下、独り言です。 (2)はエンディアンの問題があって、2通りの答えが考えられますねぇ。 課題を出した人は、そこまで考慮しているのやら…。

  • Interest
  • ベストアンサー率31% (207/659)
回答No.5

ANo.2 = Interest です。 > > 構造体変数data[]のアドレスは0x1000、0x1000、0x1010、0x1018、0x1020であるとする。 > の部分についてですが、多分2番目は「0x1008」の間違いと思われます。 これならわかります。 > 答えとして、 > 「(1)アドレス0x1008の値が2293584に書き換わる > (2)アドレス0x1018の値が2293600に書き換わる > (3)アドレス0x1020の値が2293568に書き換わる」 > は合っていますか?? 違います。出題者はそういうことを聞きたかったんじゃなくて、「ポインタってなんなの?どういう仕事をするかわかる?」と聞きたかったんだと思いますよ。 ポインタのイメージは、「仮につけられた名前」のようなものです。 例えば。 0番目の人:xiamei723さん 1番目の人:yonfaさん 2番目の人:Interestさん 3番目の人:nerosukeさん として、Aさん(誰かを指し示す)というポインタを作ったとします。 >ps = &data[2]; Aさん=2番目の人; として >ps->str[3]='A'; /* (1)この処理でどこが書き変わるか? */ Aさんはアホだ。 といった場合、誰がアホでしょうか? と聞いてるわけです。 ポインタを進める/戻すということは、Aさんの次の人/前の人ってことですね。 「アドレス0x1013の値が書き換わる」は、わかっている人には伝わると思いますが、構造体の配列がどのようにメモリに割付けられるかイメージできないと誤解を生みそうです。(アドレスが書き換えられるんじゃなくて、アドレスに格納されている値が書き換えらえるんです。) 0x1000 : data[0] 0x1008 : data[1] 0x1010 : data[2] (以下省略) > ps = &data[2]; > ps->str[3]='A'; なので、0x1010 + 3 のアドレスに 'A' が入った。これが 「アドレス0x1013の(に格納されている)値が書き換わる」 という意味です。

  • yonfa
  • ベストアンサー率52% (22/42)
回答No.4

> 答えが数値でも良いのでしょうか? ポインタ変<数>はメモリ上のアドレスを示すものですので、数値となります。 > 構造体変数data[]のアドレスは0x1000、0x1000、0x1010、0x1018、0x1020であるとする。 の部分についてですが、多分2番目は「0x1008」の間違いと思われます。 「~であるとする」というのは、あくまでも仮定の話なので、実際にプログラムを作成して実行すると、実行するたびに異なる値となるはずです。 実際に実行してみて、変数psの値はどうだったでしょうか? 絶対値は大きな数値になったと思いますが、変動の差分を追ってみるとなんとなく法則みたいなものが見えるのではないでしょうか? 求められる回答としては、ps への代入が行われた後の ps の値を「0x1000、…」から選択してあげればよいと思います。 たぶん、(1)の答えは、「アドレス0x1013の値が書き換わる」というような感じになるのではないでしょうか。

xiamei723
質問者

お礼

ありがとうございます。 間違ってたらすみません。 答えとして、 「(1)アドレス0x1008の値が2293584に書き換わる (2)アドレス0x1018の値が2293600に書き換わる (3)アドレス0x1020の値が2293568に書き換わる」 は合っていますか??

  • nerosuke
  • ベストアンサー率33% (39/115)
回答No.3

>構造体変数data[]のアドレスは0x1000、0x1000、0x1010、0x1018、0x1020であるとする。 これは明らかにおかしいですね。 理由はNo2さんが回答している通りです。 でも、とりあえずprintfで出力してみれば、わかるんじゃないですか? とりあえず、構造体の配列を0で初期化します。 <初期化例> memset(&data[0], 0, sizeof(struct example)*5); 単純に全てに0を代入してもいいです。 これは前提じゃなくてちゃんと実装しないと、不具合がでますよ 最後に構造体の内容を表示すればどの構造体に値が反映されているか わかります。 それで影響のあったところを纏めればお終いです。  for(i=0; i<5; i++){   printf("data[%d] >> ",i);   //ちなみに1文字づつ出力しているのは、0クリアされているからですよ。   for(j=0; j<4; j++){    printf(" str[%d]==%c", j,data[i].str[j] );   }    printf(" num==%d\n",data[i].num);  }

  • Interest
  • ベストアンサー率31% (207/659)
回答No.2

これは printf で表示させてもダメかな。 というのは、設問に > 構造体変数data[]のアドレスは0x1000、0x1000、0x1010、0x1018、0x1020であるとする。 と書いてあるものを実際のプログラムに入れるわけには行かないから。 と思ったら。構造体のアドレスがこれだと、設問が変じゃないですか? 配列なのにメモリ空間に連続で割り当てられていないというか、同じアドレスを指す要素があるとか。intを32bit、構造体の「穴(※)」なしと仮定したら、8Byteずつアドレスが大きくなるんじゃないかと思います。<設問のアドレス変だよって話です。 ※穴・・・構造体の記憶領域割り当ては構造体メンバのそれぞれのサイズを足したものより大きくなることがあります。このとき、メンバに割り当てられていない部分を「穴」と呼んでいます。 > 問題文の意図がよく分からないことと (1)の要点「ポインタはアドレスを保持する」 (2)の要点「ポインタを1進めると、型の大きさ分だけ先のアドレスを指す」 (3)の要点=(2)の要点の引き算バージョン でOK? 何を言っているのか分からないようでしたら、次のように問題を読み替えてください。 char data[5] = {0, 0, 0, 0, 0}; char *p; p = &data[2]; *p = 1; /* (1)この処理でどこが書き変わるか? */ p += 2; *p = 2; /* (2)この処理でどこが書き変わるか? */ p -= 4; *p = 3; /* (3)この処理でどこが書き変わるか? */ これがわかったら、あとは char を struct example に換えれば・・・もう答えは出てますね。

  • yonfa
  • ベストアンサー率52% (22/42)
回答No.1

宿題のようですので、まず、自分で「ここ」と思ったところに printf 文を入れてみたらよいと思います。 すべての行間に挿入するのもありかと思いますが…。 まず、自分でやってみることが大事です。 問題の意図は、「ポインタ変数の加減算に対する理解」ということになりますね。

xiamei723
質問者

補足

質問前にやってみたのですが、すべて数値になり、その答えが心配だったので聞いてみたかったのです。 答えが数値でも良いのでしょうか?

関連するQ&A

  • C言語 構造体でつまずいています

    以下、番号と点数を入力して構造体配列に入力し、番号に0が入力されたら、入力処理をやめ、平均点を表示するプログラムです。  今のコードでは、最初から番号に0を入力すると、0除算になりエラーになります。どうすれば良いのでしょうか? #include <stdio.h> #define MAX 50 //配列の要素数を定義 int count=0; //グローバル変数 struct data { //構造体の定義 int num; //メンバの宣言 int ten; }; void nyuryoku(struct data *); //プロトタイプ宣言 float heikin(struct data *); //プロトタイプ宣言 void main() { struct data score[MAX]; //構造体の宣言 printf("**学生番号/点数入力**\n"); printf("\n"); nyuryoku(score); //nyuryoku関数呼び出し printf("\n**以上%d名の平均点:%0.1f点**\n",count,heikin(score)); //heikin関数の戻り値表示 } //nyuryoku関数 //機能:構造体配列にデータを入力する void nyuryoku(struct data *pd) //仮引数pdに構造体ポインタが渡る { int i; for(i=0;i<MAX;i++){ printf("学生番号>>"); scanf("%d",&pd->num); if(pd->num==0){ //学生番号に0を入力するとループを抜ける break; } printf("点  数>>"); scanf("%d",&pd->ten); count++; //人数のカウント pd++; //構造体配列を一つずらす } } //heikin関数 //機能:構造体配列の点数の平均を計算、戻り値として返す float heikin(struct data *pd) //仮引数pdに構造体ポインタが渡る { int i; int sum=0; float ave=0; for(i=0;i<MAX;i++){ if(pd->num==0){ break; } else{ sum+=pd->ten; //点数を加算 pd++; } } ave=(float)sum/count; //平均値を求める return(ave); //平均値を戻り値として返す }

  • 以前勉強していたのですが、教えてください。

    今自分でC言語の勉強をしているのですが、解けないプログラムが本に載っていましたので教えてください。 #include<stdio.h> struct DATE_DATA { int yy, mm, dd; }; void sub1(struct DATE_DATA *data, int i); void sub2(struct DATE_DATA *data, int i); void main(void) { int i; struct DATE_DATA data[5]; for(i = 0; i < 5; i++) { sub1(&data[i], i); } for(i = 0; i < 5; i++) { sub2(&data[i], i); } }                                                     void sub1(struct DATE_DATA *data, int i) /&data[i] ,iの {                        アドレスを受け取る/ printf("%d回目\n", i + 1); printf(" year = "); printf("%d", &data->yy); /構造体ポインタ変数名->メンバ名 printf(" month = ");   なのにdataの前に&が付いている/ printf("%d", &data->mm); printf(" day = "); printf("%d", &data->dd); } void sub2(struct DATE_DATA *data, int i) { printf("%d回目 ", i + 1); printf("%02d/", data->yy); /dataの前には&が付いていない/ printf("%02d/", data->mm); printf("%02d\n", data->dd); } 長くなりまして、すみません。質問がプログラムの中にあることも、すみません。 どうしても分からなくて回答をお願いします。

  • javaプログラム 合ってるかお願いします

    プログラムは非常に苦手なため合ってないと思いますが、合ってないのは何が正解かを教えてください。 よろしくお願いします 1 ローカル変数を全て答えよ args,num 2 インスタンス変数を全て答えよ num 3 インスタンスメソッド名を答えよ Example2 4インスタンスメソッドを呼び出している行 public class Example2{ int num; public static viod main(String[] args){ Example2 ex2 = new Example2(5); int a = ex2.getNum(); System.out.println(a); } Example2(int num){ this.num=num; } int getNum(){ return this.num; } }

    • ベストアンサー
    • Java
  • 構造体 プログラム解説 C言語

    struct tag{ char str[6]; }aa; aa = *(struct tag *)"HELLO"; //5行目 printf("%s\n",aa.str); } 上記のプログラムの5行目の仕組みはどうなってるんですか? ここでのポインタの意味があまりよくわからないんですが、、 一番先頭の * はtag型の構造体変数aaを参照してるんでしょうか? そして、()内の * は何を指してるんでしょうか? いまいち理解しにくいです。どなたか解説お願いします!  

  • Cのポインタについて(関数への値渡し)

    C言語のポインタに関する質問です。関数に引数を渡す方法として以下の誤ったswap関数でなぜだめなのかいまいち得心できません。わかりやすくかみくだいて説明していただけると有り難いです。 できましたら、トレースともうしますか、変数の値の動きを詳細に段階的にプログラムの流れに沿って追っていって、だからこうなんだよ、みたいな解説がいただけたら有り難いです。わがままいってすみません。 /* 誤ったswap関数の宣言 */ void swap(int x, int y); int main(void) { int num1 = 5; int num2 = 10; printf("変数num1の値は%dです。¥n", num1); printf("変数num2の値は%dです。¥n", num2); printf("変数num1とnum2の値を交換します。¥n", num1); swap(num1, num2); printf("変数num1の値は%dです。¥n", num1); printf("変数num2の値は%dです。¥n", num2); return 0; } /* 誤ったswap関数の定義 */ void swap(int x, int y) { int tmp; tmp = x; x = y; y = tmp; } ---------- /* swap関数の宣言 */ void swap(int *pX, int *pY); int main(void) { int num1 = 5; int num2 = 10; printf("変数num1の値は%dです。¥n", num1); printf("変数num2の値は%dです。¥n", num2); printf("変数num1とnum2の値を交換します。¥n", num1); swap(&num1, &num2); printf("変数num1の値は%dです。¥n", num1); printf("変数num2の値は%dです。¥n", num2); return 0; } /* swap関数の定義 */ void swap(int *pX, int *pY) { int tmp; tmp = *pX; *pX = *pY; *pY = tmp; }

  • ポインタ配列

    ポインタ配列によるひとつのプログラムを組もうと思っています。 で、以下のようなプログラムを作ってみました。 1:#include<stdio.h> 2:#define NUM 5 3:main(void){ 4: char *str[NUM]; 5: int i; 6: for(i=0;i<NUM;i++){ 7: printf("string --->"); 8: scanf("%s",str[i]); 9: } 10: for(i=0;i<NUM;i++){ 11: printf("str[%d] --> %c\n",i,str[i]); 12: } 13:} これなのですが、8行目のscanf文でコンパイルエラーではなく、実行エラーが出ます。どのようにすれば動くようになるのでしょうか? 入力する文字は、9文字以下を想定しています。

  • Perlguts:構造体の受け渡し

    Hoge*なtfield型の *head構造体を生成してPerl側で参照し、 再度同じ関数に通して*headと同じ構造体*pを作りたい。 下記のソースを 実行すると二度目にDataListを通すと tfield *pはバラバラな構造体が生成される。 *headと同じ構造体が 生成されるにはどうしたら良いか。 ご教授お願いします。m(_ _)m ちなみに使用環境はWindow7です。 ----------------------------------------- MyTpe.xs側 struct tfield { struct tfield *left[30]; int num; char str[30]; struct tfield *right[30]; }; struct tfield *talloc(void) { return ((struct tfield *)malloc(sizeof(struct tfield ))); } MODULE = MyType PACKAGE = MyType SV* DataList(data,num) SV* data int num PREINIT: struct tfield *p,*head[30]; INIT: int i,j; CODE: if(num!=0){ p=INT2PTR(struct tfield *,SvSTASH(SvRV(data))); f(SvTYPE(SvRV(data))==SVt_PVMG) printf("MG Success\n"); or(i=0;i<6;i++){ printf("\np->left[%d]=%p\n",i,p->left[i]); } } for(i=0;i<6;i++){ /*無意味な構造体*/ head[i]->left[0]=head[i]->right[0]=head[i]=talloc(); printf("head[0]->left[%d]=%p\n",i,&head[0]->left[i]); } ref=newRV_noinc(newHV()); sv_setref_pv(ref,"main::Tie",(void*)head); RETVAL=ref; OUTPUT: RETVAL ----------------------------------------- Perl側 #!usr/bin/perl use MyType; use Devel::Peek qw/Dump/; $value1=MyType::DataList(NULL,0); print Dump $value1; $DB::single=1; $value1=MyType::DataList($value1,1); ----------------------------------------- Devel::Peekの実行結果 SV = IV(0x1209078) at 0x120907c REFCNT = 1 FLAGS = (ROK) RV = 0x5bbbcc SV = PVMG(0x18cf78c) at 0x5bbbcc REFCNT = 1 FLAGS = (OBJECT,IOK,pIOK) IV = 1243644 NV = 0 PV = 0 STASH = 0x12089bc "main::Tie"

    • ベストアンサー
    • Perl
  • javaの質問です。合っているかお願いします

    間違ってる場合は何が違って何が正解かをお願いします。 よろしくお願いします 1 this.numとnumの違い this.numはインスタンス変数でnumは変数 2 メソッド内のthis.numは何行目で宣言されているか? 4行目 public class Example4 { int num; void plus( int num ) { this.num = this.num + num; } void multiple( int num ) { this.num = this.num * num; } void setNum( int num ) { this.num = num; } int getNum() { return this.num; } }

    • ベストアンサー
    • Java
  • C言語の添削

    「C言語基礎課題1」 #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <tchar.h> #include <ctype.h>                                       #include <string.h> #define MAX 100 /*点数*/ int flag; double avg(double t[],int n); int str_check(char s[]);                                        int main() { int number; //人数 double score[MAX]; //点数 char temp[MAX]; char str[MAX]; //名前 double ans; //平均成績 int i=0; //カウンタ変数 //人数の決める printf("人数を入力して下さい。\n"); scanf("%d",&number); //名前の入力 for(i=0;i<number;i++) { printf("%d番様の名前を入力して下さい。\n",i+1); scanf("%s",&str[i]); } //点数の入力 for(i=0;i<number;i++) { printf("%d番様の点数を入力して下さい。\n",i+1); scanf("%s",&temp); str_check(temp); if(flag==1) { score[i]=atoi(temp); //点数入力で有効範囲をチェック if(score[i]<0 || score[i]>100) { printf("0-100点の範囲を入力して下さい。\n"); i--; } } if(flag==0) { printf("点数を数字で入力して下さい。\n"); i--; } } ans =avg(score,number); printf("\n=====入力内容一覧と成績平均値======\n"); for(i=0;i<number;i++) { printf("%d番の点数は%3.2lfです。\n",i+1,score[i]); } printf("平均点は%3.2lfです。\n",ans); printf("=====================================\n"); getch(); return 0; } /*avg関数の定義*/ double avg(double t[],int n) { int i; double sum; sum = 0.0; for(i=0;i<n;i++) { sum += t[i]; } return sum/n; } /*点数入力で文字か数字かチェック*/ int str_check(char s[]) { int i=0,n; //カウンタ変数 n=strlen(s); while(s!='\0') { if(s[i]>='0'&&s[i]<='9'||s[i]=='.') { i++; } else { break; } } if(i==n) { flag=1; } else { flag=0; } return flag; } [最初に組んだソースプログラム] #include<stdio.h> #include<stdio.h> #define NUM 3 /*点数*/ #define Name 3 /*人数*/ #include<conio.h> double avg(int t[]); struct stList{ char str[Name][100]; int score[NUM]; int i,j; }; int main(void) { int score[NUM]; //char str[Name]; char str[100]; int i,j; double ans; printf("名前を入力して下さい。\n",Name); for(i=0;i<Name;i++){ scanf("%s",&str[Name]); } // if(score[NUM]=0 || score[NUM]<=100) //{ // printf("点数を入力して下さい。\n",NUM); //} printf("点数を入力して下さい。\n",NUM); for(i=0;i<NUM;i++) { scanf("%d",&score[i]); if(score[i]<0 || score[i]>100) { printf("0-100点の範囲を入力して下さい。\n"); i--; } } for(j=0;j<NUM;j++){ printf("%d番目の人の点数は%dです。\n",j+1,score[j]); } ans =avg(score); printf("平均点は%3.2lfです。\n",ans); getch(); return 0; } /* avg関数の定義 */ double avg(int t[]) { int i; double sum; sum = 0.0; for(i=0;i<3;i++){ sum += t[i]; } return sum/Name; } 「一人分のデータを保持する構造体(文字列と整数の変数をメンバに持つ)を用意し、3人分の名前と成績 (最大値100、最小値0)を入力でき、入力が終了したら、入力内容一覧と成績の平均値を表示する プログラムを作成せよ。 ※考えうる限りの異常系処理の導入、関数化を行うこと。」 研修で以下の指摘を受けました。 (1)compare関数が使われていない。 (2)名前入れる変数が3つ不明 (3)カウンタ変数がi,j,s,tになっている理由は? (4)名前を入力しなかった時の処理 (5)点数を処理しなかった時の処理 (6)定数NUMで人数3を指定できるようにしているのにプログラムはそれを利用仕切れていない(名前入力が固定3人)ので無意味 (7)if(tmp=0 || tmp<=100)←これなんでしょうか? (8)平均点表示の少数点以下有効桁数はどうなっているのか? (9)点数入力で文字を入れたときの処理 (10)点数入力で有効範囲外の数字を入れた時の処理 ちなみに最大値、最小値はdefineして欲しいです。理由は(2)に読めば分かる (11)変数名が謎なのが多い 課題のキーワードのどこにも出て来ないですし言葉だから 後、添付ファイルを添付します。 最初のソースプログラム名「最初に組んだもの」修正したものが「C言語基礎課題1」と名付けています。 いづれのソースプログラムも構造体を用意出来てないように思うのですがいかかですか?

  • 構造体のコピーについて

    次のプログラムを実行してoriginalは偶数、copyは奇数を表示するようにしたいのですが、実行すると両方とも奇数になってしまいます。 正しく表示されるようにするにはどこを直せばいいのか教えてください。 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct structSample_ { unsigned int nmemb; /*配列の要素数 */ int *data; /* データを格納する配列 */ }Sample; /* 関数のプロトタイプ宣言 */ Sample *alloc_str ( unsigned int nmenb ); /* 新しい構造体を確保 */ /* main関数 */ int main ( void ) { Sample *original_str, *copy_str; unsigned int number = 10; int i; /* 構造体用のメモリ割り当て */ original_str = alloc_str ( number ); copy_str = original_str; /* original にデータを代入 */ for( i = 0; i < original_str->nmemb; i++ ) original_str -> data[i] = (i+1) * 2; /* 偶数を代入 */ /* original を copy に複製 */ copy_str = original_str; /* copy のデータを編集 */ for( i = 0; i < copy_str->nmemb; i++ ) copy_str->data[i]--; /* 奇数にする */ /* 結果の確認 * original には偶数が入っているはず */ printf( "original: " ); for( i = 0; i < original_str->nmemb; i++ ) printf( "%d ", original_str->data[i] ); printf( "\n" ); /* copy には奇数がはいっているはず */ printf( " copy : " ); for( i = 0; i < copy_str->nmemb; i++ ) printf( "%d ", copy_str->data[i] ); printf( "\n" ); return 0; }

専門家に質問してみよう