■掲示板に戻る■ 全部 1- 最新50 read.htmlに切り替える
■ C言語のお勉強ページに対するご意見・ご感想スレ

1 名前:へなちょこ管理人 ★:2007/08/05(日) 07:32:58
移転を機に立ててみました。
これ、もうちょっと○○したほうがスマートじゃない?
とか
こんな関数つかってんじゃねーよ
とか
普通に感想とかお寄せください。

35 名前:名無しさんが転んだ!:2009/01/26(月) 09:45:38
演習7-4の解答ページが見れなくなっています。

36 名前:へなちょこ管理人 ★:2009/01/26(月) 20:00:22
>>35
ローカル見てみたらどうやら解いてないみたいです。。。
ちょっと解いてみますね。

37 名前:へなちょこ管理人 ★:2009/01/26(月) 23:19:05
現在Cのコンパイル環境がないので昔のPCでちまちまやるの面倒だった・・・。
おおざっぱですが、やってみました。挙動がおかしかったらご指摘下さい。

38 名前:へなちょこ管理人 ★:2009/01/26(月) 23:20:16
/*
符号無し整数xのposビット目からn個のビットを、1にした値を返す関数set_n、0にした値を返す関数reset_n、反転した値を返す関数inverse_n
        unsigned set_n(         unsigned x, int pos, int n) { /*…*/ }
        unsigned reset_n(       unsigned x, int pos, int n) { /*…*/ }
        unsigned inverse_n(     unsigned x, int pos, int n) { /*…*/ }
を作成せよ。
*/

#include        <stdio.h>

/*---整数x中のセットされたビット数を返す---*/
int count_bits(unsigned x)
{
        int     count = 0;
        while(x){
                if ( x & 1U )   count++;
                x >>= 1;
        }
        return count;
}

/*---unsigned型のビット数を返す---*/
int int_bits(void)
{
        return count_bits(~0U);
}

/*---unsigned型のビット内容を表示---*/
void print_bits(unsigned x)
{
        int     i;
        for ( i = int_bits() - 1; i >= 0; i-- )
                putchar((( x >> i ) & 1U ) ? '1' : '0');
        putchar('\n');
}

/*符号無し整数xのposビット目からn個のビットを1にした値を返す*/
unsigned set_n(unsigned x, int pos, int n)
{
        unsigned i = 1U;
        int j;
        for ( j = pos -1; j < pos; j++ )
        {
          i <<= 1
          i += 1;
        }
        return i | x;
}

/*符号無し整数xのposビット目からn個のビットを0にした値を返す*/
unsigned reset_n(unsigned x, int pos, int n)
{
        unsigned i = 1U;
        int j;
        for ( j = pos -1; j < pos; j++ )
        {
          i <<= 1
          i += 1;
        }
        i = ~i;
        return i & x;
}

/*符号無し整数xのposビット目からn個のビットを反転した値を返す*/
unsigned inverse_n(unsigned x, int pos, int n)
{
        unsigned i = 1U;
        int j;
        for ( j = pos -1; j < pos; j++ )
        {
          i <<= 1
          i += 1;
        }
        return i ^ x;
}

int main(void)
{
        unsigned no;
        int bit;
        
        printf("整数を入力してください:");      scanf("%lu", &no);
        puts("ビットの中身");
        print_bits(no);
        printf("何ビット目を処理しますか:");    scanf("%d", &bit);
        printf("ON_n:\t");
        print_bits(set_n(no, bit));
        printf("OFF_n:\t");
        print_bits(reset_n(no, bit));
        printf("INVERSE_n:");
        print_bits(inverse_n(no, bit));
        
        return 0;
}

39 名前:へなちょこ管理人 ★:2009/01/26(月) 23:23:44
fooooooooooooooooooooooooo

forの中のj = pos - 1ってのは全部j = 0におきかえてくだしあ。
間違えたまま保存してたw

40 名前:@携帯:2009/01/27(火) 13:03:01
あー
ちゃんと引数あたえてなかったりでめちゃめちゃや。

帰宅してから直します。

41 名前:へなちょこ管理人 ★:2009/01/27(火) 20:12:43
>符号無し整数xのposビット目からn個のビットを
右にn個なのか左にn個なのか・・・。
humm...

42 名前:へなちょこ管理人 ★:2009/01/27(火) 20:40:51
/*
符号無し整数xのposビット目からn個のビットを、1にした値を返す関数set_n、0にした値を返す関数reset_n、反転した値を返す関数inverse_n
unsigned set_n(         unsigned x, int pos, int n)
unsigned reset_n(       unsigned x, int pos, int n)
unsigned inverse_n(     unsigned x, int pos, int n)
を作成せよ。
*/

#include        <stdio.h>

/*---整数x中のセットされたビット数を返す---*/
int count_bits(unsigned x)
{
    int count = 0;
    while(x) {
        if ( x & 1U )   count++;
            x >>= 1;
    }
    return count;
}

