第六章 习题

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

   #include <stdio.h>
    #include <math.h>
int main ()
{
int i,j,n,a[101];
for (i = 1; i <= 100; i++)//对数值a赋值,a[0]为空,a[1]为0;
	a[i] = i;
a[1] = 0;
for (i = 2; i < sqrt(100); i++)//求出100 的平方根,从2到100平方根逐个排查,凡能除尽均不是素数,令其得0;
	for (j = i + 1; j <= 100; j++)
	{
		if(a[i] != 0 && a[j] != 0)
		  if (a[j] % a[i] == 0)
			  a[j] = 0;
	}
	printf("\n");
	for (i = 2,n = 0; i <= 100; i++)//n到10 换行。
	{
		if (a[i] != 0)
		{
			printf("%5d",a[i]);
			n++;
		}
		if (n == 10)
		{
			printf("\n");
	        n = 0;
		}
	}
	printf("\n");
	return 0;
}

在这里插入图片描述
2.用选择法对10 个整数排序

#include <stdio.h>
int main()
{
int a[10];
int i, j, b;
printf("请输入十个整数:\n");
for (i = 0; i < 10; i++) //循环输入十次数值
	scanf("%d",&a[i]);
printf("\n");
for (j = 0; j < 9; j++)//利用j来循环十次
	for (i = 0; i < 9 - j ; i++)//j的每次循环都将最大数后移
		if (a[i] > a[i+1])
		{
			b = a[i];
			a[i] = a[i+1];
			a [i+1] = b;//对其赋值
		}
printf ("从小到大排序为:\n");
for (i = 0; i < 10; i++) //挨个输出
printf("%d ",a[i]);
printf("\n");
return 0;
}

在这里插入图片描述

#include <stdio.h>
int main()
{
int i,j,min,temp,a[11];
printf("请输入数值:\n");
for (i = 1; i <= 10; i++)
{
	printf("a[%d]=",i);
	scanf("%d",&a[i]);
}
printf("\n");
printf("原始数值为:\n");
for(i = 1; i <= 10; i++)
	printf("%5d",a[i]);
printf("\n");
for (i = 1; i <= 9; i++)
{
	min = i;
for (j = i + 1; j <= 10; j++)
	if (a[min] >a[j])
	    min= j;
	temp = a[i];
	a[i] = a[min];
	a[min] = temp;
}
printf("整数排序为:\n");
for (i = 1; i <= 10; i++)
	printf("%5d ",a[i]);
printf("\n");
return 0;
}

在这里插入图片描述
3.求一个3*3的整型矩阵对角线元素之和

#include <stdio.h>
int main()
{
int a[3][3],i,j,n,s;
printf("请输入数值:\n");
for (i = 0; i < 3; i++)
	for(j = 0; j < 3; j++)
		scanf("%d",&a[i][j]);
n = a[0][0] + a[1][1] + a[2][2];
s = a[0][2] + a[1][1] + a[2][0];
printf("n=%d\ns=%d\n",n,s);
return 0;
}

在这里插入图片描述

#include <stdio.h>
int main()
{
int a[3][3],i,j,n = 0;
printf("请输入数值:\n");
for (i = 0; i < 3; i++)
	for(j = 0; j < 3; j++)
		scanf("%d",&a[i][j]);
for (i = 0; i < 3; i++)
	n = n + a[i][i];
printf("n=%d\n",n);
return 0;
}

在这里插入图片描述
4.有一个已拍好序的数组,要求输入一个数后,按原来排序的规律将他插入数组中

#include <stdio.h>
int main()
{
int a[11] = {1,2,31,44,65,77,88,99,123,222};
int i, j, b, c,d;
printf("原值为:\n");
for (i = 0; i < 10; i++)
	printf("%5d ",a[i]);
printf("\n");
printf("请输入数值:");
scanf("%d",&b);
if (b > a[9])
	a[10] = b;
else
{
	for (i = 0; i < 10; i++)
		if (a[i] > b)
		{
			c = a[i];
			a[i] = b;
			for (j = i + 1; j < 11; j++)
			{
				d = a[j];
				a[j] = c;
				c = d;
			}
			break;
		}
}
printf("排序后为:\n");
for (i = 0; i < 11; i++)
	printf("%5d",a[i]);
printf("\n");
return 0;
}

