alabama_country @Wiki

C-assign-2008-12-11

最終更新:

alabama_country

- view
管理者のみ編集可

12月11日の宿題

問題1

#include <stdio.h>
 
#define SIZE_OF_ARRAY(x) (sizeof(x) / sizeof((x)[0]))
// 使っているだけで目をつけられかねないhackコード
// これを見る前から知っていた人以外=素人にはお勧めできない
int main()
{
  //740000という学生証番号ということで
  int array[] = {10, 15, 23, 32, 24, 7, 9, 14, 74, 0, 00};
  int array_even[SIZE_OF_ARRAY(array)];
 
  int i, j;
  //ポインタを使えということで無茶して使った
  int *parray = array, *parray_even;
  for(parray_even = array_even;
      parray_even < array_even + SIZE_OF_ARRAY(array);
      ++parray_even)
    {
      parray_even[i] = 0;
    }
  for(i=0, j=0; i<SIZE_OF_ARRAY(array); ++i)
    {
      //この偶奇判定コードもトリッキーだ
      if(array[i] >> 1 << 1 == array[i])
	array_even[j++] = array[i];
    }
  printf("There are %d even numbers.\n", j);
  for(i=0; i<j; ++i)
    {
      printf("%d\n", array_even[i]);
    }
}

課題2

大したポイントはない。

課題3

文字列比較がポイント。正直丸ごとパクられるとこれも一発でばれると思うので、書きなおしてみた。とはいえ、よそで見た手法を無意識のうちに取り入れてはいる。ポインタを使うとこんなに綺麗になるんだね…string.hのstrstrの実装を読んでみるのは参考になるかも。

const char * strsearch( const char *const target, const char *const query)
{
   const char *c_target, *c_query, *c_current;
 
   //queryが空文字列ならNULLを返す仕様にしている。
   if(*query == '\0')
      return NULL;
 
   //targetが末尾に至るまで走査,whileのほうが分かりやすいがfor
   for(c_current = target; *c_current != '\0'; ++c_current)
   {
      for(c_query = query, c_target = c_current;
         *c_target != '\0' && *c_target == *c_query;
         ++c_target, ++c_query)
      {
         if(c_query[1] == '\0')
            return c_target - strlen(query) + 1;
      }
   }
   return NULL;
}
記事メニュー
目安箱バナー