第七章 习题

该博客给出多个C语言程序,包括字符串统计、查找最长单词、字符排序、方程求解、学生成绩计算、信息排序与搜索、进制转换、整数输出、日期计算等程序,通过代码实现不同功能,展示了C语言在数据处理和计算方面的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于时间有限,习题问题就不写了,只发程序
1、

 #include <stdio.h>
        int main()
      {
int max(int x, int y);
int min(int x, int y,int n);
int m ,n, t,l;
printf("请输入两个正整数:");
scanf("%d%d",&m,&n);
t = max(m,n);
l = min(m,n,t);
printf("最大公约数为:%d\n最小公倍数为%d\n",t,l);
}
int max(int x, int y)
{
int t,r;
	if ( y < x)
{
	t = y;
	y = x;
	x = t;
}
while (x != 0)
{
	r = y % x;
	y = x;
	x = r;
}
return y;
}
int min(int x, int y, int n)
{
int t;
t = x * y / n;
return t;
}

 #include <stdio.h>
int H;
int L;
int main()
{
void a(int, int);
void b(int, int);
int m,n;
scanf("%d%d",&m,&n);
a(m,n);
b(m,n);
printf("最大公约数为:%d\n最小公倍数为:%d\n",H,L);
return 0;
}
void a(int x, int y)
{
int t, r;
if (x > y)
{
	t = y;
	y = x;
	x = t;
}
while ((r = y % x) != 0)
{
	y = x;
	x = r;
}
H = x;
}

void b(int x, int y)
{
L = x * y / H;
}

3、
#include <stdio.h>
int main()
{
void a(int x);
int b;
printf("请输入一个整数:");
scanf("%d",&b);
a(b);
}
void a(int x)
{
int i,t = 0;
for (i = 2; i < x / 2 && t == 0; i++)
{
	if (x % i == 0)
		t = 1;
}
if (t)
   printf("该数不为素数!\n");
else
	printf("该数为素数!\n");
}

4、

 #include <stdio.h>
 i nt main()
{
void a(int b[3][3]);
int c[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int i, j, n = 0;
printf("原型为:\n");
for (i = 0; i < 3; i++)
{
	for (j = 0; j < 3; j++)
	{
		printf("%4d",c[i][j]);
		n++;
	}
	if (n == 3)
	{
		printf("\n");
		n = 0;
	}
}
printf("\n行换列后:\n");
a(c);
return 0;
}
void a(int b[3][3])

int i,j,n = 0;
for (i = 0; i < 3; i++)
{
	for (j = 0; j < 3; j++)
	{
		printf("%4d",b[j][i]);
		n++;
	}
	if (n == 3)
	{
		printf("\n");
		n = 0;
	}
}
}

5、

#include <stdio.h>
#include <string.h>
int main()
 {
void ab(char b[80]);
char a[80];
printf("输入字符:");
gets(a);
ab(a);
printf("反序为:%s\n",a);
return 0;
}
void ab(char b[80])
{
int i,j,n;
char c[80];
n = i = strlen(b);
for(j = 0; j < n; j++,i--)
	c[j] = b[i-1];
printf("\n");
for(j = 0; c[j] != '\0'; j++)
	b[j] = c[j];
b[n] = '\0';
}

6、

 #include <stdio.h>
#include <string.h>
int main()
{
void a(char b[], char c[]);
char d[80],t[80];
printf("请输入字符串1:");
gets(d);
printf("\n请输入字符串2:");
gets(t);
printf("\n");
a(d,t);
return 0;
}
void a(char b[80], char c[80])
{
strcat(b,c);
printf("%s\n",b);
}

7、

   #include <stdio.h>
int main()
{
void a(char b[]);
char c[80];
printf("请输入字符串:");
gets(c);
printf("\n");
printf("元音字母有:");
a(c);
return 0;
}
void a(char b[80])
{
int i, j;
char d[80];
for (i = 0, j = 0; b[i] != '\0'; i++)
	if (b[i] == 'a' || b[i] == 'A' || b[i] ==
		'e' || b[i] == 'E' || b[i] == 'i' || b[i] ==
		'I' || b[i] == 'o' || b[i] == 'O' || b[i] ==
		'u' || b[i] == 'U')
	{
		d[j] = b[i];
		j++;
	}
	d[j] = '\0';
	printf("%s\n",d); 
}

