• 締切済み

ポインタ配列のプログラムについて

ポインタ変数の配列のプログラム #include<stdio.h> void main() { char *p[] = {"JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE", "JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER"}; int i,j; *p[0]=*p[2]; *p[0]=*p[2]; for(i = 0;i < 12; ++i){ printf("%2d 月:%s\n",i+1,p[i]); } for(i = 0;i < 12; ++i){ j = -1; do{ ++j; printf("%4x ",p[i]+j); } while (*(p[i]+j) != '\0'); printf("\n"); j = -1; do{ ++j; printf(" %c ",*(p[i]+j)); }while (*(p[i]+j) != '\0'); printf("\n"); } } について、このプログラムを、先頭の文字(1月ならJ、2月ならFなど)のアドレスを変化させて、アルファベット順の次の文字に変更するプログラム(1月ならJ→K、2月ならF→G)に書き換えたプログラムを作成せよ。 この問題が分かる方いましたら、解き方だけでもいいので、是非教えてください。よろしくお願いします。

みんなの回答

回答No.5

先頭の1バイト出力分だけ1文字先の出力をするように変更しました。ただし、16進出力については出題のままにしてあります。 #include <stdio.h> int main(void) { char *p[] = {"JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE", "JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER"}; int i,j; for(i = 0;i < 12; ++i) { printf("%2d 月:%s\n",i+1,p[i]); } for(i = 0;i < 12; ++i) { printf("%4x ", p[i]); // 追加 j = 0; // 変更 do{ ++j; printf("%4x ", p[i]+j); } while (*(p[i]+j) != '\0'); printf("\n"); printf(" %c ", *(p[i])+0x01); // 追加 j = 0; // 変更 do { ++j; printf(" %c ", *(p[i]+j)); } while (*(p[i]+j) != '\0'); printf("\n"); } return 0; }

全文を見る
すると、全ての回答が全文表示されます。
  • entree
  • ベストアンサー率55% (405/735)
回答No.4

定数を書き換えることはできないので、 別の領域q を作成してそこに定数の内容をコピー。 あとはインクリメントして表示。 #include<stdio.h> #include <string.h> int main (int argc, char *argv[]) { const char *p[] = { "JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER" }; const int len = sizeof (p) / sizeof (char *); char **q = (char **) malloc (sizeof (char *) * len); int i; for (i = 0; i < len; i++) { *(q + i) = strdup (p[i]); if ('A' <= *q[i] && *q[i] <= 'Y') (*q[i])++; else if (*p[i] == 'Z') *q[i] = 'A'; printf ("%s\n", q[i]); } return 0; }

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

こんなので良いのかな? #include<stdio.h> void main() {  char pstr[12][64] = {   "JANUARY",   "FEBRUARY",   "MARCH",   "APRIL",   "MAY",   "JUNE",   "JULY",   "AUGUST",   "SEPTEMBER",   "OCTOBER",   "NOVEMBER",   "DECEMBER"};  int i;  for(i = 0;i < 12; ++i){   switch(pstr[i][0])   {    case 'A' :    {     pstr[i][0] = 'B';     break;    }    case 'B' :    {     pstr[i][0] = 'C';     break;    }    case 'C' :    {     pstr[i][0] = 'D';     break;    }    case 'D' :    {     pstr[i][0] = 'E';     break;    }    case 'E' :    {     pstr[i][0] = 'F';     break;    }    case 'F' :    {     pstr[i][0] = 'G';     break;    }    case 'G' :    {     pstr[i][0] = 'H';     break;    }    case 'H' :    {     pstr[i][0] = 'I';     break;    }    case 'I' :    {     pstr[i][0] = 'J';     break;    }    case 'J' :    {     pstr[i][0] = 'K';     break;    }    case 'K' :    {     pstr[i][0] = 'L';     break;    }    case 'L' :    {     pstr[i][0] = 'M';     break;    }    case 'M' :    {     pstr[i][0] = 'N';     break;    }    case 'N' :    {     pstr[i][0] = 'O';     break;    }    case 'O' :    {     pstr[i][0] = 'P';     break;    }    case 'P' :    {     pstr[i][0] = 'Q';     break;    }    case 'Q' :    {     pstr[i][0] = 'R';     break;    }    case 'R' :    {     pstr[i][0] = 'S';     break;    }    case 'S' :    {     pstr[i][0] = 'T';     break;    }    case 'T' :    {     pstr[i][0] = 'U';     break;    }    case 'U' :    {     pstr[i][0] = 'V';     break;    }    case 'V' :    {     pstr[i][0] = 'W';     break;    }    case 'W' :    {     pstr[i][0] = 'X';     break;    }    case 'X' :    {     pstr[i][0] = 'Y';     break;    }    case 'Y' :    {     pstr[i][0] = 'Z';     break;    }    case 'Z' :    {     pstr[i][0] = 'A';     break;    }   }  }  for(i = 0;i < 12; ++i){   printf("%s\n" ,pstr[i]);  } }

