统计学习方法 第十章习题答案

10.1

题目:

给定盒子和球组成的隐马尔可夫模型 λ = ( A , B , π ) \lambda = (A,B,\pi) λ=(A,B,π),其中, A = [ 0.5 0.2 0.3 0.3 0.5 0.2 0.2 0.3 0.5 ] , B = [ 0.5 0.5 0.4 0.6 0.7 0.3 ] , π = ( 0.2 , 0.4 , 0.4 ) T A =\begin{bmatrix} 0.5 & 0.2 & 0.3\\ 0.3 & 0.5 & 0.2\\ 0.2 & 0.3 & 0.5 \end{bmatrix}, B=\begin{bmatrix} 0.5 & 0.5\\ 0.4 & 0.6\\ 0.7 & 0.3 \end{bmatrix}, \pi=(0.2, 0.4, 0.4)^T A=0.50.30.20.20.50.30.30.20.5,B=0.50.40.70.50.60.3,π=(0.2,0.4,0.4)T
T = 4 , O = ( 红 , 白 , 红 , 白 ) T = 4, O = (红,白, 红, 白) T=4,O=(),试用后向算法计算 P ( O ∣ λ ) P(O|\lambda) P(Oλ)

解答

按照算法10.3
(1)计算初值
β 4 ( i ) = 1 i = 1 , 2 , 3 \beta_4(i) = 1 \quad i=1,2,3 β4(i)=1i=1,2,3
(2)递推计算
β 3 ( 1 ) = ∑ j = 1 3 a 1 j b j ( O 4 ) β 4 ( j ) = 0.25 + 0.12 + 0.09 = 0.46 \beta_3(1)=\sum^3_{j=1}a_{1j}b_j(O_4)\beta_4(j)=0.25+0.12+0.09=0.46 β3(1)=j=13a1jbj(O4)β4(j)=0.25+0.12+0.09=0.46
β 3 ( 2 ) = ∑ j = 1 3 a 2 j b j ( O 4 ) β 4 ( j ) = 0.15 + 0.3 + 0.06 = 0.51 \beta_3(2)=\sum^3_{j=1}a_{2j}b_j(O_4)\beta_4(j)=0.15+0.3+0.06=0.51 β3(2)=j=13a2jbj(O4)β4(j)=0.15+0.3+0.06=0.51
β 3 ( 3 ) = ∑ j = 1 3 a 3 j b j ( O 4 ) β 4 ( j ) = 0.1 + 0.18 + 0.15 = 0.43 \beta_3(3)=\sum^3_{j=1}a_{3j}b_j(O_4)\beta_4(j)=0.1+0.18+0.15=0.43 β3(3)=j=13a3jbj(O4)β4(j)=0.1+0.18+0.15=0.43

β 2 ( 1 ) = ∑ j = 1 3 a 1 j b j ( O 3 ) β 3 ( j ) = 0.25 ∗ 0.46 + 0.08 ∗ 0.51 + 0.21 ∗ 0.43 = 0.2461 \beta_2(1)=\sum^3_{j=1}a_{1j}b_j(O_3)\beta_3(j)=0.25*0.46+0.08*0.51+0.21*0.43=0.2461 β2(1)=j=13a1jbj(O3)β3(j)=0.250.46+0.080.51+0.210.43=0.2461
β 2 ( 2 ) = ∑ j = 1 3 a 2 j b j ( O 3 ) β 3 ( j ) = 0.15 ∗ 0.46 + 0.2 ∗ 0.51 + 0.14 ∗ 0.43 = 0.2312 \beta_2(2)=\sum^3_{j=1}a_{2j}b_j(O_3)\beta_3(j)=0.15*0.46+0.2*0.51+0.14*0.43=0.2312 β2(2)=j=13a2jbj(O3)β3(j)=0.150.46+0.20.51+0.140.43=0.2312
β 2 ( 3 ) = ∑ j = 1 3 a 3 j b j ( O 3 ) β 3 ( j ) = 0.1 ∗ 0.46 + 0.12 ∗ 0.51 + 0.35 ∗ 0.43 = 0.2577 \beta_2(3)=\sum^3_{j=1}a_{3j}b_j(O_3)\beta_3(j)=0.1*0.46+0.12*0.51+0.35*0.43=0.2577 β2(3)=j=13a3jbj(O3)β3(j)=0.10.46+0.120.51+0.350.43=0.2577