在这里插入图片描述

5.讲一个数组中的值按逆序从新存放。

 # include <stdio.h>
 # define N 5
int main()
{
int a[5],i,j,t;
printf("请输入原值:\n");
for (i = 0; i < N; i++)
	scanf("%5d",&a[i]);
printf("\n");
printf("从小到大排序为:\n");
for (i = 0; i < N - 1; i++)
	for(j = i+1; j < N; j++)
		if (a[i] > a[j])
		{
			t = a[i];
			a[i] = a[j];
			a[j] = t;
		}
for (i = 0; i < N; i++)
printf("%5d",a[i]);
printf("\n");
printf("从大到小排序为:\n");
for (i = 0; i < N - 1; i++)
	for(j = i + 1; j < N; j++)
		if (a[i] < a[j])
		{
			t = a[i];
			a[i] = a[j];
			a[j] = t;
		}
for (i = 0; i < N; i++)
	printf("%5d",a[i]);
printf ("\n"); 
}

在这里插入图片描述

# include <stdio.h>
# define N 5
int main()
{
int a[N], i, t;
printf("请输入%d位数值:\n",N);
for (i = 0; i < N; i++)
	scanf("%5d",&a[i]);
printf("原序为:\n");
for (i = 0; i < N; i++)
	printf("%5d",a[i]);
for (i = 0; i < N /2; i++)
{
	t = a[i];
	a[i] = a[N - i -1];
	a[N - i -1] = t;
}

printf("\n逆序为:\n");
for (i = 0; i < N; i++)
	printf("%5d",a[i]);
printf("\n");
return 0;
}

在这里插入图片描述

6.输出杨辉三角形(10行)

 # include <stdio.h>
# define N 10
int main()
{
int a[N][N],i,j,n;
for (i = 0; i < N; i++)
{
	a[i][i] = 1;
	a[i][0] = 1;
}
for (i = 2; i < N; i++)
	for (j = 1; j <= i - 1; j++)
		a[i][j] = a[i - 1][j] + a[i - 1][j - 1];
for (i = 0; i < N; i++)
{
	for(j = 0; j <= i; j++)
		printf("%6d",a[i][j]);
	printf("\n");
}
printf("\n");
return 0;
}

在这里插入图片描述
7.输出魔方阵,要求输出1~n^2的自然是构成的魔方阵

# include <stdio.h>
int main()
{
int a[15][15],i,j,k,p,n;
p = 1;
while ( p == 1)
{
	printf("输入 n( 1 ~ 15 ):");
	scanf("%d",&n);
	if((n != 0) && (n <= 15) && (n %2 != 0))//n应在1~15之间,且须为奇数。
		p = 0;
}
for (i = 1; i <= n; i++)
	for(j = 1; j <= n; j++)
		a[i][j] = 0;//初始化,对方阵内数值置0
j = n / 2 + 1;
a[1][j] = 1;//设方阵第一行中间数值为1;
for (k = 2; k <= n * n; k++)
{
	i = i - 1;
	j = j + 1;
	if ((i < 1) && (j > n))
	{
		i = i + 2;
		j = j - 1;
	}//从第二个数开始至方阵结束,每一个数存放的行比前一个数的行数减1,列数+1;
	//如果数值为第1行最后一个数时,那么下一个为下一行的最后一个值;
	else
	{
		if(i < 1)
			i = n;
		if(j > n)
			j = 1;//如果当前值为第一行,那么下个数值为第n行;
		//如果当前值为最后一列,那么下个数值为第一列;
	}
	if(a[i][j] == 0)
		a[i][j] = k;//如果下个值有位置则放入下个值。
	else
	{
		i = i + 2;
		j = j - 1;
		a[i][j] = k;
	}//如果下个值的位置已经不为0时,放入当前值的下方;
}
for (i = 1;i <= n; i++)//输出魔方阵
{
	for(j = 1;j <= n; j++)
		printf("%5d",a[i][j]);
	printf("\n");
}
return 0;
}

在这里插入图片描述
8.找出一个二维数组的鞍点。

 # include <stdio.h>
