编程语言
首页 > 编程语言> > C和指针第八章编程练习

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