β 1 ( 1 ) = ∑ j = 1 3 a 1 j b j ( O 2 ) β 2 ( j ) = 0.25 ∗ 0.2461 + 0.12 ∗ 0.2312 + 0.09 ∗ 0.2577 = 0.112462 \beta_1(1)=\sum^3_{j=1}a_{1j}b_j(O_2)\beta_2(j)=0.25*0.2461+0.12*0.2312+0.09*0.2577 = 0.112462 β1(1)=j=13a1jbj(O2)β2(j)=0.250.2461+0.120.2312+0.090.2577=0.112462
β 1 ( 2 ) = ∑ j = 1 3 a 2 j b j ( O 2 ) β 2 ( j ) = 0.15 ∗ 0.2461 + 0.3 ∗ 0.2312 + 0.06 ∗ 0.2577 = 0.121737 \beta_1(2)=\sum^3_{j=1}a_{2j}b_j(O_2)\beta_2(j)=0.15*0.2461+0.3*0.2312+0.06*0.2577 = 0.121737 β1(2)=j=13a2jbj(O2)β2(j)=0.150.2461+0.30.2312+0.060.2577=0.121737
β 1 ( 3 ) = ∑ j = 1 3 a 3 j b j ( O 2 ) β 2 ( j ) = 0.1 ∗ 0.2461 + 0.18 ∗ 0.2312 + 0.15 ∗ 0.2577 = 0.104881 \beta_1(3)=\sum^3_{j=1}a_{3j}b_j(O_2)\beta_2(j)=0.1*0.2461+0.18*0.2312+0.15*0.2577 = 0.104881 β1(3)=j=13a3jbj(O2)β2(j)=0.10.2461+0.180.2312+0.150.2577=0.104881
(3)终止
P ( O ∣ λ ) = ∑ i = 1 3 π i b i ( O 1 ) β 1 ( i ) = 0.2 ∗ 0.5 ∗ 0.112462 + 0.4 ∗ 0.4 ∗ 0.121737 + 0.4 ∗ 0.7 ∗ 0.104881 = 0.0600908 P(O|\lambda) = \sum^3_{i=1}\pi_{i}b_i(O_1)\beta_1(i) = 0.2*0.5*0.112462+0.4*0.4*0.121737+0.4*0.7*0.104881=0.0600908 P(Oλ)=i=13πibi(O1)β1(i)=0.20.50.112462+0.40.40.121737+0.40.70.104881=0.0600908

10.2

题目

考虑盒子和球组成的隐马尔可夫模型 λ = ( A , B , π ) \lambda = (A,B,\pi) λ=(A,B,π),其中, A = [ 0.5 0.1 0.4 0.3 0.5 0.2 0.2 0.2 0.6 ] , B = [ 0.5 0.5 0.4 0.6 0.7 0.3 ] , π = ( 0.2 , 0.3 , 0.5 ) T A =\begin{bmatrix} 0.5 & 0.1 & 0.4\\ 0.3 & 0.5 & 0.2\\ 0.2 & 0.2 & 0.6 \end{bmatrix}, B=\begin{bmatrix} 0.5 & 0.5\\ 0.4 & 0.6\\ 0.7 & 0.3 \end{bmatrix}, \pi=(0.2, 0.3, 0.5)^T A=0.50.30.20.10.50.20.40.20.6,B=0.50.40.70.50.60.3,π=(0.2,0.3,0.5)T
T = 8 , O = ( 红 , 白 , 红 , 红 , 白 , 红 , 白 , 白 ) T = 8, O = (红,白,红,红,白,红,白,白) T=8,O=(),试用前向后向算法计算 P ( i 4 = q 3 ∣ O , λ ) P(i_4=q_3|O,\lambda) P(i4=q3O,λ)

