第5次c练习

1、int intvert(unsigned int x,int p,int n)实现对x的进行转换,p为起始转化位, n为需要转换的长度,假设起始点在右边.
如x=0b0001 0001,p=4,n=3转换后x=0b0110 0001。

unsigned int intvert(unsigned int x, int p, int n)
{   
    if(p > 31 || p < 0 || n << 0)//起始点不能溢出,p,n不能为负
        return 0;
    while(n--) //如果转换长度过长,则从最右端循环
    {
        x ^= 1 << p++;
        if(p > 31)
            p %= 32;
    }
    return x;
}

2、已知WAV文件格式如下表,打开一个WAV文件,以适当的数据结构组织WAV文件头并解析怎样获取WAV格式的各项信息。
这里写图片描述

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

#define RIFF        0
#define FILE_LEN    1
#define WAVE        2
#define FMT         3
#define TEMP        4
#define FORMAT      5
#define CH_NUM      6
#define SAMP_RATE   7
#define TRANS_RATE  8
#define DATA_ADJUST 9
#define SAMP_BITS   10
#define DATA_MARK   11
#define VDATA_LEN   12

unsigned char valuePosition[] = {0x00, 0x04, 0x08, 0x0C, 0x10, 0x14, 0x16, 0x18, 0x1C, 0x20, 0x22, 0x24, 0x28};
unsigned char valueLen[] = {4, 1, 4, 4, 4, 1, 1, 1, 1, 1, 2, 4, 1};

typedef struct WAVE_HEAD{
    unsigned char riffFlag[4];
    unsigned int fileLen[1];
    unsigned char waveFlag[4];
    unsigned char fmtFlag[4];
    unsigned char tempBytes[4];
    unsigned short format[1];
    unsigned short chanNum[1];
    unsigned short samplingRate[1];
    unsigned int transmissionRate[1]; 
    unsigned short dateAdjustment[1];
    unsigned char sampleBitNum[2];
    unsigned char dataMarker[4];
    unsigned int voiceValueLen[1];
}WAVE_HEAD;

void writeValue(unsigned char *value, WAVE_HEAD *pHeadValue);
//void printValue(unsigned char command, WAVE_HEAD *pHeadValue);
//void dataList();

void writeValue(unsigned char *value, WAVE_HEAD *pHeadValue)
{
    int no = 0, len = 0;

    for(no = RIFF; no < VDATA_LEN + 1; no++)
    {
        switch(no)
        {
            case RIFF:
                for(len = 0; len < valueLen[RIFF]; len++)
                    pHeadValue->riffFlag[len] = value[valuePosition[RIFF] + len];               
                break;      
            case FILE_LEN:
                for(len = 0; len < valueLen[FILE_LEN]; len++)
                    pHeadValue->fileLen[len] = value[valuePosition[FILE_LEN] + len];
                break;      
            case WAVE:
                for(len = 0; len < valueLen[WAVE]; len++)
                    pHeadValue->waveFlag[len] = value[valuePosition[WAVE] + len];
                break;      
            case FMT:
                for(len = 0; len < valueLen[FMT]; len++)
                    pHeadValue->fmtFlag[len] = value[valuePosition[FMT] + len]; 
                break;      
            case TEMP:
                for(len = 0; len < valueLen[TEMP]; len++)
                    pHeadValue->tempBytes[len] = value[valuePosition[TEMP] + len];
                break;      
            case FORMAT:
                for(len = 0; len < valueLen[FORMAT]; len++)
                    pHeadValue->format[len] = value[valuePosition[FORMAT] + len];
                break;      
            case CH_NUM:
                for(len = 0; len < valueLen[CH_NUM]; len++)
                    pHeadValue->chanNum[len] = value[valuePosition[CH_NUM] + len];
                break;      
            case SAMP_RATE:
                for(len = 0; len < valueLen[SAMP_RATE]; len++)
                    pHeadValue->samplingRate[len] = value[valuePosition[SAMP_RATE] + len];
                break;      
            case TRANS_RATE:
                for(len = 0; len < valueLen[TRANS_RATE]; len++)
                    pHeadValue->transmissionRate[len] = value[valuePosition[TRANS_RATE] + len];
                break;

            case DATA_ADJUST:
                for(len = 0; len < valueLen[DATA_ADJUST]; len++)
                    pHeadValue->dateAdjustment[len] = value[valuePosition[DATA_ADJUST] + len];
                break;      
            case SAMP_BITS:
                for(len = 0; len < valueLen[SAMP_BITS]; len++)
                    pHeadValue->sampleBitNum[len] = value[valuePosition[SAMP_BITS] + len];
                break;  
            case DATA_MARK:
                for(len = 0; len < valueLen[DATA_MARK]; len++)
                    pHeadValue->dataMarker[len] = value[valuePosition[DATA_MARK] + len];
                break;      
            case VDATA_LEN:
                for(len = 0; len < valueLen[VDATA_LEN]; len++)
                    pHeadValue->voiceValueLen[len] = value[valuePosition[VDATA_LEN] + len];
                break;      
            default:
                printf("超出范围\n");
                break;      
        }
    }
}
int main(void)
{
    unsigned char value[0x28+4] = {0};
    WAVE_HEAD *pHeadValue = (WAVE_HEAD *)malloc(sizeof(WAVE_HEAD));

    FILE *fp = NULL;
    if((fp = fopen("flower dance.wav", "rb")) == NULL){
        printf("没打开文件.\n");
        return 0;
    }
//  printf("%d\n", fread(value, sizeof(char), 0x28+4, fp));fread()返回的是实际读取的数据的个数;
    if((fread(value, sizeof(char), 0x28+4, fp)) != 0x28 + 4){
        fclose(fp);
        printf("数据没有读取完成\n");
        return 0;
    }
    fclose(fp);

    writeValue(value, pHeadValue);

    free(pHeadValue);
    pHeadValue = NULL;          
    return 0;
}

