C语言 谭浩强 题目 -第六章

EG 1

逆序输出

#include <stdio.h>
void main()
{
    
    
	int i=0,a[10];
	for(;i<10;i++)
	{
    
    
		a[i]=i;
	}
	for(i=9;i>=0;i--)
	{
    
    
		printf("%d\t",a[i]);
	}
}

EG 2

计算斐波那契数列

#include <stdio.h>
void main()
{
    
    
	int i=0,f[40]={
    
    1,1};
	// i 从2开始
	for(i=2;i<40;i++)
	{
    
    
		f[i]=f[i-1]+f[i-2];
	}
	for(i=0;i<40;i++)
	{
    
    
		if(i%5==0) printf("\n");
		printf("%d\t",f[i]);
	}
}

EG 3 排序

排序

冒泡排序

#include <stdio.h>
void main()
{
    
    
	void bubbleSort(int *arr);
	printf("请输入:");
	int i=0,j,arr[5];
	while((i-5)!=0)
	{
    
    
		scanf("%d",&arr[i]) ;
		i++;
	}
	bubbleSort(arr);
	printf("排序后的数组为:\n");
    for (j = 0; j<5; j++)
        printf("%d ", arr[j]);
    printf("\n"); 
}

void bubbleSort(int *arr) 
{
    
    
	int i,j,tmp;
	for(i=0;i<5-1;i++)
	{
    
    
		for(j=0;j<5-1-i;j++)
		{
    
    
			if(arr[j]>arr[j+1])
			{
    
    
				tmp = arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=tmp;
			}
		}
	}
}

? int *a 与 int b[]
如 int *a 和 int b[]

相同点

a和b的值都表示一片内存区域的地址,都是使用int型进行管理
作为函数的形式参数没有任何区别

区别

a是一个变量,需要分配内存空间进行存储

而b是程序中的一个标号,给编译器提供地址信息,不需要进行保存。因此可以在程序中改变a,但是无法在程序中改变b。

可以使用int b[]定义数组,如 int b[] = {1, 2, 3, 4}, 但是无法使用int *a定义数组 int *a = {1, 2, 3, 4} //语法错误。

EG 4

转置矩阵

#include <stdio.h>

int  main()
{
    
    
	int a[2][3] = {
    
    {
    
    1,2,3},{
    
    4,5,6}};
	int b[3][2],i,j;
	printf("array a = \n");
	for(i=0;i<2;i++)
	{
    
    
		for(j=0;j<3;j++)
		{
    
    
			printf("%5d",a[i][j]) ;
			b[j][i] = a[i][j];
		}
		printf("\n");
	}
	printf("\n");
	printf("array b = \n");
	for(i=0;i<3;i++)
	{
    
    
		for(j=0;j<2;j++)
		{
    
    
			printf("%5d",b[i][j]) ;
		}
		printf("\n");
	}
}

EG 5

求一个3-4矩阵的最大值并输出下标

#include <stdio.h>

int  main()
{
    
    
	double a[3][4];
	int i,j;
	printf("请输入 \n");
	for(i=0;i<3;i++)
	{
    
    
		for(j=0;j<4;j++)
		{
    
    
			scanf("%lf",&a[i][j]) ;
		}
	}
	printf("\n");
	printf("输入的矩阵 = \n");
	for(i=0;i<3;i++)
	{
    
    
		for(j=0;j<4;j++)
		{
    
    
			printf("%lf\t",a[i][j]) ;
		}
		printf("\n");
	}
	printf("\n");
	
	
	double max = 0;
	int row,rol;
	for(i=0;i<3;i++)
	{
    
    
		for(j=0;j<4;j++)
		{
    
    
			if(a[i][j]>max) 
			{
    
    
				max = a[i][j];
				row = i;
				rol = j;
			}
		}
	}
	printf("最大值是%lf \n",max);
	printf("坐标是%d,%d \n",row,rol);
	return 0; 
}

习题 1

  1. 用筛选法求100之内的素数

