C和指针课后习题(第八章)

45 篇文章 2 订阅
31 篇文章 0 订阅

8.2

#include <stdio.h>
#include <stdlib.h>
#include <float.h>

static double income_limits[] = 
{
	0,23350,56550,117950,256500,DBL_MAX
};

static double tax[] = 
{
	0,3502.50,12789.50,31832.50,81710.50
};

static double p[] = 
{
	0.15,0.28,0.31,0.36,0.396
};

double single_tax(double income)
{
	int category;
	for(category = 1;income>=income_limits[category];category++)
		;	
	category -= 1;
	return tax[category]+p[category]*(income-income_limits[category]);
}

int main()
{
	double income;
	printf("please input a number:\n");
	scanf("%lf",&income);
	printf("the tax shoude be %lf\n",single_tax(income));
	return 0;
	
}

8.3

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <errno.h>
#define TRUE 1
#define FALSE 0
#define Number 3

int identity_matrix(int **a)
{
	int i,j;
	for(i=0;i<Number;i++)
	{
		if(*(a[i]+i)==1)
		{
			for(j=0;j<Number;j++)
			{
				if(j!=i && *(a[i]+j)!=0)
					return FALSE;
				else
					continue;
			}
		}
	}
	if(i==Number)
		return TRUE;
	else
		return FALSE;
			
}

int main()
{
	int i,j,**a;
	if((a=(int **)malloc(sizeof(int *)*Number))==NULL)
	{
		perror("You goofed!");
		printf("error = %d\n",errno);
		printf("%s\n",strerror(errno));
	}
	for(j=0;j<Number;j++)
	{
		if((a[j]=(int *)malloc(sizeof(int)*Number))==NULL)
		{
			 perror("You goofed!");
                	 printf("error = %d\n",errno);
                	 printf("%s\n",strerror(errno));
		}		
	}
	printf("please input array number:\n");
	for(i=0;i<Number;i++)
		for(j=0;j<Number;j++)
			scanf("%d",&a[i][j]);
	printf("the array number is :\n");
	for(i=0;i<Number;i++)
                {
			 for(j=0;j<Number;j++)
                	        printf("%d\t",a[i][j]);
			 printf("\n");
		}
	printf("result is %d\n",identity_matrix(a));
	return 0;
		
}

8.4

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <errno.h>
#define TRUE 1
#define FALSE 0
//#define Number 3

int identity_matrix(int **a,int Number)
{
	int i,j;
	for(i=0;i<Number;i++)
	{
		if(*(a[i]+i)==1)
		{
			for(j=0;j<Number;j++)
			{
				if(j!=i && *(a[i]+j)!=0)
					return FALSE;
				else
					continue;
			}
		}
	}
	if(i==Number)
		return TRUE;
	else
		return FALSE;
			
}

int main()
{
	int i,j,**a;
	int Number;
	printf("please input a number:\n");
	scanf("%d",&Number);
	if((a=(int **)malloc(sizeof(int *)*Number))==NULL)
	{
		perror("You goofed!");
		printf("error = %d\n",errno);
		printf("%s\n",strerror(errno));
	}
	for(j=0;j<Number;j++)
	{
		if((a[j]=(int *)malloc(sizeof(int)*Number))==NULL)
		{
			 perror("You goofed!");
                	 printf("error = %d\n",errno);
                	 printf("%s\n",strerror(errno));
		}		
	}
	printf("please input array number:\n");
	for(i=0;i<Number;i++)
		for(j=0;j<Number;j++)
			scanf("%d",&a[i][j]);
	printf("the array number is :\n");
	for(i=0;i<Number;i++)
                {
			 for(j=0;j<Number;j++)
                	        printf("%d\t",a[i][j]);
			 printf("\n");
		}
	printf("result is %d\n",identity_matrix(a,Number));
	return 0;
		
}


8.5

/*
	this program about function that to multiply
	two matrices
*/

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <malloc.h>
//#define NDEBUG
#include <assert.h>