/*---unsigned型のビット数を返す---*/
int int_bits(void)
{
    return count_bits(~0U);
}

/*---unsigned型のビット内容を表示---*/
void print_bits(unsigned x)
{
    int i;
    for ( i = int_bits() - 1; i >= 0; i-- )
        putchar((( x >> i ) & 1U ) ? '1' : '0');
    putchar('\n');
}

/*符号無し整数xのposビット目からn個のビットを1にした値を返す*/
unsigned set_n(unsigned x, int pos, int n)
{
    unsigned i = 1U;
    int j;
    for ( j = 0; j < n - 1; j++ ) {
        i <<= 1;
        i += 1;
    }
    i <<= pos - n;
    return i | x;
}

/*符号無し整数xのposビット目からn個のビットを0にした値を返す*/
unsigned reset_n(unsigned x, int pos, int n)
{
    unsigned i = 1U;
    int j;
    for ( j = 0; j < n - 1; j++ ) {
        i <<= 1;
        i += 1;
    }
    i <<= pos - n;
    i = ~i;
    return i & x;
}

/*符号無し整数xのposビット目からn個のビットを反転した値を返す*/
unsigned inverse_n(unsigned x, int pos, int n)
{
    unsigned i = 1U;
    int j;
    for ( j = 0; j < n - 1; j++ ) {
        i <<= 1;
        i += 1;
    }
    i <<= pos - n;
    return i ^ x;
}

int main(void)
{
    unsigned no;
    int bit,n;
    
    printf("整数を入力してください:");      scanf("%lu", &no);
    puts("ビットの中身");
    print_bits(no);
    printf("何ビット目を処理しますか:");    scanf("%d", &bit);
    printf("何個処理しますか:");        scanf("%d", &n);
    printf("ON_n:\t\t");
    print_bits(set_n(no, bit, n));
    printf("OFF_n:\t\t");
    print_bits(reset_n(no, bit, n));
    printf("INVERSE_n:\t");
    print_bits(inverse_n(no, bit, n));
    
    return 0;
}

43 名前:へなちょこ管理人 ★:2009/01/27(火) 20:43:39
上記の回答は右にn個処理するものです。
左にn個処理する場合は各関数の i <<= pos - n;を
i <<= pos - 1;にしたらいいと思います。

44 名前:へなちょこ管理人 ★:2009/01/27(火) 20:49:27
んで、もし、posがunsignedを超えたり、nがposを超える入力があった場合のために、
pos → pos % int_bits()
n → n % pos
にしとくと安全かもしれません。

45 名前:へなちょこ管理人 ★:2009/01/27(火) 21:01:53
http://newcomer.nuts-choco.com/clang/src/7/7-4.c.txt

んで、ファイル置いておきました。

46 名前:uuuss:2009/05/17(日) 17:28:39
http://newcomer.s368.xrea.com/clang/
掲示板へのリンクが切れてるw

47 名前:へなちょこ管理人 ★:2009/05/18(月) 02:54:08
>>46
っうぇっうぇw
一部相対リンクじゃなくて絶対リンクになってるから直すのめんどくせぇww

48 名前:へなちょこ管理人 ★:2009/05/18(月) 02:57:28
nuts-chocoの方も復活してるけどいずれまた落ちるだろうからシカトw
看板だけ取り戻せてよかた〜。
みっちゃんに作ってもらった大切な看板だからなぁ。

49 名前:へなちょこ管理人 ★:2009/07/03(金) 21:10:19
/*
文字列strの中に、文字cが含まれていれば(複数ある場合は、最も先頭側とする)、
その文字へのポインタを返し、含まれていなければNULLを返す関数
char *str_chr(const char *str, int c) {}
を作成せよ。
*/

#include <stdio.h>

char *str_chr(const char *str, int c)
{
while(*str){
if(*str == c)
return (char*)str;
str++;
}

return NULL;
}

int main(void)
{
char str[128];
int c;
char *p;

printf("文字列を入力してください:");
scanf("%s", str);
while(getchar() != '\n' );
printf("検索する文字を入力してください:");
scanf("%c", &c);

if( (p = str_chr(str, c)) == NULL )
printf("指定された文字は見つかりませんでした。\n");
else
printf("%cは%d文字目にありました。\n", c, p - &str[0] + 1);

return 0;
}

50 名前:へなちょこ管理人 ★:2009/07/03(金) 21:12:06
char *str_chr(const char *str, int c)
{
char * res;

while(*str){
if(*str == (char)c){
res = str;
return res;
str++;
}

return NULL;
}

こうかな

29KB
新着レスの表示

掲示板に戻る 全部 前100 次100 最新50 read.htmlに切り替える

名前: E-mail(省略可)

img0ch(CGI)/3.1.10