筛选法:又称为筛法。先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。因为希腊人是把数写在涂腊的板上,每要划去一个数,就在上面记以小点,寻求质数的工作完毕后,这许多小点就像一个筛子,所以就把埃拉托斯特尼的方法叫做“埃拉托斯特尼筛”,简称“筛法”。(另一种解释是当时的数写在纸草上,每要划去一个数,就把这个数挖去,寻求质数的工作完毕后,这许多小洞就像一个筛子。)

#include<stdio.h>
int main()
{
    
    
	int i,j,k;
	int	a[100];
	for (i = 0; i < 100; i++)
		a[i] = i+1;
	
	// 因为1是素数,把a[0]用0标记
	// 最后一个位置数字是100,100不是素数,因此循环可以少循环一次
	a[0] = 0;
	for(i=0;i<99;i++)
	{
    
    
		// 用a[i]位置的数字去模i位置之后的所有数据
		// 如果能够整除则一定不是素数,该位置数据用0填充
		for (j = i + 1; j < 100; j++)
		{
    
    
			if (a[i] != 0 && a[j] != 0)
			{
    
    
				//把不是素数的都赋值为0
				if (a[j] % a[i] == 0)
					a[j] = 0;
	 		} 
	 	}
	}
	printf(" 筛选法求出100以内的素数为:\n");
	for (i = 0; i < 100; i++)
	{
    
    
		//数组中不为0的数即为素数
		if (a[i] != 0)
			printf("%3d", a[i]);
	}

	printf("\n");
	return 0;	
 } 

习题 2 选择排序

用选择法对10个整数排序

选择排序

#include<stdio.h>
int main()
{
    
    
	int array[10]={
    
    1,4,6,89,3,45,56,89,32,56};
	int i, j, k, tmp;
	//求长度 
	int size = sizeof(array) / sizeof(array[0]);
    for (i = 0; i < size - 1; i++) 
    {
    
    
    	k=i;
    	//找最小的过程 
    	for (j = i + 1; j < size; j++) {
    
    
            if (array[j] < array[k]) {
    
    
                k = j;
        	}
    	}
//    	把最小的数字给arr[i] 
        tmp = array[k];
        array[k] = array[i];
        array[i] = tmp;	
	}
	printf("排序后的结果:") ;
	for (i = 0; i < size ; i++) 
    {
    
    
           printf("%d\t",array[i]) ;
	}
	return 0;	
 } 

习题 3

求一个3 X 3的整形矩阵对角线元素之和

#include<stdio.h>
int main()
{
    
    
	int array[3][3];
	int i, j, sum=0;
	printf("请输入3-3矩阵");
	for (i = 0; i < 3; i++) 
    {
    
    
    	for (j = 0; j < 3; j++) {
    
    
            scanf("%d",&array[i][j]); 
    	}
	}
	for (i = 0; i < 3; i++) 
    {
    
    
    	for (j = 0; j < 3; j++) {
    
    
            printf("%d\t",array[i][j]);
            if (i==j) {
    
    
                sum+=array[i][j];
        	}
    	}
    	printf("\n");
	}
	printf("sum = %d\t",sum);
	return 0;	
}

习题 4 插入排序

有一个已经排好序的数组,要求输入一个数后,按原来顺序的规律将它插入数组中
插入排序

从第一个元素开始,该元素可以认为已经被排序;

取出下一个元素,在已经排序的元素序列中从后向前扫描;

如果该元素(已排序)大于新元素,将该元素移到下一位置;

重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;

将新元素插入到该位置后;

重复步骤2~5。

#include<stdio.h>
int main()
{
    
    
	int num=0;
	int array[100] = {
    
    1,2,55,66,77,89,90,455,789,4556};
	printf("请输入一个整数:");
	scanf("%d", &num);
	int j=9;
	while(j >= 0 && (array[j]>num))
	{
    
      
        array[j+1] = array[j];    
        printf("把原来第%d位的%d赋值给第%d位\n",j+1,array[j],j+2);
        j--;
    }  
    printf("第%d位数%d小于%d,把%d插到第%d位\n",j+1,array[j],num,num,j+2);
	array[j+1] = num; 
	for (j = 0 ; j<11; j++) 
	{
    
      
        printf("%d\t",array[j]);
    } 
	return 0;	
}