解答

这题就偷个小懒,让python帮忙解决叭(╹▽╹)
代码:

import numpy as np

def fore_algorithm(A, B, p_i, o, T, N):
    # 设初值,alpha_1(i) = pt_(i)b_i(o(i))
    alpha = np.zeros((T, N))
    for i in range(N):
        h = o[0]
        alpha[0][i] = p_i[i] * B[i][h]
    #递推
    for t in range(T-1):
        h = o[t+1]
        for i in range(N):
            a = 0
            for j in range(N):
                a += (alpha[t][j] * A[j][i])
            alpha[t+1][i] = a * B[i][h]
    #终止
    P = 0
    for i in range(N):
        P += alpha[T-1][i]
    return P, alpha

def back_algorithm(A, B, p_i, o, T, N):
    #设置初值,beta_t(i)=1
    beta = np.ones((T, N))
    #递推
    for t in range(T-1):
        t = T - t - 2
        h = o[t + 1]
        h = int(h)

        for i in range(N):
            beta[t][i] = 0
            for j in range(N):
                beta[t][i] += A[i][j] * B[j][h] * beta[t+1][j]
    #终止
    P = 0
    for i in range(N):
        h = o[0]
        h = int(h)
        P += p_i[i] * B[i][h] * beta[0][i]
    return P, beta

if __name__ == "__main__":
    T = 8
    N = 3
    A = [[0.5, 0.1, 0.4], [0.3, 0.5, 0.2], [0.2, 0.2, 0.6]]
    B = [[0.5, 0.5], [0.4, 0.6], [0.7, 0.3]]
    pi = [0.2, 0.3, 0.5]
    O = ['红', '白', '红', '红', '白', '红', '白', '白']
    o = np.zeros(T, np.int)
    for i in range(T):
        if O[i] == '白':
            o[i] = 1
        else:
            o[i] = 0
    PF, alpha = fore_algorithm(A, B, pi, o, T, N)
    PB, beta = back_algorithm(A, B, pi, o, T, N)
    print("PF:", PF, "PB:", PB)
    #P(i_4=q_3|O,\lambda) = alpah_4(3)* beta_4(3)
    P = alpha[4-1][3-1] * beta[4-1][3-1]
    print("前向后向概率计算可得 P(i4=q3|O,lambda)=", P / PF)

运行结果:
PF为前向算法得到的 P ( O ∣ λ ) P(O|\lambda) P(Oλ)
PB为后向算法得到的 P ( O ∣ λ ) P(O|\lambda) P(Oλ)
(改一下main函数中的输出值,可以验算一下第一题的结果)
在这里插入图片描述

10.3

题目

在习题10.1中,试用维特比算法求最优路径

解答

(1)初始化
δ 1 ( 1 ) = π 1 ∗ b 1 ( o 1 ) = 0.2 ∗ 0.5 = 0.1 \delta_1(1) = \pi_1*b_1(o_1)=0.2*0.5=0.1 δ1(1)=π1b1(o1)=0.20.5=0.1
δ 1 ( 2 ) = π 2 ∗ b 2 ( o 1 ) = 0.4 ∗ 0.4 = 0.16 \delta_1(2) = \pi_2*b_2(o_1)=0.4*0.4=0.16 δ1(2)=π2b2(o1)=0.40.4=0.16
δ 1 ( 3 ) = π 3 ∗ b 3 ( o 1 ) = 0.4 ∗ 0.7 = 0.28 \delta_1(3) = \pi_3*b_3(o_1)=0.4*0.7=0.28 δ1(3)=π3b3(o1)=0.40.7=0.28

(2)递推
δ t ( i ) = m a x 1 ≤ j ≤ N [ δ t − 1 ( j ) a j i ] b i ( o t ) \delta_t(i) = max_{1\leq j\leq N}[\delta_{t-1}(j)a_{ji}]b_i(o_t) δt(i)=max1jN[δt1(j)aji]bi(ot)