3、下面这段代码是把中英文混合字符串(汉字用两个字节表示,特点是第一个字节的最高位是1)中的大写字母转化为小写字母,找出其中的bug。

for (char *piterator=sz_word; *piterator!=0; piterator++)
{
    if (*piterator & 0x80 != 0)
    {
        piterator++;
    }
    else if (*piterator>='A' && *piterator<='Z')
        piterator += 32;
}

修改后:

void A2a(char *sz_word)
{
    char *piterator = sz_word;
    while(*piterator != '\0')
    {
//      if(*piterator & 0x80)
//          piterator++;
        if(*piterator >= 'A' && *piterator <= 'Z')
            *piterator += 32;
        piterator++;
    }
}

练习1:

        *
       ***
      *****
       ***
        *
#include <math.h>
#define N   3//边长,设总行数M = 2N-1 = 5
//行数:1,2,3,4,5
//空格数:2,1,0,1,2
//空格数:3-1, 3-2, 3-3, 3-2 = -(3-4), 3-1 = -(3-5)
//*数:1, 3, 5, 3,1  
//*数:5-4, 5-2, 5-0, 5-2, 5-4
void printDiamond(void)
{
    int i = 0, j = 0;
    for(i = 1; i < N * 2; i++)
    {
        for(j = 0; j < abs(N - i); j++)
            printf(" ");
        for(j = 0; j < 2*N-1 - 2*abs(N-i); j++)
            printf("*");
        printf("\n");
    }
}

练习2:

     ***www.baidu.com***
char *s = "www.baidu.com";
printf("***%s***", s);

练习:
1.给定一个整型数a,设置a的bit3(为1),保证其他位不变。

a |= 1 << 3;

2.给定一个整形数a,设置a的bit3~bit7,保持其他位不变。

a |= 0x1f << 3;

3.给定一个整型数a,清除a的bit15,保证其他位不变。

a &= ~(1 << 15);

4.给定一个整形数a,清除a的bit15~bit23,保持其他位不变。

a &= ~(0x1ff << 15);

5.给定一个整形数a,取出a的bit3~bit8。

b = (a & 0x3f << 3) >> 3;

6.用C语言给一个整形数的bit7~bit17赋值937(其余位不受影响)。

a = a & ~(0x7ff << 7) | 937 << 7;

7.用C语言将一个整形数的bit7~bit17中的值加17(其余位不受影响)。

b = (a & 0x7ff << 7) + (17 << 7); //取出7~17位的值并加17,所在位不变
a = a & ~(0x7ff << 7) | (b & 0x7ff << 7); //给7~17位清零, 清除相加后的进位

8.用C语言给一个整形数的bit7~bit17赋值937,同时给bit21~bit25赋值17.

a = a & ~(0x7ff << 7) & ~(0x1f << 21) | 937 << 7 | 17 << 17;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值