结果

请输入一个整数:4
把原来第10位的4556赋值给第11位
把原来第9位的789赋值给第10位
把原来第8位的455赋值给第9位
把原来第7位的90赋值给第8位
把原来第6位的89赋值给第7位
把原来第5位的77赋值给第6位
把原来第4位的66赋值给第5位
把原来第3位的55赋值给第4位
第2位数2小于4,4插到第31       2       4       55      66      77      89      90      455     789     4556
--------------------------------
Process exited after 3.589 seconds with return value 0
请按任意键继续. . .

习题 5

将一个数组中的值按逆序重新存放。例如:原来顺序为8,6,5,4,1。要求改为1,4,5,6,8。

  • 简单版
#include<stdio.h>
int main()
{
    
    
	int a[5] = {
    
    8,6,5,4,1};
	int b[5],i;
	for(i=0;i<5;i++)
	{
    
    
		b[4-i]=a[i];
	}
	for(i=0;i<5;i++)
	{
    
    
		printf("%d",b[i]) ;
	}
	return 0;	
}
  • 复杂版本
    手动输入—
#include<stdio.h>
int main()
{
    
    
	int i=0,n;
	int a[100],b[100] ;
	printf("输入长度:");
	scanf("%d",&n);
	printf("输入数字:");
	for(i=i;i<n;i++)
	{
    
    
		scanf("%d",&a[i]); 
	}
	for(i=0;i<n;i++)
	{
    
    
		b[n-i-1]=a[i];
	}
	for(i=0;i<n;i++)
	{
    
    
		printf("%d\t",b[i]) ;
	}
}
  • 地狱版本

不定长数组的输入问题C/C++实现

动态规划

#include<stdio.h>
#include <stdlib.h>
#include <string.h>
 
void main(void) 
{
    
     
 
	int i =0;
	char c;
	int count = 10;
	int *a = (int*)malloc(10*sizeof(int));//初始分配10个大小的空间
	int n;
 
    while( scanf("%d",&n)){
    
    
	a[i] = n;
	i++;
	if((c = getchar()) == '\n')
		break;
	if(i>=count)
	{
    
    
		a = (int *)realloc(a,(i+10)*sizeof(int));//当空间不够,继续追加
		count += 10;
	 }
	 }
 
	for(int j = 0; j<i;j++)
		printf("%d ",a[j]);
 
	system("pause");
		return; 
} 

习题 6

  1. 输出一下的杨慧三角(要求输出10行)
    1
    1 1
    1 2 1
    1 3 3 1
    1 4 6 4 1
    1 5 10 10 5 1
#include<stdio.h>
int main()
{
    
    
	int i,j,a[6][6];
	for(i=0;i<6;i++)
	{
    
    
		for(j=0;j<=i;j++)
		{
    
    
			if((i==j)||(j==0))
				a[i][j]=1;
			else
				a[i][j] = a[i-1][j]+a[i-1][j-1];
		}
	}
	for ( i = 0; i < 6; ++i)
	{
    
    
		for ( j = 0; j <= i; ++j)
		{
    
    
			printf("%5d", a[i][j]);
		}
		printf("\n");
	}
}

习题 7

输出"魔方阵"。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如:

8   1   6
3   5   7
4   9   2

要求输出1~n^2 的自然数构成的魔方阵。
————————————————
魔方阵的生成方法为:在第0行中间置1,对从2开始的其余n ^ 2 − 1 个数依次按下列规则存放:

将1放在第1行的中间一列。

从2开始直到n*n止,各数依次按此规律存放:每一个数存放的行比前一个数的行数减1,列数加1。

如果上一行的行数为1,则下一个数的行数为n(指最下一行)。

当上一个数的列数为n时,下一个数的列数应该为1。

如果按上面规律确定的位置有数,或者上一个数是第1行第n列时,则把下一个数放在上一个数的下面。

猜你喜欢

转载自blog.csdn.net/weixin_51552144/article/details/121439692