ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C和指针第八章编程练习

2021-03-14 15:58:14  阅读:215  来源: 互联网

标签:return && int 编程 第八章 ++ arrayinfo income 指针


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有