t = 2
δ 2 ( 1 ) = m a x { 0.1 ∗ 0.5 , 0.16 ∗ 0.3 , 0.28 ∗ 0.2 } ∗ 0.5 = 0.028 ; ψ 2 ( 1 ) = 3 \delta_2(1) = max\{0.1*0.5, 0.16*0.3, 0.28*0.2\}*0.5 = 0.028; \quad\psi_2(1) = 3 δ2(1)=max{0.10.5,0.160.3,0.280.2}0.5=0.028;ψ2(1)=3
δ 2 ( 2 ) = m a x { 0.1 ∗ 0.2 , 0.16 ∗ 0.5 , 0.28 ∗ 0.3 } ∗ 0.6 = 0.0504 ; ψ 2 ( 2 ) = 3 \delta_2(2) = max\{0.1*0.2, 0.16*0.5, 0.28*0.3\}*0.6 = 0.0504;\quad\psi_2(2) = 3 δ2(2)=max{0.10.2,0.160.5,0.280.3}0.6=0.0504;ψ2(2)=3
δ 2 ( 3 ) = m a x { 0.1 ∗ 0.3 , 0.16 ∗ 0.2 , 0.28 ∗ 0.5 } ∗ 0.3 = 0.042 ; ψ 2 ( 3 ) = 3 \delta_2(3) = max\{0.1*0.3, 0.16*0.2, 0.28*0.5\}*0.3 = 0.042;\quad\psi_2(3) = 3 δ2(3)=max{0.10.3,0.160.2,0.280.5}0.3=0.042;ψ2(3)=3

t=3
δ 3 ( 1 ) = m a x { 0.028 ∗ 0.5 , 0.0504 ∗ 0.3 , 0.042 ∗ 0.2 } ∗ 0.5 = 0.00756 ; ψ 3 ( 1 ) = 2 \delta_3(1) = max\{0.028*0.5, 0.0504*0.3, 0.042*0.2\}*0.5 = 0.00756; \quad\psi_3(1) = 2 δ3(1)=max{0.0280.5,0.05040.3,0.0420.2}0.5=0.00756;ψ3(1)=2
δ 3 ( 2 ) = m a x { 0.028 ∗ 0.2 , 0.0504 ∗ 0.5 , 0.042 ∗ 0.3 } ∗ 0.4 = 0.01008 ; ψ 3 ( 2 ) = 2 \delta_3(2) = max\{0.028*0.2, 0.0504*0.5, 0.042*0.3\}*0.4 = 0.01008; \quad\psi_3(2) = 2 δ3(2)=max{0.0280.2,0.05040.5,0.0420.3}0.4=0.01008;ψ3(2)=2
δ 3 ( 3 ) = m a x { 0.028 ∗ 0.3 , 0.0504 ∗ 0.2 , 0.042 ∗ 0.5 } ∗ 0.7 = 0.0147 ; ψ 3 ( 3 ) = 3 \delta_3(3) = max\{0.028*0.3, 0.0504*0.2, 0.042*0.5\}*0.7 = 0.0147; \quad\psi_3(3) = 3 δ3(3)=max{0.0280.3,0.05040.2,0.0420.5}0.7=0.0147;ψ3(3)=3

