CSAPP chapter3 homework

本文包含多个程序设计案例,涉及位运算、数组操作、结构体定义等。通过具体函数实现展示了不同场景下的编程技巧,如变量交换、矩阵转置及树结构遍历等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3.54

int decode2(int x, int y, int z) {
    int tmp = z - y;
    tmp <<= 15;
    tmp >>= 15;
    return tmp * (x ^ tmp);
}

3.55

3.58

int switch(int *p1, int *p2, mode_t action)
{
    int result = 0;
    switch(action) {
        case MODE_A:
            result = *p1;
            *p1 = *p2;
            break;
        case MODE_B:
            result = *p1 + *p2;
            *p = result;
            break;
        case MODE_C:
            *p2 = 15;
            result = *p1;
            break;
        case MODE_D:
            *p2 = *p1;
        case MODE_E:
            result = 17;
            break;
        default: result = -1;
    }
    return result;
}

3.59

case 40:
case 42:
    result = x << 3;
    break;
case 43:
    int tmp = x * 7;
    result = tmp * tmp + 0x11;
    break;
case 44:
    result = x >> 3;
    break;
case 45:
    result = x * x + 0x11;
    break;
default: result += 0x11;

3.60:
A: i*S*T + j*T + k
B: 11, 7, 9

3.61

int var_prod_ele(int n, int A[n][n], int B[n][n], int i, int k)
{
        int *Ap = A + i * n;
        int *Bp = B + k;
        int result = 0;
        int stepB = n << 2;
        while(n > 0) {
                int i = *Bp;
                i = (*Ap) * i;
                result += i;
                Ap += 1;
                Bp = ((int)Bp) + stepB;
                n--;
        }
        return result;
}

3.62

void transpose(int M,int A[M][M]) {
        int i, j;
        for(i = 0; i < M; i++) {
                int *a = A[i][0];
                int *b = A[0][i];
                for(j = 0; j < i; j++) {
                        int i = *a;
                        *a = *b;
                        *b = i;
                        a++;
                        b += M
                }
        }
}

3.63
E1(n) = 3 * n
E2(n) = 2 * n - 1

3.64
A:
8(%ebp) => result
12(%ebp) => s1.p
16(%ebp) => s1.v

B: before call word_sum

stack
%ebp
s2.sum
s2.prod
s1.p
s1.v
the position of s2 (%ebp - 8)

3.65
A = 3, B = 7

3.66
A:CNT = 7
B:

typedef struct {
    int idx;
    int x[6];
} a_struct;

3.67
A: 0,4,0,4
B:8byte
C:

up->e2.next->e1.x = *(up->e2.next->e1.p) - up->e2.y;

3.68

#include<stdio.h>

#define CAPACITY 10

int is_end(char *buffer){
        int i;
        for(i = 0; i < CAPACITY; i++)
                if(buffer[i] == '\n')
                        return 1;
        return 0;
}

int main() {
        char buffer[CAPACITY];
        do{
                if(fgets(buffer,CAPACITY,stdin) != NULL)
                        fputs(buffer, stdout);
                else {
                        printf("something is wrong!!\n");
                        return 0;
                }
        }while(!is_end(buffer));
        return 0;
}

3.69

long trace(tree_ptr tp) {
    if(tp == NULL) return 0;
    while(tp -> left != NULL)
        tp = tp->left;
    return tp->val;
}   

3.70

//find the biggest node of the tree
long traverse(tree_ptr tp) {
    if(tp == 0) return 0x8000000000000000;
    long ans   = tp->val;
    long left  = traverse(tp -> left);
    long right = traverse(tp -> right);
    ans = ans > left  ? ans : left;
    ans = ans > right ? ans : right;
    return ans;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值