Hatena::Groupcprogramming

てーげーC言語

2009-02-02

2-10

| 01:11

#include <stdio.h>

void lower(char* s); 

int main(int argc, char* argv[])
{
  if (argc != 2)
    return -1; 

  lower(argv[1]);
  printf("%s\n", argv[1]);
  
  return 0;
}

void lower(char* s) {
  char *p; 

  for (p = s; *p != '\0'; p++) {
    *p = (*p >= 'A' && *p <= 'Z') ? *p + 'a' - 'A' : *p; 
  }
}

2009-01-31

2-5

| 20:30

#include <stdio.h>

int strpbrk(char* s1, char* s2);

int main(int argc, char* argv[]) {
  int ret;

  ret = strpbrk(argv[1], argv[2]);
  printf("%d\n", ret);
  return 0;
}

int strpbrk(char* s1, char* s2) {
  int ret;
  char *s1p;
  char *s2p;

  ret = -1; 

  for(s1p = s1; ((*s1p != '\0') && (ret == -1)); s1p++){
    for(s2p = s2; *s2p != '\0'; s2p++) {
      if(*s1p == *s2p) {
        ret = s1p - s1; 
        break;
      }   
    }   
  }

  return ret;
}

2009-01-30

2-4

| 16:10

#include <stdio.h>

void squeeze(char *s1, char *s2);

int main(int argc, char* argv[]) {

  squeeze(argv[1], argv[2]);

  printf("%s\n", argv[1]);

  return 0;
}

void squeeze(char *s1, char *s2) {
  char *pi, *pk, *pj;

  pi = s1;
  pk = s1;
  pj = s2;

  while(*pi != '\0') {
    while((*pi != *pj) && (*pj != '\0')) {
      pj++;
    }

    if (*pj == '\0') {
      *pk = *pi;
      pk++;
      pj = s2;
    }
    pi++;
  }

  *pk = '\0';
}

2009-01-22

演習 2-3

| 02:29

16進数文字列をそれに等しい整数に変換する関数htoi(s)を作れ(0xあるいは0Xがついている場合も考慮すること)。16進数の文字として許されるのは、0〜9, a〜f, A〜Fとする。

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include <stdlib.h>

int htoi(char *s);

int main (int args, char* argv[]) {

  int dec;

  if (args == 1) {
    printf("please input hex\n");
    return -1;
  }

  if((dec = htoi(argv[1])) > 0)
    printf("%d\n", dec);
  else
    printf("please input hex\n");

  return 0;
}

int htoi(char *s)
{
  int dec, len, val, i;
  char c;

  len = strlen(s);
  if(len == 0)
    return -1; 

  if((!((*s == '0') && (*(s+1) == 'x'))) && (!(*s == '0') && (*(s+1) == 'X')))
    return -1; 
 
  s = s + 2;

  for(i = 0; i < len; i++) {
    *(s+i) = toupper(*(s+i));
    if (isdigit(*(s+i)) == 0) {
      if ((c >= 'A') && ( c <= 'F')) {
        dec = -1; 
        break;
      }
    }
  }

  i = 0;
  dec = 0;
  len = len - 2;
  for(; *s != '\0'; s++) {
    if (isdigit(*s)) {
      val = *s - 48;
    } else {
      if (*s == 'A')
        val = 10;
      else if (*s == 'B')
        val = 11;
      else if (*s == 'C')
        val = 12;
      else if (*s == 'D')
        val = 13;
      else if (*s == 'E')
        val = 14;
      else if (*s == 'F')
        val = 15;
    }
    //printf("val is %d\n",val);
    dec += (pow(16,(--len))) * val;
  }

  return dec;
}

2009-01-18

演習 2-2

| 20:21

上記のforループに等価なループを、&&あるいは||を使用しないで書け。

signed charのsizeは1
#include <stdio.h>

int main()
{
  int lim = 10; 
  int i = 0;
  char s[lim];
  char c;

  while((c = getchar()) != EOF) {
    if (c == '\n')
      break; 

    s[i] = c;
    i++;
    if (i >= lim - 1)
      break;
  }

  return 0;
}

演習 2-1

| 19:58

char, short, int, long変数のsignedおよびunsignedの両方の型について、それらの範囲を決めるプログラムを、標準ヘッダからの適当な値を印字することと、直接計算することとの双方で書け。計算しようとすると困難であるが、各種の浮動小数点型の範囲を決定せよ。

直接計算するのは途中ですが・・


#include <stdio.h>
#include <limits.h>
#include <float.h>

