C和指针第八章编程练习
作者:互联网
8.8.1
#include <stdio.h>
int main(void)
{
static char char_value[3][6][4][5] =
{
{
{
{},
{},
{},
{}
},
{
{},
{},
{},
{}
},
{
{},
{},
{},
{}
},
{
{},
{},
{},
{}
},
{
{},
{},
{},
{}
},
{
{},
{},
{},
{}
}
},
{
{
{},
{},
{},
{}
},
{
{},
{0, ' '},
{},
{}
},
{
{},
{},
{0, 0, 0, 'A'},
{0, 0, 0, 0, 'x'}
},
{
{},
{},
{0, 0, 0xf3},
{}
},
{
{},
{},
{0, 0, 0, '\n'},
{}
},
{
{},
{},
{},
{}
}
},
{
{
{},
{},
{},
{}
},
{
{},
{0, 0, 0320},
{},
{}
},
{
{},
{0, '0'},
{0, 0, '\''},
{0, '\121'}
},
{
{},
{},
{0, 0, '3', 3},
{}
},
{
{},
{},
{},
{0, 0, 0, 0, 125}
},
{
{},
{},
{},
{}
}
}
};
int a, b, c, d;
for(a = 0; a < 3; a++)
for(b = 0; b < 6; b++)
for(c = 0; c < 4; c++)
for(d = 0; d < 5; d++)
if(char_value[a][b][c][d])
printf("char_value[%d][%d][%d][%d] = %d\n", a, b, c, d, char_value[a][b][c][d]);
return 0;
}
8.8.2
float single_tax(float income)
{
if(0 < income && income < 23350)
return income * 0.15;
else if(23350 < income && income < 56550)
return 3502.5 + 0.28 * (income - 23350);
else if(56550 < income && income < 117950)
return 12798.5 + 0.31 * (income - 56550);
else if(117950 < income && income < 256500)
return 31832.5 + 0.36 * (income - 117950);
else
return 81710.5 + 0.396 * (income - 256500);
}
8.8.3
int identity_matrix(int (*pt)[10])
{
int i, j;
for(i = 0; i < 10; i++)
for(j = 0; j < 10; j++)
if(pt[i][j] != (i == j))//i == j值正是关键判断处 为1此时的pt值也得是1 为0说明此时不在关键段上,此时的pt[i][j]值也应该为0
return 0;
return 1;
}
8.8.4
int identity_matrix(int *pt, int n)
{
int i, j;
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
if(*pt++ != (i == j))//i == j值正是关键判断处 为1此时的pt值也得是1 为0说明此时不在关键段上,此时的pt值也应该为0
return 0;
return 1;
}
8.8.5
借鉴了https://www.cnblogs.com/monster-prince/p/6078276.html
void matrix_multiply(int * m1, int * m2, int * r, int x, int y, int z)
{
int *p1, *p2;
int i, j, l;//因为要计算m1 m2矩阵得到矩阵r 所以实际上就是个赋值循环
for(i = 0; i < x; i++)//Axy 与 Byz = ABxz 所以外层为x 内层为z
{
for(j = 0; j < z; j++)
{
p1 = m1 + i * y;//关键点开始 假如我们处理的m1 m2是与书上一致根据下面的图来看矩阵每层的m1起始点是m1的每层的第一个元素,递增长度为m1每层的长度
p2 = m2 + j; //m2的起始点为m2每层的第一个元素,递增长度为一个元素
for(l = 0; l < y; l++)//根据这个计算方法来看 r的任意元素是根据y个结果相加得来的 每个结果是由m1的对应元素 * m2的对应元素
{
*r += *p1 * *p2;
p1++; //p1只需要向前移动一个位置
p2 += z;//p2则需要移动到下一层的当前位置
}
r++;
}
}
}
附上推算的结果
0,0 * 0,0 + 0,1 * 1,0 | 0,0 * 0,1 + 0,1 * 1,1 | 0,0 * 0,2 + 0,1 * 1,2 | 0,0 * 0,3 + 0,1 * 1,3
1,0 * 0,0 + 1,1 * 1,0 | 1,0 * 0,1 + 1,1 * 1,1 | 1,0 * 0,2 + 1,1 * 1,2 | 1,0 * 0,3 + 1,1 * 1,3
2,0 * 0,0 + 2,1 * 1,0 | 2,0 * 0,1 + 2,1 * 1,1 | 2,0 * 0,2 + 2,1 * 1,2 | 2,0 * 0,3 + 2,1 * 1,3
8.8.6
int array_offset(int arrayinfo[], ...)
{
int i;
int result = 0;//结果
int temp[10];//用于接受可变参数
if(arrayinfo[0] < 1 || arrayinfo[0] > 10)
return -1;
va_list ap;
va_start(ap, arrayinfo);
for(i = 0; i < arrayinfo[0]; i++)
temp[i] = va_arg(ap, int);//这个数组用于我们需要查看的伪数组下标
va_end(ap);
for(i = 0; i < arrayinfo[0]; i++)
{
if(temp[i] < arrayinfo[i * 2 + 1] || temp[i] > arrayinfo[i * 2 + 2])
return -1;
if(!i)
result = temp[0] - arrayinfo[1];//一维偏移
else
{
result *= arrayinfo[i * 2 + 2] - arrayinfo[i * 2 + 1] + 1;
result += temp[i] - arrayinfo[i * 2 + 1];
}
}
return result;
}
8.8.7
int array_offset(int arrayinfo[], ...)
{
int i;
int result = 0;//结果
int temp[10];//用于接受可变参数
if(arrayinfo[0] < 1 || arrayinfo[0] > 10)
return -1;
va_list ap;
va_start(ap, arrayinfo);
for(i = 0; i < arrayinfo[0]; i++)
temp[i] = va_arg(ap, int);//这个数组用于我们需要查看的伪数组下标
va_end(ap);
for(i = arrayinfo[0]; i > 0; i--)
{
if(i == arrayinfo[0])
result = temp[i - 1] - arrayinfo[i * 2 - 1];
else
{
result *= arrayinfo[i * 2] - arrayinfo[i * 2 - 1] + 1;
result += temp[i - 1] - arrayinfo[i * 2 - 1];
}
}
return result;
}
8.8.8
借鉴于https://www.cnblogs.com/cnnnnnn/p/8506883.html
#include <stdio.h>
int checkerboard[8][8];
void queen(int i,int j);
int chess(int i, int j);
int cas = 0;//摆法方法
int main(void)
{
queen(0, 0);
printf("%d\n", cas);
return 0;
}
void queen(int i,int j)
{
if(j >= 8)//如果右侧越界
return;
if(chess(i, j) == 1)
{//如果能放
checkerboard[i][j] = 1;//放皇后
if(i == 7)//如果是最后一行,记录情况
cas++;
else
queen(i + 1, 0);//不是最后一行就分析下一行
}//下面这两句是最精彩的
checkerboard[i][j] = 0;//如果此位置不能放,就置空(0),判断旁边的格子。
//如果此位置能放,走到这里就意味着上面的代码全部执行了,把皇后拿走(置零),再讨论其他情况,拿旁边位置试探。
queen(i, j + 1);
}
int chess(int i, int j)
{
int l;
for(l = 0; l < 8; l++)
if(checkerboard[i][l] == 1)
return 0;
for(l = 0; l < 8; l++)
if(checkerboard[l][j] == 1)
return 0;
for(l = -8; l <= 8; l++)
{//两对角线
if(i + l >= 0 && i + l < 8 && j + l >= 0 && j + l < 8)//从左上到右下对角线
if(checkerboard[i + l][j + l] == 1)
return 0;
if(i - l >= 0 && i - l < 8 && j + l >= 0 && j + l < 8)//从左下到右上对角线
if(checkerboard[i - l][j + l] == 1)
return 0;
}
return 1;
}
这题真是难度是真高
标签:return,&&,int,编程,第八章,++,arrayinfo,income,指针 来源: https://blog.csdn.net/WilliamOrgin/article/details/114761334