全文を見る
すると、全ての回答が全文表示されます。
  • foofoo0
  • ベストアンサー率42% (39/92)
回答No.2

元のプログラムが、どのような動作をするかは理解できていますが? それが解れば、文字列の先頭文字へのアクセス方法がわかるはずなので、それをインクリメントしてやれば次の文字になります。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「ポインタ配列」じゃなければできますか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ポインタ配列のプログラムについて

    ポインタ変数の配列のプログラム #include<stdio.h> void main() { char *p[] = {"JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE", "JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER"}; int i,j; *p[0]=*p[2]; *p[0]=*p[2]; for(i = 0;i < 12; ++i){ printf("%2d 月:%s\n",i+1,p[i]); } for(i = 0;i < 12; ++i){ j = -1; do{ ++j; printf("%4x ",p[i]+j); } while (*(p[i]+j) != '\0'); printf("\n"); j = -1; do{ ++j; printf(" %c ",*(p[i]+j)); }while (*(p[i]+j) != '\0'); printf("\n"); } } について、このプログラムを最も大きい値(ASCIIの文字コードが最も大きい値)を出力するプログラムに変更したいのですが、ASCIIの文字コードが何なのかよく分かりません。分かる方いましたら教えてください。よろしくお願いします。

  • ポインタ配列について

    下のプログラムは、ポインタ変数の配列のプログラムです。 このプログラムを、月の順番を入れ替えて出力するプログラムに変更するにはどのようにすれば良いか分かる方いましたら、是非教えてください。例えば、JANUARYとMARCHを入れ替えて出力するプログラムなどです。 #include<stdio.h> void main() { char *p[] = {"JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE", "JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER"}; int i,j; *p[0]=*p[2]; *p[0]=*p[2]; for(i = 0;i < 12; ++i){ printf("%2d 月:%s\n",i+1,p[i]); } for(i = 0;i < 12; ++i){ j = -1; do{ ++j; printf("%4x ",p[i]+j); } while (*(p[i]+j) != '\0'); printf("\n"); j = -1; do{ ++j; printf(" %c ",*(p[i]+j)); }while (*(p[i]+j) != '\0'); printf("\n"); } }

  • ポインタと配列 助けてください

    #include <stdio.h> int main(void) { int a[5] = {1, 2, 3, 4, 0}; int i, *ptr; ptr = ######; while (*ptr != 0){ ######; ######; }      for (i = 0; i < 5; i++) printf("a[%d]=%2d &a[%d]=%p\n", i, #####,i, #####); putchar('\n'); ptr = ######; for (i = 0; i < 5; i++){ printf("ptr値 =%d ptrアドレス =%p \n", ####, ####); ####; } printf("\n"); return (0); } 一次元配列a[]の一番目の要素以外を0にするプログラム(ただし、最後の要素は0)を作成したいのですが、#の部分に何をあてはめたらいいかわかりません。 助けてください。

  • 英語入力するプログラム

    月名の日本語を入力して英語にするプログラムを書こうとしている のですが、うまく動作しません。 たとえば。 「3月:」と表示されたら大文字か小文字、もしくは組み合わせで marchと入力すれば「正解です。」と表示されるようにです。 具体的には、ランダムで月名が表示されていくのですが何を入力しても 正解と表示されてしまいます。 たとえば、marchなのにdなどと入力しても正解になってしまいます。 何がおかしいのでしょうか? #include<stdio.h> #include<time.h> #include<stdlib.h> #include<ctype.h> #include<string.h> #define swap(type,x,y) do{type t=x;x=y;y=t;}while(0) char *tukistr[]={"January","Feburary","March","April","May","June","July", "August","September","October","November","December"}; int main(void) { char nstr[12]={0,1,2,3,4,5,6,7,8,9,10,11}; char tuki[10]; int num; int seikai=0; int k=0; int seiho[12]; int huseiho[12]; int m=0; int i,j; srand(time(NULL)); printf("月名の英語を入力してください。入力は大文字でも小文字でも構いません。\n"); for(i=11;i>0;i--) { j=rand()%i; swap(int,nstr[j],nstr[i]); } for(i=0;i<12;i++) { printf("%d月 : ",nstr[i]+1); scanf("%s",tuki); do{ for(j=0;j<strlen(tuki);j++) { if(isalpha(tuki[j])!=isalpha(tukistr[nstr[i]][j])) { printf("違います。正解を見ますか? 0-いいえ/1-はい:"); scanf("%d",&num); if(num==1) { huseiho[m++]=nstr[i]; } break; } } }while(num==0 && j<strlen(tuki)); if(j==strlen(tuki)) { printf("正解です。\n"); seikai++; seiho[k++]=i; } else if(num==1) { printf("%d月は%sです。\n",nstr[i],tukistr[i]); } } printf("12個のうち%d個が正解でした。\n",seikai); printf("正解した月:"); for(j=0;j<12;j++) { if(j==seiho[j]) { printf("%d月,",j+1); } } printf("\n\n"); printf("間違えた月:"); for(j=0;j<12;j++) { if(j==huseiho[j]) { printf("%d月,",j+1); } } return 0; }

  • 配列にしたいのですが

    int i,j=0,work=0; int D[]={376,251,240,115}; int A[]={1,2,4,7,13,24,44,81,149,274}; do{ for(i=9;i>=0;i--){ work=D[j]-A[i]; if(work>=0){ D[j]=work; printf("%2d",i); } } printf("\n"); j++; }while(j<=3); これにより、出力 9 7 4 3 0 8 7 4 3 0 8 7 3 1 0 7 5 3 1 0 を得たのですが、これを int e[4][5]={{9,7,4,3,0},{8,7,4,3,0},{8,7,3,1,0},{7,5,3,1,0}}; となるように配列したいのですが、上記のプログラムをどのようにすればいいのでしょうか。

  • 変な動作をしてしまう

    月名の日本語を入力して英語にするプログラムなのですが、最後の 「間違えた月:」の結果がしっかり表示されません。 結果のどうこうに問わず、必ず「間違えた月:1月,1月,1月,1月, 1月,1月,4月,5月,」と表示されてしまうのです。 ちなみに、その上の「正解した月」はちゃんと思惑通りに 動作します。 このプログラムのどこがおかしいためにそのように表示されて しまうのでしょうか? よろしくお願いします。 #include<stdio.h> #include<time.h> #include<stdlib.h> #include<ctype.h> #include<string.h> #define swap(type,x,y) do{type t=x;x=y;y=t;}while(0) char *tukistr[]={"january","feburary","march","april","may","june","july", "augst","september","october","november","december"}; int main(void) { int nstr[12]={0,1,2,3,4,5,6,7,8,9,10,11}; char tuki[10]; int num; int seikai=0; int k=0; int seiho[12]; int huseiho[12]; int m=0; int i,j,p; char hen; srand(time(NULL)); printf("月名の英語を入力してください。入力は大文字でも小文字でも構いません。\n"); for(i=11;i>0;i--) { j=rand()%i; swap(int,nstr[j],nstr[i]); } for(i=0;i<12;i++) { printf("%d月 : ",nstr[i]+1); scanf("%s",tuki); do{ for(j=0;j<strlen(tukistr[nstr[i]]);j++) { hen=tolower(tuki[j]); if(hen!=tukistr[nstr[i]][j]) { printf("違います。正解を見ますか? 0-いいえ/1-はい:"); huseiho[m++]=nstr[i]; scanf("%d",&num); if(num==0) { printf("もう一度入力してください。:"); p=1; scanf("%s",tuki); j=0; } break; } } }while(num==0 && j<strlen(tukistr[nstr[i]])); if(j==strlen(tukistr[nstr[i]])) { printf("正解です。\n"); if(p!=1) { seikai++; seiho[k++]=nstr[i]; } p=0; } else if(num==1) { printf("%d月は%sです。\n",nstr[i]+1,tukistr[nstr[i]]); } } printf("12個のうち%d個が正解でした。\n",seikai); printf("正解した月:"); for(j=0;j<12;j++) { for(i=0;i<12;i++) { if(j==seiho[i]) { printf("%d月",j+1); if(j!=11) { printf(","); } } } } printf("\n\n"); printf("間違えた月:"); for(j=0;j<12;j++) { for(i=0;i<12;i++) { if(j==huseiho[i]) { printf("%d月",j+1); if(j!=11) { printf(","); } } } } return 0; }

  • ポインタのプログラムについて

    以下のプログラムを実行したとき、表示される値を余白に記述せよ。ただし、配列idataは1000番地から格納されているとする。また、表示結果*8**~*10**の箇所で、正しく計算された値のみ表示させるには、maxはいくらに設定すればよいか。という課題なんですが、実際にプログラムを作ってみてmaxの箇所を4にしてみたところ間違いと言われたので正しいmaxの値を教えて下さい。 #include<stdio.h> int main(void) { int iv,idata[]={2,4,6,8,10,12},*ip,i,max; iv=idata[0]; printf("*1*ivの値=%d\n",iv); ip=&idata[0]; printf("*2*ipの値=%p\n",ip); ip=&idata[1]; printf("*3*ipの値=%p\n",ip); ip=&idata[2]; printf("*4*ipの値=%p\n",ip); iv=*ip; printf("*5*ivの値=%d\n",iv); iv=*ip+3; printf("*6*ivの値=%d\n",iv); iv=*(ip+3); printf("*7*ivの値=%d\n",iv); max=4; *ip=0; for(i=0;i<max;i++){ printf("*8**(ip+%d)=%d\n",i,*(ip+i)); } *(ip+1)=10; for(i=0;i<max;i++){ printf("*9**(ip+%d)=%d\n",i,*(ip+i)); } *(ip+3)=20; for(i=0;i<max;i++){ printf("*10**(ip+%d)=%d\n",i,*(ip+i)); } ip=&idata[0]; printf("*11*ipの値=%p\n",ip); ip=ip+2; printf("*12*ipの値=%p\n",ip); iv=*ip+3; printf("*13*ipの値=%d\n",iv); iv=*(ip+3); printf("*14*ivの値=%d\n",iv); ++ip; printf("*15*ipの値=%p\n",ip); } ヒントは”正しく計算された値のみ”という部分らしいのですが、自分にはまったく分りませんでした。

  • ダブルポインタで2次元配列を作成

    2次元配列を作り、そのアドレスなどを表示させましたが どうもおかしいです。 3行5列の配列で、3本のポインタ配列がありますが、 その配列のアドレスがかぶっているのです。 まずはコンパイルしてみてください。 #include<stdio.h> main() { int i; int k; int y=1; int **p; p=(int **)malloc(sizeof(int *)*3); for(i=0;i<=2;i++) { *(p+i)=(int *)malloc(sizeof(int)*5); } for(i=0;i<=2;i++){ for(k=0;k<=4;k++){ p[i][k]=(i+k)*y; } y=y*10; } for(i=0;i<=2;i++){ for(k=0;k<=4;k++){ printf("%4d",*(*(p+i)+k)); } printf("\n"); } printf("\n"); for(i=0;i<=2;i++) { printf("%p\n",p+i); } printf("\n"); for(i=0;i<=2;i++) { printf("%p\n",&p+i); } printf("\n"); for(i=0;i<=2;i++) { printf("%p\n",*(p+i)); } printf("\n"); for(i=0;i<=4;i++) { printf("%p\n",*(p)+i); } printf("\n"); for(i=0;i<=4;i++) { printf("%p\n",&*(p)+i); } printf("\n"); for(i=0;i<=4;i++) { printf("%p\n",&**(p)+i); } printf("\n"); for(i=0;i<=4;i++) { printf("%p\n",*(p+1)+i); } printf("\n"); for(i=0;i<=4;i++) { printf("%p\n",&*(p+1)+i); } printf("\n"); for(i=0;i<=4;i++) { printf("%p\n",&**(p+1)+i); } printf("\n"); for(i=0;i<=4;i++) { printf("%p\n",*(p+2)+i); } printf("\n"); for(i=0;i<=4;i++) { printf("%p\n",&*(p+2)+i); } printf("\n"); for(i=0;i<=4;i++) { printf("%p\n",&**(p+2)+i); } printf("\n"); for(i=0;i<=2;i++){ for(k=0;k<=4;k++){ printf("%p\n",&*(*(p+i)+k)); }} free(p); return 0; } どこがかぶっているかと申しますと、 for(i=0;i<=4;i++) { printf("%p\n",&*(p)+i); } と for(i=0;i<=4;i++) { printf("%p\n",&*(p+1)+i); } と for(i=0;i<=4;i++) { printf("%p\n",&*(p+2)+i); } です。 これが同じアドレスになるはずは論理的にありえないことです。 VC++2008無料バージョンです。 よろしくお願いいたします。

  • 配列のプログラムですが

    #include <iostream> using namespace std; int main() { int a[100],b=-9999; int i=0,j; do { cout << "整数値を入力してください\n"; cin >> a[i]; b += a[i]; i++; }while( a[i-1] != 9999); cout << b << '\n'; for(j=0;j<i-1;j=j+1) cout << a[j] * 3 << '\n'; return 0; } このプログラムってどんな計算をしてるんですか?誰か分かる人いますか 整数値を入れてくださいって出るだけなんですが

  • 配列プログラムのバグ

    入力した正の整数を読み込み、小さい順に並べ替える配列のプログラムを作りたいのですが、以下のプログラムで結果がくるってしまいます。 色々な数値を入力してみたところ、入力した数字のうち、どれかが0に なってしまうようなのですが、いまいち理解できません。 どこを修正すればいいのでしょうか? #include<stdio.h> int main(void){ int a[255],b,i=0,j,k; while(i<255){ printf("正整数:\n"); scanf("%d",&a[i]); if(a[i]==0) break; else if(a[i]<0){ printf("正の整数ではありません"); return 0; } i++; } for(k=0;k<=i;k++){ for(j=0;j<=i;j++){ if(a[j]>a[j+1]){ b=a[j]; a[j]=a[j+1]; a[j+1]=b; } } } printf("入力された整数は小さい順に"); for(j=0;j<=i;j++){ printf("%d,",a[j]); } printf("です。"); return 0; }