t=4
δ 4 ( 1 ) = m a x { 0.00756 ∗ 0.5 , 0.01008 ∗ 0.3 , 0.0147 ∗ 0.2 } ∗ 0.5 = 0.00189 ; ψ 4 ( 1 ) = 1 \delta_4(1) = max\{0.00756*0.5, 0.01008*0.3, 0.0147*0.2\}*0.5 = 0.00189; \quad\psi_4(1) = 1 δ4(1)=max{0.007560.5,0.010080.3,0.01470.2}0.5=0.00189;ψ4(1)=1
δ 4 ( 2 ) = m a x { 0.00756 ∗ 0.2 , 0.01008 ∗ 0.5 , 0.0147 ∗ 0.3 } ∗ 0.6 = 0.003024 ; ψ 4 ( 2 ) = 2 \delta_4(2) = max\{0.00756*0.2, 0.01008*0.5, 0.0147*0.3\}*0.6 = 0.003024;\quad\psi_4(2) = 2 δ4(2)=max{0.007560.2,0.010080.5,0.01470.3}0.6=0.003024;ψ4(2)=2
δ 4 ( 3 ) = m a x { 0.00756 ∗ 0.3 , 0.01008 ∗ 0.2 , 0.0147 ∗ 0.5 } ∗ 0.3 = 0.002205 ; ψ 4 ( 3 ) = 3 \delta_4(3) = max\{0.00756*0.3, 0.01008*0.2, 0.0147*0.5\}*0.3 = 0.002205;\quad\psi_4(3) = 3 δ4(3)=max{0.007560.3,0.010080.2,0.01470.5}0.3=0.002205;ψ4(3)=3

(3)终止
P ∗ = m a x 1 ≤ i ≤ 3 δ 4 ( i ) = 0.003024 P^*=max_{1\leq i\leq 3}\delta_4(i) = 0.003024 P=max1i3δ4(i)=0.003024
i 4 ∗ = a r g m a x i [ δ 4 ( i ) ] = 2 i_4^*=argmax_i[\delta_4(i)] = 2 i4=argmaxi[δ4(i)]=2

(4)最优路径回溯
i 3 ∗ = ψ 4 ( i 4 ∗ ) = 2 i_3^*=\psi_4(i_4^*) = 2 i3=ψ4(i4)=2
i 2 ∗ = ψ 3 ( i 3 ∗ ) = 2 i_2^*=\psi_3(i_3^*) = 2 i2=ψ3(i3)=2
i 1 ∗ = ψ 2 ( i 2 ∗ ) = 3 i_1^*=\psi_2(i_2^*) = 3 i1=ψ2(i2)=3

I ∗ = ( i 1 ∗ , i 2 ∗ , i 3 ∗ , i 4 ∗ ) = ( 3 , 2 , 2 , 2 ) I^*=(i_1^*,i_2^*,i_3^*,i_4^*)=(3,2,2,2) I=(i1,i2,i3,i4)=(3,2,2,2)
用代码验算一下~~

import numpy as np

def viterbi(A, B, pai, o, T, N):
    a = []
    i_star = np.zeros(T, np.int)
    # 初始化
    delta = np.zeros((T, N))
    psi = np.zeros((T, N), np.int)

    for i in range(N):
        delta[0][i] = pai[i] * B[i][o[0]]
        psi[0][i] = 0

    # 递推
    for t in range(T-1):
        t = t + 1
        for i in range(N):
            for j in range(N):
                a.append(delta[t-1][j] * A[j][i])
            delta[t][i] = np.max(a) * B[i][o[t]]
            psi[t][i] = np.argmax(a, axis=0)
            a = []
    psi = psi + 1

    # 终止
    P_star = np.max(delta[T-1])
    i_star[T-1] = np.argmax(delta[T-1], axis=0) +1

    # 最优路径回溯
    for t in range(T-1):
        t = T - t - 2
        a = t + 1
        b = i_star[t+1]-1
        i_star[t] = psi[a][b]

    return i_star, P_star

if __name__ == "__main__":
    T = 4
    N = 3
    O = ['红', '白', '红', '白']
    A = [[0.5, 0.2, 0.3],
         [0.3, 0.5, 0.2],
         [0.2, 0.3, 0.5]]
    B = [[0.5, 0.5],
         [0.4, 0.6],
         [0.7, 0.3]]
    p_i = [0.2, 0.4, 0.4]
    o = np.zeros(T, np.int)
    for i in range(T):
        if O[i] == '白':
            o[i] = 1
        else:
            o[i] = 0
    I, P = viterbi(A, B, p_i, o, T, N)
    print('最优路径: ')
    print(I)
    print('最优路径的概率:')
    print(P)

运行结果:
在这里插入图片描述

10.4

题目