# define N 4
# define M 5
int main()
{
int i, j, k, a[N][M],max,maxj,flag;
printf("请输入该数组:\n");//输入数组数值
for (i = 0; i < N; i++)
	for (j = 0; j < M; j++)
		scanf("%d",&a[i][j]);
	for (i = 0; i < N; i++)
	{
		max = a[i][0];//先设每行第一个数为最大数值。
		maxj = 0;
		for (j = 0; j < M; j++)
			if(a[i][j] > max)//如果每行的第二个数比第一个数大,则第二个数为最大数,依次类推到每行的最后数值。
			{
				max = a[i][j];
				maxj = j;
			}
		flag = 1;//先设flag=1为鞍点
	for (k = 0; k < N; k++)
		if (max >a[k][maxj])//将每行的最大数与同列数比相比,如果mxa不是同列数最小数值,则不是鞍点,flag置0;
		{
			flag = 0;
			continue;
		}
		if(flag)//如果是鞍点,则输出a[i][maxj]的值;并结束循环
		{
			printf("a[%d][%d] = %d\n",i,maxj,max);
			break;
		}
	}
if (!flag)//如果flag值为0 ,则输出无鞍点。
	printf("无鞍点!\n");
return 0;
}

在这里插入图片描述
9.有15个数按由大到小顺序存放的在一个数组里,输入一个数,要求折半法查找出该数所在的位置,如果该数不在数组中,则输出无此数

 #include <stdio.h>
 #define N 15
int main()
{
int i,number,top,bott,mid,loca,a[N],flag = 1,sign;
char c;
printf("输入数据:\n");
scanf("%d",&a[0]);//输入第一个数
i = 1;
while(i < N)//检查是否输入完毕
{
	scanf("%d",&a[i]);//输入下一个数
	if(a[i] >= a[i - 1])//如果输入的数不小于前一个数
		i++;//使序号+1
	else
		printf("再次输入此数据:\n");//否者要求从新输入此数
}
printf("\n");
for (i = 0; i < N; i++)
	printf("%5d",a[i]);//输出全部15 个数
printf("\n");
while(flag)
{
	printf("输入要查找的号码:");
	scanf("%d",&number);//输入要查找的数
	sign = 0;//为0时表示尚未找到
	top = 0;//查找区间起始位置
	bott = N - 1;//查找区间最末位置
	if((number < a[0]) || (number > a[N - 1]))//要查找的数不在查找区间内
		loca = -1;//表示未找到
	while ((!sign) && (top <= bott))//循环体
	{
		mid = (bott + top) / 2;//找出中间元素的下标
		if (number == a[mid])//如果要找的数刚好等于中间数值
		{
			loca = mid;//则记下该下标
			printf("已发现 %d ,他的位置是 %d \n",number, loca+1);//由于下标从0 算起,而人们习惯从1算起,所以加1
			sign = 1;//表示找到
		}
		else 
			if(number < a[mid])//否者如果要找的数值小于中间元素
				bott = mid - 1;//则从起始位置0到中间元素的下标查找
			else
				top = mid + 1;//否者从中间元素到最末位置查找
	}
	if (!sign || loca == -1)//如果该数组内没有或者大于该数组则输出未找到
		printf("找不到 %d .\n",number);
	printf("继续与否(Y/N)?");//问是否继续查找
	scanf("%c",&c);
	if	(c == 'N' || c == 'n')//如果不想继续查找输入'N'或'n';
		flag = 0;//flag为开关变量,控制程序是否结束运行,与上方循环体相关联	
	
}
printf("\n");
return 0;
}

在这里插入图片描述
10.有一篇文章,共有三行,每行80个字符,分别统计其中英文大小写字母,数字,空格,其他个数

 # include <stdio.h>
int main()
{
char a[3][80];
int i,j,dx,xx,sz,kg,qt;
dx = xx = sz = kg = qt = 0;
printf("请输入文章:\n");
for (i = 0; i < 3; i++)
{
	printf("第%d行为:\n",i+1);
	gets(a[i]);
	for (j = 0; j < 80 && a[i][j] != '\0'; j++)
	{
		if (a[i][j] <= 'Z' && a[i][j] >= 'A')
			dx++;
		else 
			if (a[i][j] <='z' && a[i][j] >= 'a')
				xx++;
			else
				if (a[i][j] == ' ')
				kg++;
				else
					if (a[i][j] >='0' && a[i][j] <= '9')
						sz++;
					else
						qt++;

	}
}
printf("\n文章中大写字母有%d 个\n小写字母有%d 个\n数字有%d 个\n空格有%d 个\n其他有%d 个\n",dx,xx,sz,kg,qt);
printf("\n");

}