8、

#include <stdio.h>
int main()
{
void a(char b[]);
char c[10];
printf("请输入四个数字:\n");
gets(c);
printf("输出字符为:\n");
a(c);
printf("\n");
return 0;
}
void a(char b[10])
{
int i,n = 0;
for (i = 0;  b[i] != '\0'; i++)
{
	if (i > 0)
		n++;
	if (n)
	{
	printf(" ");
	n = 0;
	}
	printf("%c",b[i]);
}
}



#include <stdio.h>
#include <string.h>
int main()
{
void a(char b[]);
char c[10];
printf("请输入四个数字:\n");
gets(c);
printf("输出字符为:\n");
a(c);
printf("\n");
return 0;
}
void a(char b[10])
{
int i,n = 0;
for (i =strlen(b);  i > 0; i--)
{
	b[2 * i] = b[i];
	b[2 * i -1] = ' ';
}
printf("%s",b);
}

9、

#include <stdio.h>
int K = 0;
int Z = 0;
int S = 0;
int Q = 0;
int main()
{
void a(char b[]);
char c[80];
printf(“请输入字符串:\n”);
gets©;
printf(“该字符串为:\n”);
puts©;
a©;
printf(“统计如下:\n数字个数为:%d\n字母个数为%d\n空格个数为%d\n其他为:%d\n”,S,Z,K,Q);
return 0;
}
void a(char b[80])
{
int i;
for(i = 0; b[i] != ‘\0’; i++)
if(b[i] >= ‘A’ && b[i] <= ‘Z’ || b[i] >= ‘a’ && b[i] <= ‘z’)
Z++;
else
if(b[i] == ’ ')
K++;
else
if(b[i] >= ‘0’ && b[i] <= ‘9’)
S++;
else
Q++;
}

10、

#include <stdio.h>
#include <string.h>
int main()
{
int alphabetic(char);//判断是否为字母
int longest(char []);//输出最长单词起始位置
int i;
char line[100];
printf(“input one line:\n”);
gets(line);
printf(“The long est word is:”);
for(i = longest(line); alphabetic(line[i]);i++)//从长单词起始位置输出直到不为字母
printf("%c",line[i]);
printf("\n");
return 0;
}
int alphabetic(char c)
{
if ((c >= ‘a’ && c <= ‘z’) || (c >= ‘A’ && c <= ‘Z’))
return(1);
else
return(0);
}
int longest(char string[])
{
int len = 0, length = 0, flag = 1,place = 0, point,i;
for (i = 0; i <= strlen(string); i++)
if(alphabetic(string[i]))//如果为字母的话
if(flag)//记录单词起始位置
{
point = i;
flag = 0;
}
else
len++;//记录单词长度
else//如果不为字母
{
flag = 1;//flag为1
if(len >= length)//如果这个单词长度比上一个单词长
{
length = len;//记录单词长度作下次判断
place = point;//记录这次长单词的起始位置
len = 0;//令len为0 从新计算
}
}
return (place);//输出单词起始位置
}

11、

#include <stdio.h>
char c[10];
int main()
{
void a(char b[10]);
int f;
for(f = 1; f == 1;)
{ printf(“请输入十个字符:\n”);
gets©;
if(strlen© > 10)
printf(“长度大于十,请重新输入!\n”);
else
f = 0;
}
a©;
printf(“由小到大排序后为:\n”);
puts©;
return 0;
}
void a(char b[10])
{
int i,j;
char c;
for (i = 1; i < 10; i++)
for (j = 0; (j < 10 - i) && (b[j] != ‘\0’); j++)//b[j] != '\0’是为了输入少于10个字符的时候可以判断
if (b[j] > b[j + 1])
{
c = b[j];
b[j] = b[j + 1];
b[j + 1] = c;
}
}

12、

#include <stdio.h>
#include <math.h>
int main()
{
float solut(float a,float b,float c,float d);
float a,b,c,d;
printf(“input a,b,c,d;”);
scanf("%f,%f,%f,%f",&a,&b,&c,&d);
printf(“x = %10.7f\n”,solut(a,b,c,d));
return 0;
}
float solut (float a, float b,float c,float d)
{
float x = 1,x0,f,f1;
do
{
x0 = x;
f = ((a * x0 + b) * x0 + c) * x0 + d;
f1 = (3 * a * x0 + 2 * b) * x0 + c;
x = x0 - f / f1;
}
while (fabs(x - x0) >= 1e-3);
return(x);
}

#include <stdio.h>
#define N 10//定义学生数量
#define M 5//课程数量
float score[N][M];//全局数组,存储分数
float a_stu[N],a_cour[M];//学生的平均成绩 / 课程的平均成绩/全局数组
int r,c;//全局变量 储存学生及课程坐标;
int main()
{
int i,j;
float h;
float s_var(viod);//函数声明
float highest();
void input_stu(void);
void aver_stu(void);
void aver_cour(void);
input_stu();//函数调用,输入10个学生成绩
aver_stu();//函数调用,计算10个学生的平均成绩
aver_cour();//计算无门课程的平均成绩
printf("\n NO. cour1 cour2 cour3 cour4 cour5 aver\n");
for(i = 0;i < N; i++)
{
printf("\n NO %2d",i+1);//输出第一个学生号;
for(j = 0; j < M; j++)
printf("%8.2f",score[i][j]);//输出一个学生各门课程的成绩
printf("%8.2f\n",a_stu[i]);//输出一个学生的平均成绩
}
printf("\naverage:");//输出5门课程平均成绩
for(j = 0; j < M; j++)
printf("%8.2f",a_cour[j]);
printf("\n");
h = highest();//调用函数,求最高分和它属于哪个学生·那门课
printf(“highest:%7.2f NO. %2d course %2d\n”,h,r,c);//输出最高分,学生号,课程号

printf("variance %8.2f\n",s_var());//调用函数,计算并输出平方差
return 0;

}
void input_stu(void)//输入10个学生成绩的函数
{
int i,j;
for(i = 0; i < N; i++)
{
printf("\ninput score of student%2d:\n",i+1);//学生好从1开始
for(j = 0;j < M; j++)
scanf("%f",&score[i][j]);
}
}
void aver_stu(void)//计算10个学生平均成绩的函数
{
int i,j;
float s;
for(i = 0; i < N; i++)
{
for (j = 0, s = 0; j < M; j++)
s+=score[i][j];
a_stu[i] = s / 5.0;
}
}
void aver_cour(void)//计算5门课平均成绩的函数
{
int i,j;
float s;
for(j = 0; j < M; j++)
{
s = 0;
for (i = 0;i < N; i++)
s+=score[i][j];
a_cour[j] = s / (float)N;
}
}

float highest()//求最高分和它属于哪个学生,哪门课的函数
{
	float high;
	int i,j;
	high = score[0][0];
	for (i = 0; i < N; i++)
		for (j = 0; j < M; j++)
			if(score[i][j] > high)
			{
				high = score[i][j];
				r = i + 1;//学生号
				c = j + 1;//课程号
			}
	return(high);
}
float s_var(void)//求方差的函数
{
	int i;
	float sumx,sumxn;
	sumx = 0.0;
	sumxn = 0.0;
	for (i = 0; i < N;i++)
	{
		sumx += a_stu[i] * a_stu[i];
		sumxn += a_stu[i];
	}
	return (sumx / N - (sumxn / N) * (sumxn / N));
}

#include <stdio.h>
#include <math.h>
#define N 10;
#define M 5;
char a,b;
int main()
{
void pjf(float fs[10][5]);
void kpjf(float fs[10][5]);
void zgf(float fs[10][5]);
void fc(float fs[10][5]);
float fs[10][5];
float dy = 1.0;
int i,j;
printf(“请输入10个学生5门课程的成绩:\n”);
for (i = 0,a = ‘A’; i < 10; i++,a++)
for(j = 0,b = ‘a’; j < 5; j++,b++)
{
printf("%c同学%c课程分数为:",a,b);
scanf("%f",&fs[i][j]);
}
printf("\n NO. a b c d e 平均分\n");
for (i = 0,a = ‘A’; i < 10; i++,a++)
{
printf("\n%2c同学",a);
for(j = 0; j < 5; j++)
printf("%8.2f",fs[i][j]);
pjf(fs);
printf("\n");
}
printf("\n");
kpjf(fs);
zgf(fs);
fc(fs);
}
void pjf(float fs[10][5])
{
int i,j;
float sum = 0, p = 0;
for (i = 0,a = ‘A’; i < 10; i++,a++)
{
for (j = 0; j < 5; j++)
sum = sum + fs[i][j];
p = sum / 5;
printf("%c同学平均分为:%4.2f\n",a,p);
sum = 0;
}
}
void kpjf(float fs[10][5])
{
int i,j;
float sum = 0, p = 0;
for (j = 0,b = ‘a’; j < 5; j++,b++)
{
for (i = 0; i < 10; i++)
sum = sum + fs[i][j];
p = sum / 10;
printf("%c课程平均分为:%4.2f\n",b,p);
sum = 0;
}
}
void zgf(float fs[10][5])
{
int i,j,x = 0,y = 0;
float max;
max = fs[0][0];
for (i = 0; i < 10; i++)
for (j = 0; j < 5; j++)
if (max < fs[i][j])
{
max = fs[i][j];
x = i;
y = j;
}
a = ‘A’ + x;
b = ‘a’ + y;
printf(“最高分为:%4.2f,为%c同学%c课程。\n”,max,a,b);
}
void fc(float fs[10][5])
{
int i,j;
float pjf,zpjf,p,sum,q;
sum = 0;
p = 0;
q = 0;
pjf = 0.0;
zpjf = 0.0;
for (i = 0,a = ‘A’; i < 10; i++,a++)
{
for (j = 0; j < 5; j++)
sum += fs[i][j];
p = sum / 5;
pjf += p * p;
zpjf += p;
sum = 0;
}
q = pjf / 10 - (zpjf / 10) * (zpjf / 10);
printf(“方差为:%4.2f\n”,q);
}

15、
#include <stdio.h>
#include <string.h>
#define N 10
int main()
{
void input(int [],char name[][8]);//输入信息
void sort(int [],char name[][8]);//排序
void search(int ,int [],char name[][8]);//搜索
int num[N],number,flag = 1,c;//设定num数字,number序号,flag || c 判断式
char name[N][8];//定义名称数组
input(num,name);//输入信息
sort(num,name);//排序
while(flag == 1)//循环flag等于一
{
printf("\ninput number to look for:");//输入要查找的编号
scanf("%d",&number);//输入编号
search(number,num,name);//调用函数查找
printf(“continue ot not(Y/N)?”);//是否继续?
getchar();//输入Y或N
c = getchar();//将ASCII码赋值给c;
if(c == ‘N’ || c == ‘n’)//如果输入n则停止循环
flag = 0;
}
return 0;
}
void input(int num[],char name[N][8])
{
int i;
for (i = 0; i < N; i++)
{
printf(“input NO.:”);//输入序号
scanf("%d",&num[i]);
printf(“input name:”);//输入名称
getchar();
gets(name[i]);
}
}
void sort(int num[],char name[N][8])//排序
{
int i,j,min,templ;//定义ij,最小,模板
char temp2[8];//临时数组
for(i = 0; i < N - 1;i++)
{
min = i;
for (j = i; j < N;j++)
if(num[min] > num[j])//判断将min设为最小序号
min = j;
templ = num[i];//将第一个序号赋给模板
strcpy(temp2,name[i]);//名称一栏数组赋给临时数组
num[i] = num[min];//将最小数组序号赋给当前数组
strcpy(name[i],name[min]);//将当前最小数组序号复制到名称一栏
num[min] = templ;//将当前序号赋给最小序号
strcpy(name[min],temp2);//将名称一栏数组复制到名称最小一栏
}
printf("\n result:\n");
for(i = 0; i < N; i++)
printf("\n %5d%10s",num[i],name[i]);//循环输出排序后的序号名称
}
void search(int n,int num[],char name[N][8])//搜索
{
int top,bott,mid,loca,sign;//定义首部,下部,中间,中心,标示
top = 0;//首部为0
bott = N - 1;//下部为9
loca = 0;//中心为0
sign = 1;//标志为1
if ((n < num[0]) || (n > num[N - 1]))//如果输入的数值n 小于第一位,或者大于最后一位则loca = -1;
loca = -1;
while((sign == 1) && (top <= bott))//循环 如果sign为1 与 第一位top 小于等于最后一位
{
mid = (bott + top) / 2;//中间数值为 第一位序号加最后一位序号/2取值
if (n == num[mid])//如果输入值n等于序号中间为
{
loca = mid;//则,中心为中间位。
printf(“NO. %d, his name is %s.\n”,n,name[loca]);//输出该中间为所在数组的值
sign = -1;//退出循环
}
else if(n < num[mid])//否者如果n小于中间位
bott = mid - 1;//则最后一位移至中间位-1即中间数值前一位
else
top = mid +1;//否者第一位移至中间位的后一位
}
if (sign == 1 || loca == -1)//如果标示为1或数值未找到则输出未找到
printf("%d not been found.\n",n);
}

16、

#include <stdio.h>
#define MAX 1000
int main()
{
int htoi(char s[]);//声明整型函数转换16进制为10进制
char t[MAX];//定义字符数组
int i,c,flag,flag1;//定义整型变量
i = 0;
flag = 0;
flag1 = 1;
printf(“input a HEX number:”);//输入16进制数
while ((c = getchar()) != ‘\0’ && i < MAX && flag1)//循环,当字符不为结束符与循环条件i < 数组下标 与 变量flag1为真
{
if (c >= ‘0’ && c <= ‘9’ || c >= ‘a’ && c <= ‘f’ || c >= ‘A’ && c <= ‘F’)//如果输入数值在0-9之间或a-f之间或A-F之间
{
flag = 1;//flag为真
t[i++] = c;//将该字符赋给数组并i+1;
}
else
if (flag)//否者如果flag为真的话,如果之前输入上个字符在16进制数值范围内而下一字符超出16进制范围
{
t[i] = ‘\0’;//则将结束符赋给该数组值
printf(“decimal number %d\n”,htoi(t));//输出转换后的10进制
printf(“continue or not?”);//问是否继续?
c = getchar();//Y或N
if (c == ‘n’ || c == ‘N’)//如果输入N或n
flag1 = 0;//结束循环
else
{flag = 0;//如果不是N,flag清零,i清零
i = 0;
printf("\ninput a HEX number:");//继续输入16进制数值
}
}
}
return 0;
}
int htoi(char s[])//16进制转换10进制函数
{
int i,n;//设定变量
n = 0;
for(i = 0; s[i]!=’\0’; i++)//循环检查计算每一个字符
{
if (s[i] >= ‘0’ && s[i] <= ‘9’)//如果该字符为数字
n = n * 16 + s[i] - ‘0’;//则值为公式后-0的ascll码
if(s[i] >= ‘a’ && s[i] <= ‘f’)
n = n * 16 + s[i] - ‘a’ + 10;
if (s[i] >= ‘A’ && s[i] <= ‘F’)
n = n * 16 + s[i] - ‘A’ + 10;
}
return (n);
}

17、

#include<stdio.h>
int main()
{
void z(int n);
int n;
printf(“输入整数:”);
scanf("%d",&n);
printf(“输出字符:”);
if(n < 0)
{
putchar("-");
putchar(" “);
n = -n;
}
z(n);
printf(”\n");
return 0;
}
void z(int n)//首先回溯确定i的值,再递归依次输出字符
{
int i;
if((i = n / 10) != 0)
z(i);
putchar(n % 10 + ‘0’);//取最右位转换为字符内对应数值
putchar(32);//空格,ascii码为32
}

18、

#include<stdio.h>
int t = 0;
int main()
{
void ts(int y, int r);
void rn(int n);
int n, y, r;
printf(“请输入年月日(空格分开):”);
scanf("%d%d%d",&n,&y,&r);
ts(y,r);
rn(n);
printf("%d/%d/%d为该年的第%d天。\n",n,y,r,t);
return 0;
}
void ts(int y, int r)
{
int i;
t = 0;
for (i = 1; i < y; i++)
{
if(i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12)
t =t + 31;
else
if(i == 2)
t = t + 28;
else
t = t + 30;
}
t = t + r;
}
void rn(int n)
{
if(((n % 4 == 0)&&(n % 100 != 0)) || ((n % 100 == 0) && (n % 400 == 0)))
t = t + 1;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值