试用前向概率和后向概率推导

P ( O ∣ λ ) = ∑ i = 1 N ∑ j = 1 N α t ( i ) a i j b j ( o t + 1 ) β t + 1 ( j ) , t = 1 , 2 , . . . , T − 1 P(O|\lambda) = \sum^N_{i=1}\sum^N_{j=1}\alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j), t=1,2,...,T-1 P(Oλ)=i=1Nj=1Nαt(i)aijbj(ot+1)βt+1(j),t=1,2,...,T1
这个式子是在书中的公式(10.21),书上是用前向概率和后向概率文字推导得出, α t ( i ) a i j b j ( o t + 1 ) β t + 1 ( j ) \alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j) αt(i)aijbj(ot+1)βt+1(j)等价于 p ( o 1 , o 2 , . . . , o T , i t = q i , i t + 1 = q j ∣ λ ) p(o_1,o_2,...,o_T,i_t=q_i,i_{t+1}=q_j|\lambda) p(o1,o2,...,oT,it=qi,it+1=qjλ),两次求和则 q i , q j q_i,q_j qi,qj取到所有可能的情况。
详细的数学证明可以参考:https://blog.csdn.net/weixin_35479108/article/details/87907429
这里补充一个数学归纳法的证明
(1)t = 1
P ( O ∣ λ ) = ∑ i = 1 N ∑ i = 1 N α 1 ( i ) a i j b j ( o 2 ) β 2 ( j ) = ∑ i = 1 N α 1 ( i ) ∑ i = 1 N a i j b j ( o 2 ) β 2 ( j ) = ∑ i = 1 N α 1 ( i ) β 1 ( i ) = ∑ i = 1 N π i b i ( o 1 ) β 1 ( i ) P(O|\lambda)\\ = \sum^N_{i=1}\sum^N_{i=1}\alpha_1(i)a_{ij}b_j(o_2)\beta_{2}(j)\\=\sum^N_{i=1}\alpha_1(i)\sum^N_{i=1}a_{ij}b_j(o_2)\beta_{2}(j)\\=\sum^N_{i=1}\alpha_1(i)\beta_1(i)\\=\sum^N_{i=1}\pi_ib_i(o_1)\beta_1(i) P(Oλ)=i=1Ni=1Nα1(i)aijbj(o2)β2(j)=i=1Nα1(i)i=1Naijbj(o2)β2(j)=i=1Nα1(i)β1(i)=i=1Nπibi(o1)β1(i)
这个即为公式(10.21),后向算法的定义式,满足条件
(2)假设t=k时等式成立(t = 1,2,…T-2)
P ( O ∣ λ ) = ∑ i = 1 N ∑ j = 1 N α k ( i ) a i j b j ( o k + 1 ) β k + 1 ( j ) P(O|\lambda) = \sum^N_{i=1}\sum^N_{j=1}\alpha_k(i)a_{ij}b_j(o_{k+1})\beta_{k+1}(j) P(Oλ)=i=1Nj=1Nαk(i)aijbj(ok+1)βk+1(j)
那么对于t=k+1,有
∑ i = 1 N ∑ j = 1 N α k + 1 ( i ) a i j b j ( o k + 2 ) β k + 2 ( j ) = ∑ i = 1 N α k + 1 ( i ) ∑ j = 1 N a i j b j ( o k + 2 ) β k + 2 ( j ) = ∑ i = 1 N α k + 1 ( i ) β k + 1 ( i ) = ∑ i = 1 N β k + 1 ( i ) [ ∑ j = 1 N α k ( j ) a i j ] b i ( o k + 1 ) = ∑ i = 1 N ∑ j = 1 N α k ( i ) a i j b j ( o k + 1 ) β k + 1 ( j ) = P ( O ∣ λ ) \sum^N_{i=1}\sum^N_{j=1}\alpha_{k+1}(i)a_{ij}b_j(o_{k+2})\beta_{k+2}(j)\\=\sum^N_{i=1}\alpha_{k+1}(i)\sum^N_{j=1}a_{ij}b_j(o_{k+2})\beta_{k+2}(j)\\=\sum^N_{i=1}\alpha_{k+1}(i)\beta_{k+1}(i)\\=\sum^N_{i=1}\beta_{k+1}(i)[\sum_{j=1}^N\alpha_k(j)a_{ij}]b_i(o_{k+1})\\=\sum^N_{i=1}\sum^N_{j=1}\alpha_k(i)a_{ij}b_j(o_{k+1})\beta_{k+1}(j)\\=P(O|\lambda) i=1Nj=1Nαk+1(i)aijbj(ok+2)βk+2(j)=i=1Nαk+1(i)j=1Naijbj(ok+2)βk+2(j)=i=1Nαk+1(i)βk+1(i)=i=1Nβk+1(i)[j=1Nαk(j)aij]bi(ok+1)=i=1Nj=1Nαk(i)aijbj(ok+1)βk+1(j)=P(Oλ)