int main()
{
  signed char sc; 
  unsigned char uc; 
  signed short ss; 
  unsigned short us; 
  signed int si; 
  unsigned int ui; 
  signed long  sl; 
  unsigned long ul; 


  printf("signed charのsizeは%ld\n", sizeof(sc));
  printf("signed charの最小値は%d\n", SCHAR_MIN);
  printf("signed charの最大値は%d\n", SCHAR_MAX);
  printf("unsigned charのsizeは%ld\n", sizeof(uc));
  printf("unsigned charの最小値は0\n");
  printf("unsigned charの最大値は%d\n", UCHAR_MAX);
  printf("signed shortのsizeは%ld\n", sizeof(ss));
  printf("signed shortの最小値は%d\n", SHRT_MIN);
  printf("signed shortの最大値は%d\n", SHRT_MAX);
  printf("unsigned shortのsizeは%ld\n", sizeof(us));
  printf("unsigned shortの最小値は0\n");
  printf("unsigned shortの最大値は%d\n", USHRT_MAX);
  printf("signed intのsizeは%ld\n", sizeof(si));
  printf("signed intの最小値は%d\n", INT_MIN);
  printf("signed intの最大値は%d\n", INT_MAX);
  printf("unsigned intのsizeは%ld\n", sizeof(ui));
  printf("unsigned intの最小値は0\n");
  printf("unsigned intの最大値は%u\n", UINT_MAX);
  printf("signed longのsizeは%ld\n", sizeof(sl));
  printf("signed longの最小値は%ld\n", LONG_MIN);
  printf("signed longの最大値は%ld\n", LONG_MAX);
  printf("unsigned longのsizeは%ld\n", sizeof(ul));
  printf("unsigned longの最小値は0\n");
  printf("unsigned longの最大値は%ld\n", ULONG_MAX);

  printf("signed charの最小値は%d\n", -(char)((unsigned char)~0 >> 1));
  printf("signed charの最大値は%d\n", (char)((unsigned char)~0 >> 1));

  return 0;
}

演習1-24

| 19:23

カッコ、中カッコ、大カッコのつりあいがとれていないといったプログラムの基本的な構文エラーのチェックを行なうプログラムを書け。引用符・2重引用符・コメントなどの処理も忘れないこと。(このプログラムを観世人に汎用的にしようとすると、これを書くのは難しくなる。)

カッコの対応チェックはスタックにしました。

#include <stdio.h>
#include <string.h>

#define KAKKO_BEGIN '('
#define KAKKO_END ')'
#define DAI_KAKKO_BEGIN '['
#define DAI_KAKKO_END ']'
#define CHU_KAKKO_BEGIN '{'
#define CHU_KAKKO_END '}'
#define MAX_LENGTH 1024
#define OK 1
#define NG 0
#define DOUBLE_QUOTE '"'
#define SINGLE_QUOTE '\''
#define SLASH '/'
#define ASTERISK '*'
#define ON 1
#define OFF 0

char STACK[MAX_LENGTH];
char *p; 
char pc; 
int D_QUOTING = 0;
int S_QUOTING = 0;
int COMMENTING = 0;

int need_check(char c); 
int check_kakko();
void push(char c); 
int pop(char c); 

int main()
{
  p = STACK;
  *p = '\0';
  
  if (check_kakko()) {
    printf("OK\n");
  } else {
    printf("NG\n");
  }

  return 0;
}

int need_check(char c)
{
  int result = NG;

  if (c == DOUBLE_QUOTE) {
    if (D_QUOTING)
      D_QUOTING = OFF;
    else
      D_QUOTING = ON;
  }
  if (c == SINGLE_QUOTE) {
    if (S_QUOTING)
      S_QUOTING = OFF;
    else
      S_QUOTING = ON;
  }

  if ((!D_QUOTING) && (!S_QUOTING)){
    if (c == ASTERISK && pc == SLASH)
      COMMENTING = ON;
    if (c == SLASH && pc == ASTERISK)
      COMMENTING = OFF;
  }
  pc = c;


  if ((!D_QUOTING) && (!S_QUOTING) && (!COMMENTING))
    result = OK;

  return result;
}

int check_kakko()
{
  int c;
  int result = OK;

  while(((c = getchar()) != EOF) && result) {
    if(need_check(c)) {
      push(c);
      result = pop(c);
    }
//printf("[%s] length=%d\n", STACK, (int)strlen(STACK));
//printf("result is %d\n", result);
  }

  return result;
}

void push(char c)
{
//printf("c is %c\n", c);
  if(c == KAKKO_BEGIN || c == DAI_KAKKO_BEGIN || c == CHU_KAKKO_BEGIN) {
    *p++ = c;
    *p = '\0';
  }
}

int pop(char c)
{
  int result = OK;

  if(c == KAKKO_END || c == DAI_KAKKO_END || c == CHU_KAKKO_END) {
    if(c == KAKKO_END && *(--p) != KAKKO_BEGIN){
      result = NG;
      //printf("hoge\n");
      //printf("*p is %c\n", *p);
    }
    if(c == DAI_KAKKO_END && *(--p) != DAI_KAKKO_BEGIN) {
      result = NG;
      //printf("hoge\n");
  }
    if(c == CHU_KAKKO_END && *(--p) != CHU_KAKKO_BEGIN) {
      result = NG;
      //printf("hoge\n");
  }
    if(result == OK)
      *p = '\0';
  }

  return result;
}