void matrix_multiply(int *m1,int *m2,register int *r,int x,int y,int z)
{
	register int *m1p;
	register int *m2p;
	register int k;
	int row;
	int column;
#if 0
	int i,j;
	printf("the matrix m1 is: \n");
        for(i=0;i<x*y;i++)
        {
                printf("%d\t",m1[i]);
                if((i+1)%y==0)
                        printf("\n");
        }
        printf("the matrix m2 is: \n");
        for(i=0;i<y*z;i++)
        {
                printf("%d\t",m2[i]);
                if((i+1)%z==0)
                        printf("\n");
        }
#endif
	for(row=0;row<x;row++)
	{
		for(column=0;column<z;column++)
		{
			m1p = m1 + row*y;
			m2p = m2 + column;
			*r = 0;
			for(k=0;k<y;k++)
			{
				*r += (*m1p)*(*m2p);
				m1p += 1;
				m2p += z;
				//printf("%d\n",*r);

			}
			printf("%d\t",*r);

			r++;
			//printf("%d\n",*r);
		}
		printf("\n");
		 // printf("%d\n",*(r+row));

	}
#if 0	
	printf("the multiply matrix is :\n");
	for(row=0;row<x*z;row++)
		{
			printf("%d\t",r[row]);
			if((row+1)%z==0)
				printf("\n");
		}
#endif
}
int main()
{
	int x,y,z,*m1,*m2;
	register int *r;
	int i,j;
	printf("please input x,y and z:\n");
	scanf("%d%d%d",&x,&y,&z);
	assert(x>0 && y>0 && z>0);
	if((m1 = (int *)malloc(sizeof(int)*(x*y)))==NULL)
	{
		perror("You goofed!\n");
		printf("errno = %d\n",errno);
		printf("%s\n",strerror(errno));
	}
	if((m2 = (int *)malloc(sizeof(int)*(y*z)))==NULL)
	{
                perror("You goofed!\n");
                printf("errno = %d\n",errno);
                printf("%s\n",strerror(errno));
        }

	if((r = (int *)malloc(sizeof(int)*(x*z)))==NULL)
	{
                perror("You goofed!\n");
                printf("errno = %d\n",errno);
                printf("%s\n",strerror(errno));
        }

	for(i=0;i<x*z;i++)
		r[i] = 0;
	printf("please input matrix m1:\n");
	for(i=0;i<(x*y);i++)
	{
		scanf("%d",&m1[i]);
	}
	printf("please input matrix m2:\n");
	for(j=0;j<(y*z);j++)
	{
		scanf("%d",&m2[j]);
	}
	printf("the matrix m1 is: \n");
	for(i=0;i<x*y;i++)
	{
		printf("%d\t",m1[i]);
		if((i+1)%y==0)
			printf("\n");
	}
	printf("the matrix m2 is: \n");
        for(i=0;i<y*z;i++)
        {
                printf("%d\t",m2[i]);
                if((i+1)%z==0)
                        printf("\n");
        }
	printf("the result of multiply matrix is :\n");
	matrix_multiply(m1,m2,r,x,y,z);
	return 0;

}

8.8

摘自别人的博客

//八皇后
    #include <stdio.h>
    #include <memory.h>

    #define ROW      8
    #define COLUMN   ROW

    int success = 0;    /*successful times*/

    void show(int* p)
    {
        int i = 0;
        printf("%2d>>> ", success);
        for (i=0;i<COLUMN ; i++ )
        {
            printf("%d, ", p[i]);
        }
        printf("\n");
    }
    int main(int argc, char *argv[])
    {
        int pieces[COLUMN];
        int row      = 0;        /*row in the first column*/
        int column   = 0;        /*the current column*/
        int flag     = 0;        /*is matched in current column*/
        int i        = 0;        /*row int current column*/
        int j        = 0;        /*column from 0 to the one before the current column*/
        int count    = 0;        /*steps need*/
        /*set the pieces all as -1, [0,COLUMN) represents row in the n-th column*/
        memset(pieces, -1, sizeof(pieces));
        //init (0,0) as 0, and the current column add to the next column
        pieces[column]     = 0;
        column++;
        
        while (row < ROW)
        {
            while (column < COLUMN)
            {
                count++;
                flag = 0;
                i = pieces[column] + 1;
    //          if (i>=ROW && column==1)
    //              break;
    //          else if (column==0 && i>5)
    //              break;

                for (i=i; i<ROW ;i++ )
                {
                    for (j=0 ;j<column ;j++ )
                    {
                        if (i==pieces[j] || abs(j-column)==abs(pieces[j]-i))
                        {
                            flag = 0;
                            break;
                        }
                        flag = 1;
                    }
                    if (flag)
                        break;
                }
                if (flag)
                {
                    pieces[column] = i;
                    column++;
                }
                else
                {
                    pieces[column] = -1;
                    column--;
                    if (column == 0)  /*nowhere to go back*/
                        break;
                }
            }/*internal while end*/
            if (flag)
            {
                success++;
                show(pieces);
                flag = 0;
                pieces[column-1]   = -1;
                column   -= 2;
            }
            else
            {
                memset(pieces, -1, sizeof(pieces));
                column = 0;
                row++;
                pieces[column] = row;
                column++;
            }
        }/*external while end*/
        printf("总共步数:%d/nPress Any Key to Continue...\n", count);
        fflush(stdin);
        //getch();
        return 0;
    }


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值