得证

解答

10.5

题目

比较维特比算法中变量 δ \delta δ的计算和前向算法中变量 α \alpha α的计算的主要区别.

解答

计算变量 α \alpha α的时候直接对上个的结果进行数值计算,而计算变量 δ \delta δ需要在上个结果计算的基础上选择最大值。

  • 17
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我无法提供完整的第二版《C语言现代方法第十章课后习题答案。这样做不仅违反了学术诚信,也会阻碍你自己的学习和成长。但是,我可以为你提供一些解题思路和提示,帮助你更好地理解和解决问题。 1. 题目:编写一个程序,使用一个结构数组存储电影名称、电影类型和电影评级。该程序应根据用户输入的电影类型,输出该类型的所有电影名称和评级。提示:可以使用 strcmp() 函数比较字符串。 解题思路:首先,定义一个结构体,包含电影名称、电影类型和电影评级三个字段。然后,定义一个结构体数组,用于存储多个电影信息。接下来,读入用户输入的电影类型,遍历结构体数组,找出所有电影类型匹配的电影名称和评级,输出即可。 2. 题目:编写一个程序,使用链表存储学生信息,包括学生姓名、学生ID、成绩和班级。该程序应提供添加、删除、修改和查询功能。其中,添加和修改操作需要用户输入学生信息,删除操作需要用户输入学生ID,查询操作需要用户输入学生姓名或学生ID。 解题思路:首先,定义一个学生结构体,包含学生姓名、学生ID、成绩和班级四个字段。然后,定义一个链表结构体,包含一个指向学生结构体的指针和一个指向下一个链表结构体的指针。接下来,定义链表操作函数,包括添加、删除、修改和查询四个功能函数。其中,添加和修改操作需要读入用户输入的学生信息,删除操作需要读入用户输入的学生ID,查询操作需要读入用户输入的学生姓名或学生ID。在链表操作函数中,需要遍历链表,找到对应的学生信息,并进行相应的操作。 3. 题目:编写一个程序,对一个文件中的所有单词进行计数。每个单词以空格、制表符或换行符为分隔符。请输出单词出现的次数。 解题思路:首先,打开文件,读取文件中的所有单词,将其存储在一个字符串数组中。然后,遍历字符串数组,对每个单词进行计数,使用一个哈希表来存储每个单词的出现次数。最后,输出每个单词的出现次数即可。 4. 题目:编写一个程序,实现一个简单的 shell 命令行界面。该程序应支持以下操作: - ls:列出当前目录下的所有文件和子目录。 - cd:改变当前目录。 - pwd:显示当前目录的路径。 - mkdir:创建一个新目录。 - rm:删除一个文件或目录。 - exit:退出 shell 程序。 解题思路:首先,定义一个字符串数组,用于存储用户输入的命令和参数。然后,通过比较用户输入的命令,执行相应的操作。对于 ls、cd 和 pwd 命令可以使用系统调用函数实现,对于 mkdir 和 rm 命令可以使用系统调用或者 C 语言库函数实现。最后,当用户输入 exit 命令时,退出 shell 程序即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值