在这里插入图片描述

11.输出以下图案
在这里插入图片描述

# include <stdio.h>
 int main()
{
char a[5] = {'*','*','*','*','*'};
char b = ' ';
int i,j,k;
for (i = 0; i < 5; i++)
{	
	printf("\n");
	for (j = 0; j <= i; j++)
		printf("%c",b);
	for (k = 0; k < 5; k++)
		printf("%c",a[k]);
}
printf("\n");
return 0;
}

在这里插入图片描述

12.有一行电文,按以下规律译成密码
A Z
B Y
C X
.
.
.

# include <stdio.h>
 # include <string.h>
int main()
{
char a[80],b[80];
int i;
printf("请输入密码:");
gets(a);
printf("密码为:");
puts(a);
for (i = 0; i < 80; i++)
{
	if (a[i] >= 'A' && a[i] <= 'Z')
		b[i] = 155 - a[i];
	else
		if (a[i] >= 'a' && a[i] <= 'z')
			b[i] = 219 - a[i];
		else
			b[i] = a[i];
}
printf("原文为:");
puts(b);
return 0;

}

在这里插入图片描述

 #  include <stdio.h>
int main()
{
char a[80],b[80];
int i,j;
printf("请输入密码:");
gets(a);
printf("密码为:%s\n",a);
i = 0;
while(a[i] != '\0')
{
	if ((a[i] >= 'A') && (a[i] <= 'Z'))
		b[i] = 155 - a[i];
	else
		if ((a[i] >= 'a') && (a[i] <= 'z'))
			b[i] = 219 - a[i];
		else
			b[i] = a[i];
		i++;
}
j = i;
printf("原文为:");
for (i = 0; i < j; i++)
    printf("%c",b[i]);
printf("\n");
return 0;

}

13.编一个程序,将两个字符连接起来,不要用strcat函数

 #include <stdio.h>
int main()
{
char a[80],b[80];
int i = 0, j = 0;
printf("请输入数组a:");
gets(a);
printf("请输入数组b:");
gets(b);
while (a[i] != '\0')
	i++;
while (b[j] != '\0')
	a[i++] = b[j++];
	a[i] = '\0';
	printf("%s",a);
printf("\n");
return 0;
} 

在这里插入图片描述

#include <stdio.h>
int main()
{
char a[80], b[80];
int i,n;
printf("请输入数组a:");
gets(a);
printf("请输入数组b:");
gets(b);
n = strlen(a);
for (i = 0; b[i] != '\0';n++, i++)
	a[n] = b[i];
a[n] = '\0';
printf("%s\n",a);
}

在这里插入图片描述

14.将两个字符串s1s2比较,输出为ASCII码的差码

# include <stdio.h>
int main()
{
char s1[80],s2[80];
int i, n;
printf("请输入数组s1:");
gets(s1);
printf("请输入数组s2:");
gets(s2);
for (i = 0; (s1[i] == s2[i]) && (s1[i] != '\0'); i++);
if (s1[i] == '\0' && s2[i] == '\0')
	n = 0;
else
	n = s1[i] - s2[i];
printf("差值为:%d\n",n);
}

在这里插入图片描述

# include <stdio.h>
# include <string.h>
int main()
{
char s1[80],s2[80];
int i, n;
printf("请输入数组s1:");
gets(s1);
printf("请输入数组s2:");
gets(s2);
for (i = 0; (s1[i] == s2[i]) && (s1[i] != '\0'); i++);
if (strcmp(s1,s2) == 0)
	n = 0;
else
	n = s1[i] - s2[i];
printf("差值为:%d\n",n);
return 0;
}

在这里插入图片描述

15.编写将字符s2中全部字符复制到s1中,不用strcpy函数。

# include <stdio.h>
# include <string.h>
int main()
{
char a[80],b[80];
int i;
printf("请输入数组b:");
scanf("%s",b);
for(i = 0; i <= strlen(b); i++)
	a[i] = b[i];
printf("a:%s\n",a);
return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值