ページ 11

変数やマクロの追加なしでプログラムを完成させたい。

Posted: 2015年12月19日(土) 20:33
by c learner
コメントの仕様通りにsumを作ろうとしたのですがうまく作ることができません。どうすればよいでしょうか?

コード:

#include<stdio.h>
char NUM[]="123.45678";
# define c2n(c) (( (c)>='0' && (c)<='9' )?(c)-'0':(c))
int reverse();
int replace();
int sum(char *p);
main(){
  char *ptr;
  ptr=NUM;
  printf("abc.def->fed.cba:\t%s->",NUM);
  reverse();
  putchar('\n');
  printf("abc.def->def.abc:\t %s->",NUM);
  replace();
  putchar('\n');
  printf("         \t\t\t-----------\n");
  ptr=NUM;
  printf("         \t\t\t+%5d\n",sum(ptr));
}
int reverse( void ){/*123.45678を87654.321即ちNUMの中の配列を逆順に表示する関数*/
  char temp1[100];
  char *p1, *p2;	
  p1 = NUM;
  p2 = temp1;	
  while ( *p1 != '\0' ) {
    p1++;
  }
  while (p1 > NUM) {	
    p1--;		
    *p2 = *p1;	
    p2++;		
  }
  *p2 = '\0';		
  printf( "%s\n",temp1);
  return 0;
}
int replace(void){/*123.45678を45678.123に即ちNUMの中の配列の小数部分と整数部分を入れ変え表示する関数*/
  char temp2[50],temp3[50];
  char *p1,*p2,*p3;	
  p1=NUM;
  p2=temp2;
  p3=temp3;
  while(*p1!='.'){*p2=*p1;p1++;p2++;
  }
  *p2='\0';
  while(*p1!='\0'){p1++;*p3=*p1;p3++;
  }
  printf("%s.%s\n",temp3,temp2);
  return 0;
}
int sum(char *p){/*生成した2個の数値の整数部分の和を画面表示する。 num_aは逆順の数値,num_bは整数部分と小数部分を入れ替えた数値. 変数、マクロ、関数追加はなしマクロc2nは利用可*/
  int num_a=0,num_b=0;
}

Re: 変数やマクロの追加なしでプログラムを完成させたい。

Posted: 2015年12月19日(土) 20:46
by みけCAT
確実に画面表示させるのは難しいですが、出力するだけなら素直に実装すればいいでしょう。

コード:

int sum(char *p){
  int num_a=0,num_b=0;
  p=NUM;
  /* 小数部分と整数部分を入れ替えたので、もとの小数部分のみを数値に変換する */
  while (*p!='\0' && *p!='.') p++;
  if (*p != '\0') {
    while (*++p!='\0') num_b = num_b*10 + c2n(*p);
  }
  /* 逆順なので、逆順に数値に変換する */
  while (*--p!='.') {
    num_a = num_a*10 + c2n(*p);
    if (p == NUM) break;
  }
  /* 2個の数値の整数部分の和を出力する */
  printf("%d\n", num_a + num_b);
  return 0;
}

Re: 変数やマクロの追加なしでプログラムを完成させたい。

Posted: 2015年12月19日(土) 21:39
by c learner
みけCAT さん 解決しました!ありがとうございました。