第三章

image.png

1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
#include<math.h>
int main(void)
{
double r=0.07 ,p;
int n=10;
p=pow((1+r),n); //乘方运算
printf("十年后我国国民生产总值与现在相比增长了:%f\n",p);
return 0;
}

存款利息计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
#include<math.h>
int main(void)
{
//int m=1000; //钱数,年数
float p1,p2,p3,p4,p5,m=1000; //年利率,本息和
float r5=0.03,r3=0.0275,r2=0.021,r1=0.015,r0=0.0035;
p1=m*(1+5*r5); //定期存5年
printf("定期存5年本息为:%f\n",p1);
p2=m*(1+2*r2)*(1+3*r3);
printf("定期存2年,本息再存3年为:%f\n",p2);
p3=m*(1+3*r3)*(1+2*r2);
printf("定期存3年,本息再存2年为:%f\n",p3);
p4=m*pow((1+1*r1),5);
printf("连续存五次一年定期为:%f\n",p4);
p5=m*pow((1+r0/4),20);
printf("货期存款本息为:%f\n",p5);
return 0;
}

购房者从银行贷了一笔款,计算多少月能还清

1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
#include<math.h>
int main(void)
{
float d=300000,p=6000,r=0.01,m; //贷款,每月还款,月利率,还清月数
m=(log(p)-log(p-d*r))/log(1+r);
printf("m=%.1f",m); //四舍五入,保留一位小数
return 0;
}

程序分析题

1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
int main(void)
{
char c1,c2; //char类型变量为0~127
c1 = 197;
c2 = 198;
printf("c1=%c,c2=%c\n",c1,c2);
printf("c1=%d,c2=%d\n",c1,c2);
return 0;
}

image.png
image.png

用scanf函数输入元素

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
int main(void)
{
int a,b;
float x,y;
char c1,c2;
scanf("a=%d,b=%d,\n",&a,&b);
scanf("%f%e",&x,&y);
scanf("%c%c",&c1,&c2);
printf("a=%d,b=%d,x=%f,y=%f,c1=%c,c2=%\n",a,b,x,y,c1,c2);
return 0;
}

image.png这样进行输入才能正确执行

将chain译成密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
int main(void)
{
// char a[5]={'C','h','i','n','a'};
char a[5];
printf("请输入需要加密的数据:");
for(int i=0;i<5;++i)
{
scanf("%c",&a[i]);
}
printf("加密后的数据为:\n");
for(int i=0;i<5;i++)
{
a[i]=a[i]+4;
//printf("a[%d]=%c\n",i+1,a[i]);
printf("%c",a[i]);
}
return 0;
}

计算圆周长、圆面积、圆球表面积、圆球体积、圆柱体体积

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
#define p 3.14
int main(void)
{
float r,h;
printf("请输入圆的半径和高:");
scanf("%f%f",&r,&h);
putchar('\n');
printf("圆周长为:%.2f\n",2*p*r);
printf("圆面积为:%.2f\n",p*r*r);
printf("圆球表面积为:%.2f\n",4*p*r*r);
printf("圆球体积为:%.2f\n",(4.0/3.0)*p*r*r*r); //要写成浮点型数据相除,整形相除只保留整数
printf("圆柱体体积为:%.2f\n",p*r*r*h);
return 0;
}

int与char之间的关系

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
int main(void)
{
int c1,c2; //这里用char类型也可以,但char类型有范围
c1=getchar();
c2=getchar();
putchar(c1);
putchar('\n');
putchar(c2);
putchar('\n');
printf("%d\n",c1);
printf("%d\n",c2);
return 0;
}

image.png

第四章

什么是算数运算、什么是关系关系运算、什么是逻辑运算

算数运算:就指的是四则运算,加减乘除,乘法,开方这些运算统称。C语言中,算数运算包含了一系列的运算:+ - * / % ++ —
关系运算:在C语言中,关系运算也可以称为比较运算,作用是用于进行两个量,或者两个表达式结果之间的关系表示 运算符:< > <= >= == !=
逻辑运算:对表达式进行逻辑与或非上的逻辑真假测试 运算符: && || !

C语言中如何表示“真”和“假”?系统如何判断一个量的“真“和“假”?

对于逻辑表达式,若其值为真,则以1表示,若其值为假,则以0表示。但是在判断一个逻辑量的值时,系统会以0作为假,以非0作为真。例如3&&5的值为真,系统给出3&&5的值是1。

写出下面各逻辑表达式的值。设a=3,b=4,c=5

image.png

有三个整数a,b,c,有键盘输入,输出其中最大的数。

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
int main(void)
{
int a,b,c;
printf("请输入三个整数:\n");
scanf("%d%d$d",&a,&b,&c);
if(a>b)
{
if(a>c)
printf("最大值是%d",a);
else
printf("最大值是%d",c);
}else if(b>c)
printf("最大值是%d",b);
else
printf("最大值是%d",c);
return 0;
}

image.png

从键盘输入一个小于1000的正数,要求输出他的平方根(如平方根不是整数,则输出其整数部分)。要求在输入数据后先对其进行检查是否为小于1000的整数。若不是,则要求重新输入。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include<stdio.h>
#include<math.h>
#define M 1000
int main(void)
{
int a,b;
printf("请输入一个小于1000的整数:\n");
scanf("%d",&a);
if(a<0||a>M)
{
printf("输入的数据不符合要求,请重新输入\n");
return 0;
}
b=sqrt(a);
printf("%d的平方根是:%d",a,b);
return 0;
}


#include <stdio.h>
//二分查找
int main() {
int num;
while (1) {
printf("请输入一个小于1000的正数:");
scanf("%d", &num);
if (num < 1000) {
break;
} else {
printf("输入的数不符合要求,请重新输入。\n");
}
}

int low = 0, high = num, result = 0;
while (low <= high) {
int mid = (low + high) / 2;
if (mid * mid <= num) {
result = mid;
low = mid + 1;
} else {
high = mid - 1;
}
}

printf("输入的数的平方根为:%d\n", result);

return 0;
}

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
int main(void)
{
int x;
printf("请输入一个数:\n");
scanf("%d",&x);
if(x<1)
printf("y=%d",x);
if(x>=1&&x<10)
printf("y=%d",2*x-1);
if(x>=10)
printf("y=%d",3*x-11);
return 0;
}

程序分析题

image.png

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<stdio.h>
int main(void)
{
int score; //或者设置为浮点数
printf("请输入你的成绩:");
scanf("%d",&score);
if(score<0 || score>100)
{
printf("成绩输入错误!");
return -1;
}
score=score/10;
switch(score)
{
case 9:
printf("成绩等级为:A\n");
break;
case 8:
printf("成绩等级为:B\n");
break;
case 7:
printf("成绩等级为:C\n");
break;
case 6:
printf("成绩等级为:D\n");
break;
default:
printf("成绩等级为:E\n");
}
return 0;
}

给一个不多于5位的正整数,要求:

  • 求出它是几位数;
  • 分别输出每一位数字;
  • 按逆序输出各位数字,例如原数为321,应输出123
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    #include<stdio.h>
    int main(void)
    {
    int num,num_a,num_b,num_c,num_d,num_e;
    printf("请输入一个0~99999正整数:\n");
    scanf("%d",&num);
    if(num>99999 || num<0)
    {
    printf("输入错误!");
    return -1;
    }
    if(num/10000 != 0)
    {
    printf("这是一个五位数\n");
    num_a=num/10000;
    num_b=num%10000/1000;
    num_c=num%1000/100;
    num_d=num%100/10;
    num_e=num%10;
    printf("分别输出每一位数字:%d,%d,%d,%d,%d\n",num_a,num_b,num_c,num_d,num_e);
    printf("按逆序输出各位数字:%d",num_e*10000+num_d*1000+num_c*100+num_b*10+num_a);
    }
    else if(num/1000 != 0)
    {
    printf("这是一个四位数\n");
    num_a=num/1000;
    num_b=num%1000/100;
    num_c=num%100/10;
    num_d=num%10;
    printf("分别输出每一位数字:%d,%d,%d,%d\n",num_a,num_b,num_c,num_d);
    printf("按逆序输出各位数字:%d",num_d*1000+num_c*100+num_b*10+num_a);
    }
    else if(num/100 != 0)
    {
    printf("这是一个三位数\n");
    num_a=num/100;
    num_b=num%100/10;
    num_c=num%10;
    printf("分别输出每一位数字:%d,%d,%d\n",num_a,num_b,num_c);
    printf("按逆序输出各位数字:%d",num_c*100+num_b*10+num_a);
    }
    else if(num/10 != 0)
    {
    printf("这是一个二位数\n");
    num_a=num/10;
    num_b=num%10;
    printf("分别输出每一位数字:%d,%d\n",num_a,num_b);
    printf("按逆序输出各位数字:%d",num_b*10+num_a);
    }
    else
    {
    printf("这是一个一位数\n");
    printf("分别输出每一位数字:%d\n",num);
    printf("按逆序输出各位数字:%d",num);
    }
    return 0;
    }



    #include<stdio.h>
    int main()
    {
    int i,j=0,k=0,n;
    scanf("%d",&n);
    while(n)
    {
    i=n%10;
    k=k*10+i;
    j++;
    n/=10;
    }
    printf("%d\n",k);
    printf("%d位数",j);
    return 0;
    }
    image.png
    image.png

    image.png

    image.png
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    //用if语句编程序
    #include<stdio.h>
    int main(void)
    {
    double I,p;
    printf("请输入当月利润:");
    scanf("%lf",&I);
    if(I<=100000)
    p=I*0.1;
    else if(I>100000&&I<=200000)
    p=100000*0.1+(I-100000)*0.075;
    else if(I>200000&&I<=400000)
    p=100000*0.1+100000*0.075+(I-200000)*0.05;
    else if(I>400000&&I<=600000)
    p=100000*0.1+100000*0.075+200000*0.05+(I-400000)*0.03;
    else if(I>600000&&I<=1000000)
    p=100000*0.1+100000*0.075+200000*0.05+200000*0.03+(I-600000)*0.015;
    else if(I>1000000)
    p=100000*0.1+100000*0.075+200000*0.05+200000*0.03+400000*0.015+(I-1000000)*0.01;
    printf("应发奖金为:%lf",p);
    return 0;
    }

    //用switch语句编程序
    #include<stdio.h>
    int main(void)
    {
    double I,bonus,bon1,bon2,bon4,bon6,bon10;
    int i;
    printf("请输入当月利润:");
    scanf("%lf",&I);
    bon1=100000*0.1; //利润为100000
    bon2=bon1+100000*0.075; //利润为200000,100000的基础薪资+多出来的100000*0.075
    bon4=bon2+200000*0.05; //利润为400000,200000的基础薪资+多出来的200000*0.075
    bon6=bon4+200000*0.03; //利润为600000,400000的基础薪资+多出来的200000*0.03
    bon10=bon6+400000*0.015; //利润为1000000,400000的基础薪资+多出来的200000*0.015
    i=I/100000;
    if(i>10)i=10;
    switch(i)
    {
    case 0:bonus=I*0.1;break;
    case 1:bonus=bon1+(I-100000)*0.075;break;
    case 2:
    case 3:bonus=bon2+(I-200000)*0.05;break;
    case 4:
    case 5:bonus=bon4+(I-400000)*0.03;break;
    case 6:
    case 7:
    case 8:
    case 9:bonus=bon6+(I-600000)*0.015;break;
    case 10:bonus=bon10+(I-1000000)*0.01;break;
    }
    printf("应发奖金为:%lf",bonus);
    return 0;
    }

    输入四个整数,要求按从小到大顺序输出

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #include<stdio.h>
    int main(void)
    {
    int t,a,b,c,d;
    printf("请输入四个整数:");
    scanf("%d%d%d%d",&a,&b,&c,&d);
    if(a>b)
    {
    t=a;a=b;b=t;
    }
    if(a>c)
    {
    t=a;a=c;c=t;
    }
    if(a>d)
    {
    t=a;a=d;d=t;
    }
    if(b>c)
    {
    t=b;b=c;c=t;
    }
    if(b>d)
    {
    t=b;b=d;d=t;
    }
    if(c>d)
    {
    t=c;c=d;d=t;
    }
    printf("从小到大顺序输出为:%d %d %d %d",a,b,c,d);
    return 0;
    }

    有4个圆塔,圆心分别为(2,2)、(-2,2)、(-2,-2)、(2,-2),圆半径为1,见图4.5.这4个塔的高度为 10m,塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为零)。

    image.png
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include<stdio.h>
    #include<math.h>
    int main(void)
    {
    double x,y,a,b,c,d;
    printf("请输入x,y的坐标:");
    scanf("%lf,%lf",&x,&y);
    a=pow((x-2),2)+pow((y-2),2);
    b=pow((x+2),2)+pow((y-2),2);
    c=pow((x+2),2)+pow((y+2),2);
    d=pow((x-2),2)+pow((y+2),2);
    if(a<=1||b<=1||c<=1||d<=1)
    printf("该坐标的高度为:10m");
    else
    printf("该坐标的高度为:0m");
    return 0;
    }

第五章

请画出三个程序的流程图

image.pngimage.png
image.pngimage.png
image.png

输入两个正整数m和n,求其最大公约数和最小公倍数

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//公约数,亦称“公因数”。它是指能同时整除几个整数的数。如果一个整数同时是几个整数的约数,称这个整数为它们的“公约数”;公约数中最大的称为最大公约数。对任意的若干个正整数,1总是它们的公因数。
//公约数与公倍数相反,就是既是A的约数同时也是B的约数的数,12和15的公约数有1,3,最大公约数就是3。再举个例子,30和40,它们的公约数有1,2,5,10,最大公约数是10。
//在分数的加减乘除中,需要求出分母的最小公倍数,才能进行运算。例如,计算1/3 + 1/4,需要求出3和4的最小公倍数,即12。
#include<stdio.h>
int main(void)
{
int a,b,x,y;
printf("请输入两个正整数:");
scanf("%d%d",&a,&b);
for(int i=1;i<=a;++i)
{
if(a%i==0)
if(b%i==0)
x=i;
}
printf("最大公约数是:%d",x);
return 0;
}



#include<stdio.h>
int main(void)
{
int n,m,p;
printf("请输入两个正整数:");
scanf("%d%d",&n,&m);
if(n<m) //选出较大值
{
int temp = m;
m = n;
n = temp;
}
p=n*m;
while(m!=0) //辗转相除法
{
int r=n%m;
n=m;
m=r;
}
printf("最大公约数是:%d",n);
printf("最小公倍数是:%d",p/n);
return 0;
}

分解质因数法(求最小公倍数)
先把这几个数的质因数写出来,最小公倍数等于它们所有的质因数的乘积(如果有几个质因数相同,则比较两数中哪个数有该质因数的个数较多,乘较多的次数)。

比如求45和30的最小公倍数。
45=335
30=235
不同的质因数是2。5,3是他们两者都有的质因数,由于45有两个3,30只有一个3,所以计算最小公倍数的时候乘两个3.
最小公倍数等于2335=90
又如计算36和270的最小公倍数
36=2
233
270=23335
不同的质因数是5。2这个质因数在36中比较多,为两个,所以乘两次;3这个质因数在270个比较多,为三个,所以乘三次。
最小公倍数等于223335=540
20和40的最小公倍数是40
*公式法

由于两个数的乘积等于这两个数的最大公约数与最小公倍数的积。即(a,b)×[a,b]=a×b。所以,求两个数的最小公倍数,就可以先求出它们的最大公约数,然后用上述公式求出它们的最小公倍数。
例如,求[18,20],即得[18,20]=18×20÷(18,20)=18×20÷2=180。求几个自然数的最小公倍数,可以先求出其中两个数的最小公倍数,再求这个最小公倍数与第三个数的最小公倍数,依次求下去,直到最后一个为止。最后所得的那个最小公倍数,就是所求的几个数的最小公倍数。

输入一行字符,分别统计出其中的英文字母、空格、数字和其他字符的个数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<stdio.h>
int main(void)
{
int eng_char=0,space_char=0,num_char=0,other_char=0;
char c;
printf("请输入一行字符:\n");
//scanf("%c",&c);
while((c=getchar())!='\n')
{
if(c>='a' && c<='z' || c>='A' && c<='Z')
eng_char++;
else if(c==' ')
space_char++;
else if(c>='0'&&c<='9')
num_char++;
else
other_char++;
}
printf("英文字符个数为:%d\n",eng_char);
printf("空格个数为:%d\n",space_char);
printf("数字个数为:%d\n",num_char);
printf("其他个数为:%d\n",other_char);
return 0;
}

求S=a+aa+aaa+·..+aa”a之值,其中a是一个数字,n表示a 的位数n由键盘输人,例如:2+22+222+2222+22222(此时n=5)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
#include<math.h>
int main(void)
{
int a,n,b=0,S=0;
printf("请输入a和n的值:");
scanf("%d%d",&a,&n);
for(int i=0;i<n;i++)
{
b=b+a*pow(10,i);
S=S+b;
}
printf("S的值为:%d",S);
return 0;
}

求1!+2!+3!+4!+…十20!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
int main(void)
{
double b=0; //1到20阶乘的和超过了int能表示的范围
for(int i=1;i<=20;++i)
{
double a=1;
for(int j=1;j<=i;++j)
a=a*j;
b=b+a;
}
printf("1!+2!+3!+4!+...十20!=%lf",b);
return 0;
}

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
int main(void)
{
int k1=0,k2=0;
double k3=0,k;
for(int i=1;i<=100;++i)
k1+=i;
for(int i=1;i<=50;++i)
k2+=i*i;
for(double i=1;i<=10;++i)
k3+=1/i;
k=k1+k2+k3;
printf("所求值为:%lf",k);
return 0;
}

输出所有的“水仙花数”。所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是一水仙花数,因为153=13+53+33

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
int main(void)
{
int a,b,c;
for(int i=100;i<1000;++i)
{
a=i/100;
b=i/10%10;
c=i%10;
if(a*a*a+b*b*b+c*c*c==i)
printf("水仙花数为%d\n",i);
}
return 0;
}

一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为 1,2,3,而6=1+2+3,因此6是“完数”。编程序找出1000之内的所有完数,并按下面格式输出其因子: 6 its factors are 1 2 3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<stdio.h>
int main(void)
{
for(int i=1;i<1000;++i)
{
int a=0;
for(int j=1;j<=i/2;++j) //寻找因子
{
if(i%j==0)
a+=j;
}
if(a==i)
{
printf("%d its factors are ",i);
for(int j=1;j<=i/2;++j)
{
if(i%j==0)
printf("%d ",j);
}
putchar('\n');
}

}
return 0;
}

image.png

分析:数列每一项的关系

  • 后一项的分子 = 前一项的分子 + 前一项的分母
  • 后一项的分母 = 前一项的分子
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include<stdio.h>
    int main(void)
    {
    double a=1,b=2,S=0;
    for(int i=0;i<20;i++)
    {
    double n=b/a;
    double t=b;
    b=b+a;
    a=t;
    S+=n;
    }
    printf("数列前20项之和为:%lf",S);
    }

    一个球从100m高度自由落下,每次落地后反跳回原高度的一半,再落下,再反弹求它在第10次落地时,共经过多少米,第10次反弹多高。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include<stdio.h>
    int main(void)
    {
    double h=100,s=100;
    for(int i=0;i<10;++i)
    {
    h=h/2;
    s=s+2*h; //从100米高的地方自由落体要先加上100米
    }
    printf("第10次反弹高度为:%lf米\n",h);
    printf("第10次反弹共经过:%lf米",s);
    return 0;
    }

    猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第 2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第 10 天早上想再吃时,就只剩一个桃子了。求第1天共摘了多少个

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    第一天:n个桃子 吃了n/2+1个 剩余n/2-1
    #include<stdio.h>
    int main(void)
    {
    double a=1;
    for(int i=0;i<9;++i)
    {
    a=(a+1)*2;
    }
    printf("第一天公摘了%lf个桃子",a);
    return 0;
    }

    image.png

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include<stdio.h>
    #include<math.h>
    int main(void)
    {
    double a,x1,x2;
    printf("请输入一个数:");
    scanf("%lf",&a);
    x1=a;
    x2=(x1+a/x1)/2;
    while(fabs(x1-x2)>=1e-5) //1e-5=10^-5
    {
    x1=x2;
    x2=(x1+a/x1)/2;
    }
    printf("%lf平方根为:%lf",a,x2);
    return 0;
    }

    牛顿迭代法

    image.png
    image.png
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include<stdio.h>
    #include<math.h>
    int main()
    {
    double x1,x2=1.5,a,f,f1;
    do
    {
    x1=x2;
    f=2*x1*x1*x1-4*x1*x1+3*x1-6;
    f1=6*x1*x1-8*x1+3; //方程的导数
    x2=x1-f/f1;
    }while(fabs(x2-x1)>=1e-5);
    printf("方程在1.5附近的根为:%lf",x2);
    return 0;
    }

    image.png

    image.png

    输出图案

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #include<stdio.h>
    int main()
    {
    printf(" * \n");
    printf(" * * * \n");
    printf(" * * * * * \n");
    printf("* * * * * * *\n");
    printf(" * * * * * \n");
    printf(" * * * \n");
    printf(" * \n");
    return 0;
    }
    #include<stdio.h>
    int main()
    {
    int i,j,k;
    for(i=0;i<=3;i++)
    {
    for(j=0;j<=2-i;j++)
    printf(" ");

    for(k=0;k<=2*i;k++)
    printf("*");
    printf("\n");
    }
    for(i=0;i<=2;i++)
    {
    for(j=0;j<=i;j++)
    printf(" ");
    for(k=0;k<=4-2*i;k++)
    printf("*");
    printf("\n");
    }
    return 0;
    }

    两个乒乓球队进行比赛,各出3人。甲队为A,B,C3人,乙队为X,Y,Z3人。已抽签决定比赛名单。有人向队员打听比赛的名单,A 说他不和X比,C说他不和XZ比,请编程序找出3对赛手的名单。

    image.png
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #include<stdio.h>
    int main()
    {
    int A,B,C;
    for(char i='X';i<='Z';++i)
    {
    A=i;
    for(char j='X';j<='Z';++j)
    {
    if(i!=j)
    {
    B=j;
    for(char k='X';k<='Z';k++)
    {
    if(k != i && k!= j)
    {
    C=k;
    if(A!='X'&&C!='X'&&C!='Z')
    printf("A和%c,B和%c,C和%c比赛\n",A,B,C);
    }
    }
    }
    }
    }

    return 0;
    }

    第六章

    用筛选法求100以内的素数

    image.png
    image.png
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #include<stdio.h>			//素数:只能被1或者本身整除的数叫做素数
    int main(void)
    {
    int a[101]; //因为数组是从a[0]开始的,但下面的定义是从a[1]到a[100]
    for(int i=1;i<=100;++i) //对数组进行赋值
    {
    a[i]=i;
    }
    a[1]=0;
    for(int i=2;i<=100;i++) //筛选
    {
    for(int j=i;j<=100;j++)
    {
    if(a[j+1]%i==0)
    a[j+1]=0;
    }
    }
    printf("素数分别为:\n");
    for(int i=1;i<=100;++i) //对数组进行赋值
    {
    if(a[i] != 0)
    printf("a[%d]=%d\n",i,a[i]);
    }
    return 0;
    }

    用选择法对10个整数排序

    image.png
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #include<stdio.h>
    int main(void)
    {
    int a[10];
    printf("请输入10个数字:\n");
    for(int i=0;i<10;i++)
    {
    scanf("%d",&a[i]);
    }
    for(int j=0;j<10;j++)
    {
    for(int i=0;i<10-j;i++)
    {
    if(a[i]>a[i+1])
    {
    int b=a[i];
    a[i]=a[i+1];
    a[i+1]=b;
    }
    }
    }
    printf("顺序排列为:\n");
    for(int i=0;i<10;i++)
    {
    printf("%d,",a[i]);
    }
    return 0;
    }

求一个3×3的整型矩阵对角线之和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
int main(void)
{
int a[3][3];
printf("请输入矩阵元素:\n");
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
printf("a[%d][%d]=",i,j);
scanf("%d",&a[i][j]);
putchar('\n');
}
}
printf("矩阵对角线之和为:%d",a[0][0]+a[1][1]+a[2][2]);
return 0;
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<stdio.h>			//素数:只能被1或者本身整除的数叫做素数
int main(void)
{
int b,a[]={7,13,25,37,49},d;
d=sizeof(a)
printf("请输入一个数字:");
scanf("%d",b);
for(int i=0;i<d;i++)
{
if(b<a[i])
{
//int c=a[i];
//a[i]=b;
for(int j=d;j>=i;j--)
{
a[j+1]=a[i];
}
}
a[i]=b;
break;
}
for(int i=0;i<d;i++)
{
printf("a[%d]=%d\n",i,a[i]);
}
return 0;
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<stdio.h>
int main(void)
{
int a[5];
printf("请输入五个数字:\n");
for(int i=0;i<5;i++) //数组赋值
{
scanf("%d",&a[i]);
}
for(int i=0;i<5;i++) //比较大小
{
for(int i=0;i<5-i;i++)
{
if(a[i]>a[i+1])
{
int b=a[i+1];
a[i+1]=a[i];
a[i]=b;
}
}
}
printf("逆序输出为:");
for(int i=0;i<5;i++) //数组赋值
{
printf(" %d ",a[i]);
}
}

输出杨辉三角

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<stdio.h>
#define N 10
int main(void)
{
int a[N][N]={0}; //定义一个10行20列的数组
a[0][0]=1;
for(int i=1;i<N;i++)
{
for(int j=0;j<N;j++)
{
a[i][0]=1;
//a[i][j]=1;
a[i][j+1]=a[i-1][j]+a[i-1][j+1];
}
}
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
if(a[i][j]!=0)
{
printf(" %d ",a[i][j]);
}
}
putchar('\n');
}
return 0;
}

输出“魔方阵”。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如,三阶魔方阵为,要求求出1~n2的自然数构成的方阵

8 1 6
3 5 7
4 9 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<stdio.h>
#define N 15
int main(void)
{
int b,row=0,col,prerow,precol;
printf("请输入奇数阶魔方阵的阶数:\n");
scanf("%d",&b);
if(b%2==0)
{
printf("您输入的数不是奇数");
return 0;
}
int a[b][b]={0};
col=b/2;
a[row][col]=1;
for(int i=2;i<=b*b;i++)
{
row--; //行
col++; //列
if(row<0)
row=b-1;
if(col>=b)
col=0;
if(a[row][col]!=0)
{
row=prerow+1;
col=precol;
}
a[row][col]=i;
prerow=row;
precol=col;
}
printf("%d阶魔方阵为:\n",b);
for(int i=0;i<b;i++)
{
for(int j=0;j<b;j++)
{
printf("%4d",a[i][j]);
}
putchar('\n');
}
return 0;
}

找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//鞍点:行的最大值,列的最小值
#include<stdio.h>
#define N 5
int main()
{
int a[N][N],b=1,maxcol=0,minrow=0,max=0,min=0,maxrow;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
a[i][j]=b;
b++;
}
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
if(a[i][j]>max)
{
maxcol=j; //一行中的最大值的列标赋值给maxcol
maxrow=i;
max=a[i][j];
}
}
for(int j=0;j<N;j++)
{
if(a[j][maxcol]<min)
{
minrow=j; //一列中的最小值的行标赋值给minrow

min=a[j][maxrow];
}

}
if(maxrow==minrow) //判断该行的最大值与该最大值所处该列的最小值是否是同一个值
{
printf("鞍点为:a[%d][%d]=%d\n",minrow,maxcol,a[minrow][maxcol]);
}
}
return 0;
}
}

有 15 个数按由小到大顺序存放在一个数组中,输人一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include<stdio.h>
#define N 9
int main(void)
{
int a[N],b,right,left,mid,find,flag=1;
char c;
printf("数组下标从0~14\n");
printf("请由小到大输入数据:\n");
scanf("%d",&a[0]);
for(int i=1;i<N;i++)
{
scanf("%d",&a[i]);
if(a[i]<a[i-1])
{
printf("输入错误,请重新输入!");
return 0;
}
}
while(flag)
{
right=N; //区间为左闭右开,因为a[N]值不为空
left=0;
find=0;
printf("请输入你想查找的数字:\n");
scanf("%d",&b); //折半查找又称二分查找
while(left<right) //左边的数大于右边时,循环结束
{
mid = (right+left)/2; //元素区间的中间值下标
if(b==a[mid])
{
find=1;
break;
}
else if(b<a[mid])
right=mid; //移动右边的值到新的区间
else if(b>a[mid])
left=mid+1; //移动左边的值到新的区间 ,mid加一是为了防止最后一个数组取不到值的情况
}
if(find)
printf("所查找的数组元素下表为:%d\n",mid);
else
printf("没有查到该元素下标\n");

printf("是否继续查找:(Y/N)?");
scanf(" %c",&c);
if(c=='N'||c=='n')
flag=0;
}
return 0;
}

.有一篇文章,共有3行文字,每行有 80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<stdio.h>
int main(void)
{
char c[3][80];
int upp=0,low=0,dig=0,spa=0,oth=0;
for(int i=0;i<3;i++) //输入数据
{
printf("请输入第%d行字符:\n",i+1);
//scanf("%c",c[i][j]); //scanf只能接收空格之前的值,空格之后的无法接收
gets(c[i]); //专门输入字符串的函数
break;
}
for(int i=0;i<3;i++)
{ //只需在该行中统计到\0的位置即可---\0为字符串的结尾标记
for(int j=0;c[i][j]!='\0';j++)
{
// while((c[i]=getchar()) != '\n')
if(c[i][j]>='A'&& c[i][j]<='Z')
upp++;
else if(c[i][j]>='a'&&c[i][j]<='z')
low++;
else if(c[i][j]>='0' && c[i][j]<='9')
dig++;
else if(c[i][j]==' ')
spa++;
else
oth++;
}
}
printf("大写英文字母有:%d个\n",upp);
printf("小写英文字母有:%d个\n",low);
printf("数字有:%d个\n",dig);
printf("空格有:%d个\n",spa);
printf("其它字符有:%d个",oth);
return 0;
}

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
int main(void)
{
char c[5]={'*','*','*','*','*'};
char space=' ';
for(int i=0;i<5;i++)
{
for(int j=0;j<i;j++)
printf("%c",space);
for(int j=0;j<5;j++)
printf("%c",c[i]);
printf("\n");
}
return 0;
}

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<stdio.h>
int main(void)
{
char c[30]; //输入密码
// int a,i; //密码,原文
printf("请输入密码:\n");
gets(c);
//printf("%c",c); //输出密码
printf("输入的密码:\n");
for(int i=0;c[i]!='\0';i++) //输出密码
{
printf("%c",c[i]);
}
for(int i=0;c[i]!='\0';i++) //转换为原文
{
if(c[i]>='A'&&c[i]<='Z')
c[i]=26-(c[i]-64)+1+64; //可化简为155-c[i]
if(c[i]>='a'&&c[i]<='z')
c[i]=26-(c[i]-96)+1+96; //可化简为219-c[i]
}
putchar('\n');
printf("原文内容为:\n");
for(int i=0;c[i]!='\0';i++)
{
printf("%c",c[i]);
}
return 0;
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
int main(void)
{
char a[20],b[10];
int i=0,j=0;
printf("请输入字符串a: \n");
gets(a);
printf("请输入字符串b: \n");
gets(b);
while(a[i]!='\0')
i++;
while(b[j]!='\0')
a[i++]=b[j++];
a[i]='\0';
printf("连接后的字符串是:%s",a);
return 0;
}

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
#define N 15
int main()
{
char s1[N],s2[N];
int a=0;
printf("请输入字符串s1 s2\n");
gets(s1);
gets(s2);
for(int i=0;s1[i]!='\0';i++)
{
if(s1[i]>s2[i])
a=a+s1[i]-s2[i];
if(s1[i]<s2[i])
a=a+s1[i]-s2[i];
}
printf("两个字符串的差值是:%d",a);
return 0;
}

编写一个程序,将字符数组 s2 中的全部字符复制到字符数组 s1中。不用 strcpy函数。复制时,0也要复制过去。0’后面的字符不复制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
#include<string.h>
#define N 15
int main()
{
char s1[N],s2[N];
printf("请输入字符串s2 \n");
//gets(s1);
gets(s2);
for(int i=0;i<=strlen(s2);i++)
{
s1[i]=s2[i];
}
printf("字符串s1为:%s",s1);
return 0;
}

第七章

写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<stdio.h>
int divisor(int a,int b)
{
int x,y;
if(a>b)
x=b;
else
x=a;
for(int i=1;i<=x;i++)
{
if(a%i==0&&b%i==0) //求最大公约数
y=i;
}
return y;
}
int multiple(int a,int b)
{
int k;
k=a*b/divisor(a,b); //求最小公倍数
return k;
}
int main() //若主函数在上时,需要定义函数声明
{
int a,b;
printf("请输入两个整数:\n");
scanf("%d%d",&a,&b);
divisor(a,b);
printf("最大公约数为:%d",divisor(a,b));
printf("最小公倍数为:%d",multiple(a,b));
return 0;
}

求方程ax2+bz+c=0的根,用3个函数分别求当:b*b-4ac 大于0、等于0和小于0时的根并输出结果。从主函数输入a,b,c的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<stdio.h>
#include<math.h>
double d,x1,x2,p,q; //全局变量
void dayu(int a,int b)
{
x1=(-b+sqrt(d))/(2*a);
x2=(-b-sqrt(d))/(2*a);
}
void dengyu(double a,double b)
{
x1=(-b)/(2*a);
}
void xiaoyu(double a,double b)
{
p=(-b)/(2*a);
q=sqrt(-d)/2*a;
}
int main()
{
// void dayu(double,double);
// void dengyu(double,double);
// void xiaoyu(double,double);
double a,b,c;
printf("请输入a、b、c的值:\n");
scanf("%lf%lf%lf",&a,&b,&c);
d=b*b-4*a*c;
if(d>0)
{
dayu(a,b);
printf("方程有两个实根:x1=%lf,x2=%lf",x1,x2);
}
else if(d==0)
{
dengyu(a,b);
printf("方程有一个根:x1=%lf", x1);
}
else
{
xiaoyu(a,b);
printf("方程有两个复数根:x1=%lf+%lfi,x2=%lf-%lfi",p,q,p,q);
}
return 0;
}

写一个判素数的函数,在主函数输入一个整数,输出是否为素数的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<stdio.h>
int b=1;
int main()
{
int sushu(int);
int a;
printf("请输入一个整数:\n");
scanf("%d",&a);
sushu(a);
if(b)
printf("%d是素数",a);
else
printf("%d不是素数",a);
return 0;
}
void sushu(int a)
{
for(int i=2;i<=a/2;i++)
{
if(a%i==0)
//printf("%d不是素数",a);
b=0;
}
}

写一个函数,使给定的一个3×3的二维整形数组转置,即行列互换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include<stdio.h>
int main()
{
void add(int a[3][3]);
void zhuanzhi(int a[3][3]);
void input(int a[3][3]);
int a[3][3];
add(a);
zhuanzhi(a);
input(a);
return 0;
}
void add(int a[3][3]) //输入数组元素
{
printf("请输入数组元素值:\n");
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
scanf("%d",&a[i][j]);
}
}
}
void zhuanzhi(int a[3][3])
{
int x;
for(int i=0;i<2;i++)
{
for(int j=i;j<3;j++)
{
x=a[i][j];
a[i][j]=a[j][i];
a[j][i]=x;
}
}
}
void input(int a[3][3])
{
printf("转置之后的数组为:\n");
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
printf("%d",a[i][j]);
}
putchar('\n');
}
}

写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<stdio.h>
#include<string.h>
#define N 15
int main()
{
void fanxu(char a[],int);
char a[N];
printf("请输入字符串:\n");
gets(a);
//int size = sizeof(a)/sizeof(a[0]);
int size = strlen(a); //strlen()函数来统计字符串的长度
fanxu(a,size);
printf("反序后的字符串为:\n");
printf("%s",a);
return 0;
}
void fanxu(char a[],int size)
{
for(int i=0;i<size;i++)
{
size--;
if(i!=size)
{
int t=a[i];
a[i]=a[size];
a[size]=t;
}
}
}

写一个函数,将两个字符串连接。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<stdio.h>
#include<string.h>
#define N 30
#define M 15
int main()
{
void lianjie(char a[],char b[]);
char a[N],b[M];
printf("请输入字符串a:");
gets(a);
printf("请输入字符串b:");
gets(b);
lianjie(a,b);
printf("连接后的字符串为:%s",a);
return 0;
}
void lianjie(char a[],char b[])
{
int length=strlen(a); //strlen(a)不是int类型
for(int i=0;b[i]!='\0';i++)
{
a[i+length]=b[i];
}
}

写一个函数,将一个字符中的元音字母复制到另一字符串,然后输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<stdio.h>
#include<string.h>
#define N 30
#define M 15
int main()
{
void yuanyin(char a[],char b[]);
char a[N],b[M];
printf("请输入字符串:");
gets(a);
yuanyin(a,b);
printf("输出获得的元音字母:%s",b);
return 0;
}
void yuanyin(char a[],char b[])
{
int j=0;
for(int i=0;a[i]!='\0';i++)
{
if(a[i]=='A'||a[i]=='E'||a[i]=='I'||a[i]=='O'||a[i]=='a'||a[i]=='e'||a[i]=='i'||a[i]=='o'||a[i]=='u'||a[i]=='U')
{
b[j]=a[i];
j++;
}
}
b[j]='\0';
}

写一个函数,输人一个4位数字,要求输出这4个数字字符,但每两个数字间空一个空格。如输人1990,应输出“1 9 9 0”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<stdio.h>
#include<string.h>
#define N 50
int main()
{
void span(char a[]);
char a[N];
printf("请输入数字:");
gets(a);
span(a);
printf("%s",a);
return 0;
}
void span(char a[])
{
int lenth = strlen(a);
for(int i=lenth-1;i>0;i--)
{
a[2*i]=a[i];
a[2*i-1]=' ';
}
//a[2*lenth]='\0';
}

编写一个函数,由实参传来一个字符串,统计此字符串中字母,数字,空格和其他字符的个数,在主函数中输入字符串以及输出上述的结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<stdio.h>
#define N 50
int zimu=0,num=0,span=0,other=0;
int main()
{
void tongji(char a[]);
char a[N];
printf("请输入字符串:");
gets(a);
tongji(a);
printf("字母个数为:%d",zimu);
printf("数字个数为:%d",num);
printf("空格个数为:%d",span);
printf("其他字符为:%d",other);
return 0;
}
void tongji(char a[])
{
for(int i=0;a[i]!='\0';i++)
{
if(a[i]>='A' && a[i]<='Z')
zimu++;
else if(a[i]>='a'&&a[i]<='z')
zimu++;
else if(a[i]>='0'&&a[i]<='9')
num++;
else if(a[i]==' ')
span++;
else
other++;
}
}

写一个函数,输入一行字符,将此字符串中最长的单词输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<stdio.h>
#define N 50
#define M 50
int main()
{
void len(char a[],char b[]);
char a[N],b[M];
//int size=0;
printf("请输入一行字符串:");
gets(a);
len(a,b);
printf("最长的单词是:%s",b);
return 0;
}
void len(char a[],char b[])
{
int x=0,size=0;
for(int i=0;a[i]!='\0';i++)
{
if(a[i]!=' ')
size++;
else if(size>x)
{
x=size;
for(int j=0;j<x;j++)
{
b[j]=a[i-x+j]; //此处的a[i]=' '
}
size=0;
}
}
}

写一个函数,用”起泡法”对输入的10个字符按由小到大顺序排列。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<stdio.h>
#define N 10
int main()
{
void sort(char a[]); //函数声明
char a[N];
printf("请输入10个字符:\n");
gets(a);
sort(a);
printf("排序后的字符为:");
for(int i=0;i<N;i++)
printf("%c",a[i]);
return 0;
}
void sort(char a[])
{
for(int i=0;i<N;i++)
for(int j=0;j<N-i-1;j++)
{
if(a[j]>a[j+1])
{
char x=a[j];
a[j]=a[j+1];
a[j+1]=x;
}
}
}

用牛顿选代法求根。方程为ax3+bx2+cx+d=0,系数a,b,c,d的值依次为1,2,3,4,由主函数输人。求x在1附近的一个实根。求出根后由主函数输出。

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<stdio.h>
#include<math.h>
int main()
{
double gen(int,int,int,int);
int a,b,c,d;
printf("请分别输入a,b,c,d的值:");
scanf("%d,%d,%d,%d",&a,&b,&c,&d);
//gen(a,b,c,d);
printf("x在1附近的一个实根为:%lf",gen(a,b,c,d));
return 0;
}
double gen(int a,int b,int c,int d)
{
double f,f1,x=1,x0=0;
while(fabs(x-x0)>=1e-3) //1e-3表示科学计数法中的1乘以10的负3次方,即0.001。在科学计数法中,e后面的指数表示10的幂次。因此,1e-3等同于1乘以10的负3次方,即0.001。这种表示方法常用于表示非常小的数,以便简化表示并提高可读性。
{
x0=x;
f=a*x0*x0*x0+b*x0*x0+c*x0+d;
f1=3*a*x0*x0+2*b*x0+c;
x=x-f/f1;
}
return x;
}

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
int main()
{
double p(double,double);
int n,x;
printf("请输入n和x的值:");
scanf("%d%d",&n,&x);
printf("P%d(%d)=%lf",n,x,p(n,x));
return 0;
}
double p(double n,double x)
{
if(n==0)
return 1;
else if(n==1)
return x;
else if(n>1)
return ((2*n-1)*x-p(n-1,x)-(n-1)*p(n-2,x))/n; //递归,可以自己调用自己
}

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include<stdio.h>
#define N 10 //十个学生
#define M 5 //五门课程
int main()
{
void average(double a[][M],double aver[]);
void avercourse(double a[][M],double avcourse[]);
double cha(double aver[]);
void max(double a[][M]);
double a[N][M];
double aver[N],avcourse[M];
for(int i=0;i<N;i++)
{
printf("请输入学生%d的成绩:",i+1);
for(int j=0;j<M;j++)
{
scanf("%lf",&a[i][j]);
}
putchar('\n');
}
average(a,aver);
for(int i=0;i<N;i++)
{
printf("学生%d的平均分是:%lf\n",i+1,aver[i]);
}
avercourse(a,avcourse);
for(int i=0;i<M;i++)
{
printf("第%d门课平均分是:%lf\n",i+1,avcourse[i]);
}
max(a);
// printf("最高分数对应的学生和课程为:%d",max(a));
printf("平均值的方差为:%lf",cha(aver));
return 0;
}
void average(double a[][M],double aver[]) //计算分数的平均值
{
for(int i=0;i<N;i++)
{
double x=0;
for(int j=0;j<M;j++)
{
x=x+a[i][j];
}
aver[i]=x/M;
}
}
void avercourse(double a[][M],double avcourse[]) //计算每门课的平均分
{
for(int i=0;i<M;i++)
{
double x=0;
for(int j=0;j<N;j++)
{
x=x+a[j][i];
}
avcourse[i]=x/N;
}
}
void max(double a[][M]) //找出最高分数
{
double t=0;
int x,y;
for(int i=0;i<N;i++)
{
for(int j=0;j<M;j++)
{
if(a[i][j]>t)
{
t=a[i][j];
x=i;
y=j;
}
}
}
printf("最高分数对应的学生和课程为:%lf %d %d\n",t,x+1,y+1);
}
double cha(double aver[])
{
double sum=0,sum2=0;
for(int i=0;i<N;i++)
{
sum+=aver[i]*aver[i];
sum2+=aver[i];
}
return(sum/N-(sum2/N)*(sum2/N));
}

写几个函数:

①输人10个职工的姓名和职工号;
②按职工号由小到大顺序排序,姓名顺序也随之调整;
③要求输人一个职工号,用折半查找法找出该职工的姓名,从主函数输人要查找的职工号,输出该职工姓名。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include<stdio.h>
#include<string.h>
#define N 10
int main()
{
void sort(char name[N][8],int num[N]);
void search(char name[N][8],int num[N],int b);
char name[N][8]; //定义存放名字的数组
int num[N],b; //定义存放编号的数组
for(int i=0;i<N;i++)
{
printf("请输入第%d个员工的职工号和姓名:\n",i+1);
scanf("%d",&num[i]);
getchar(); //用于忽略回车符号
gets(name[i]);//name[i]指向一个字符数组的指针,该字符数组用于存储输入的字符串。该字符数组必须具有足够的空间来存储输入的字符串,否则可能会导致缓冲区溢出。
}
sort(name,num);
printf("请输入想要查找的值:");
scanf("%d",&b);
search(name,num,b);
return 0;
}
void sort(char name[N][8],int num[N])
{
char u[8];
int t;
for(int i=0;i<N;i++) //由小到大,冒泡排序
{
for(int j=0;j<N;j++) //由小到大,冒泡排序
{
if(num[j]>num[j+1])
{
t=num[j];
num[j]=num[j+1];
num[j+1]=t;
strcpy(u,name[j]); //strcpy(a,b) 把b赋值给a
strcpy(name[j],name[j+1]);
strcpy(name[j+1],u);
}
}
}
printf("排序后\n");
for(int i=0;i<N;i++)
{
printf("第%d个员工的职工号和姓名为:",i+1);
printf("%d %s",num[i],name[i]);
putchar('\n');
}
}

void search(char name[N][8],int num[N],int b) //折半查找(二分查找)
{
int left=0,right=N,flag=0;
int mid=N/2;
while(left<=right)
{
mid=(left+right)/2;
if(num[mid]==b)
{
flag=1;
break;
}
else if(num[mid]>b)
{
right=mid-1;
}
else if(num[mid]<b)
left=mid+1;
}
if(flag)
{
printf("所查找的员工工号和姓名为:%d %s",num[mid],name[mid]);
}
else
printf("没有查找到");
}

写一个函数,输人一个十六进制数,输出相应的十进制数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<stdio.h>
#include<string.h>
#include<math.h>
#define N 50
int main() //十六进制数A~F表示10~16
{
double zhuan(char a[]);
char a[N];
printf("请输入一个十六进制的数:");
gets(a);
int i=0;
while(a[i]!='\0')
{
if((a[i]<='9' && a[i]>='0') || (a[i]<='F' && a[i]>='A') || (a[i]<='f' && a[i]>='a'))
{}
else
{
printf("输入的数据不符合16进制");
return 0;
}
i++;
}
printf("对应的十进制数为:%lf",zhuan(a));
return 0;
}
double zhuan(char a[])
{
double x=0;
int length=strlen(a);
printf("%d\n",length);
for(int i=0;a[i]!='\0';i++)
{
printf("%d\n",a[i]);
if(a[i]<='9' && a[i]>='0') //每个数字与其对应的权重相乘
x=x+(a[i]-'0')*pow(16,length-1); //字符转化成数值
if(a[i]<='F' && a[i]>='A')
x=x+(a[i]-'A'+10)*pow(16,length-1);
if(a[i]<='f' && a[i]>='a')
x=x+(a[i]-'a'+10)*pow(16,length-1);
length--;
}
return x;
}

用递归法将一个整数n转换成字符串。例如输人483,应输出字符串”483”。n的位数不确定,可以是任意位数的整数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<stdio.h>
int main()
{
void digui(int a);
int a;
printf("请输入一个整数:");
scanf("%d",&a);
if(a<0)
{
putchar('-');
putchar(' ');
a=-a;
}
digui(a);
return 0;
}
void digui(int a) //递归函数
{
int i;
if((i=a/10)!=0)
digui(i); //自己调用自己
//putchar(a%10+'0');
printf("%c",a%10+'0'); //a%10取最低位的数
putchar(32); //输出一个空格
}

给出年、月、日,计算该日是该年的第几天。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<stdio.h>
int main()
{
int run(int,int);
int days(int,int);
int year, month, day,flage=0;
printf("请输入年,月,日: ");
scanf("%d %d %d",&year,&month,&day);
if(run(year,flage)&&month>3)
printf("该日是该年的第%d天",days(month,day)+1);
else
printf("该日是该年的第%d天",days(month,day));
return 0;
}
int run(int year,int flage)
{
if((year%4==0 && year%100!=0)||year%400==0)//判断是否是闰年 闰年的判定条件能被4整除,但不能被100整除的都是闰年,能被400整除的年份是闰年
flage=1;
return flage;
}
int days(int month,int day)
{
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
for(int i=0;i<month;i++)
day=day+a[i];
return day;
}

判断所输入的日期是否正确

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include<stdio.h>
int main()
{
int year, month, day;
printf("请输入年,月,日: ");
scanf("%d %d %d",&year,&month,&day);
if(month<=0||month>12)
{
printf("月份输入错误");
return 0;
}else if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{
if(day<0||day>31)
{
printf("输入的月份对应的天分错误");
return 0;
}
}else if(month==2)
{
if((year%4==0 && year%100!=0)||year%400==0)//判断是否是闰年 闰年的判定条件能被4整除,但不能被100整除的都是闰年,能被400整除的年份是闰年
{
if(day>29)
{
printf("输入的月份对应的天分错误");
return 0;
}
}else{
if(day>28)
{
printf("输入的月份对应的天分错误");
return 0;
}
}
}else
if(day>30)
{
printf("输入的月份对应的天分错误");
return 0;
}

return 0;
}

第八章

本章习题均要求用指针方法处理

输入三个整数,按由小到大的顺序输出。

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<stdio.h>
int main()
{
void compare(int *P);
//int a,b,c;
int a[3];
int *p=a;
printf("请输入三个整数:");
for(int i=0;i<3;i++)
scanf("%d",&*(p+i));
compare(p);
printf("从小到大的顺序为:\n");
for(int i=0;i<3;i++)
printf("%d\n",*(p+i));
return 0;
}
void compare(int *p)
{
for(int i=0;i<2;i++)
{
for(int j=0;j<3-i;j++)
{
if(*(p+j)>*(p+j+1))
{
int t=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=t;
}
}
}
}

输入3个字符串,按由小到大的顺序输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<stdio.h>
#include<string.h>
#define N 50
int main()
{
void swap(char *p1,char *p2);
char a[N],b[N],c[N];
printf("请输入字符串a:");
gets(a);
printf("请输入字符串b:");
gets(b);
printf("请输入字符串c:");
gets(c);
if(strcmp(a,b)>0) swap(a,b); //strcmp 字符串比较函数
if(strcmp(a,c)>0) swap(a,c);
if(strcmp(b,c)>0) swap(b,c);
printf("字符串由大到小输出:\n%s\n%s\n%s",a,b,c);
return 0;
}
void swap(char *p1,char *p2)
{
char p[50];
strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p); //strcpy 字符串复制函数
}

输人10个整数,将其中最小的数与第1个数对换,把最大的数与最后一个数对换写3个函数:①输入10个数;②进行处理;③输出10个数。

image.png
arr表示地址 *arr表示该地址对应的值
image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<stdio.h>
#include<string.h>
#define N 10
int main()
{
void input(int *a);
void swap(int *a);
void output(int *a);
int a[N];
input(a);
swap(a);
output(a);
return 0;
}
void input(int *a)
{
printf("请输入10个整数:\n");
for(int i=0;i<N;i++)
{
scanf("%d",a+i);
}
}
void swap(int *a)
{
int *max,*min,*p, t; //此时指针都指向a[0]
max=min=a;
for(p=a+1;p<a+10;p++)
{
if(*p>*max)
max=p;
else if(*p<*min)
min=p;
}
t=a[0]; a[0]=*min; *min=t; //将最小值和数组第一个元素交换
if(*min==*max) max=min; //若最大值刚好是第一个元素, 此时最大值赋值给了min,但max的地址没有发生改变,所以令max=min
t=a[9]; a[9]=*max; *max=t; //将最大值和数组的最后一个元素交换
}
void output(int *a)
{
printf("交换后:\n");
for(int i=0;i<N;i++)
printf("%d",*(a+i));
}

image.png

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<stdio.h>
#define N 10
#define M 4
int main()
{
void input(int *a);
void swap(int *a);
void output(int *a);
int a[N];
input(a);
swap(a);
output(a);
return 0;
}
void input(int *a)
{
printf("请输入10个整数:\n");
for(int i=0;i<N;i++)
{
scanf("%d",a+i);
}
}
void swap(int *a)
{
int *p, t; //此时指针都指向a[0]
for(int i=0;i<N-M;i++)
{
for(p=a+N-M-1-i;p<a+9-i;p++)
{
t=*p;
*p=*(p+1);
*(p+1)=t;
}
}
}
void output(int *a)
{
printf("交换后:\n");
for(int i=0;i<N;i++)
printf("%d ",*(a+i));
}

n个人围成一圈顺序排号。从第1个人开始报数(从1到3报数)凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include<stdio.h>
#define N 50
int main()
{
int baoshu(int *a,int b);
int a[N],b; //b为报数人数
printf("请输入报数人数:");
scanf("%d",&b);
baoshu(a,b);
return 0;
}
void baoshu(int *a,int b)
{
int *p;
p=a;
int i=1; //每个人所报的数
int c=b; //剩余人数
//p=a;
while(c!=1)
{
for(int j=1;j<=b;j++)
{
if(*(p+j)==3)
continue; //如果这个人喊的数是三,就跳过
*(p+j)=i; //每个人喊得数字
if(i==3) //判断剩余人数是否为1
{
i=0;
c--;
}
i++;
}
}
for(int j=1;j<=b;j++)
{
if(*(p+j)!=3)
{
printf("最后留下的是原来第%d号",j);
break;
}
}
}

写一个函数,求一个字符串的长度。在main函数中输入字符串,并求出其长度。

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
#include<string.h>
#define N 50
int main()
{
char a[N];
printf("请输入字符串:");
gets(a);
printf("该字符串长度为:%d",strlen(a));
return 0;
}

有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include<stdio.h>
#include<string.h>
#define N 50
int main()
{
void copy(char *a,int m);
char a[N];
int m;
printf("请输入字符串:");
gets(a);
printf("请输入从第几个字符开始的全部字符复制:");
scanf("%d",&m);
copy(a,m);
return 0;
}
void copy(char *a,int m)
{
char *p;
p=a;
char b[20];
//int lengh=strlen(a);
int j=0;
for(int i=m-1;a[i]!='\0';i++)
{
b[j]=*(p+i);
j++;
}
b[j]='\0'; //'\0'是字符串中的空字符,也被称为空终止符。它的ASCII码值为0。在C语言中,字符串是以'\0'作为结束标志的,即字符串中的字符会一直被读取直到遇到'\0'为止。
printf("复制后的字符串为:");
for(j=0;b[j]!='\0';j++)
{
printf("%c",b[j]);
}
}

输入一行文字,找出其中的大写字母、小写字母、空格、数字以及其他字符各有多少。

image.png

1
2
3
4
5
#include<stdio.h>
int main()
{
int
printf("请输入一行字符:");

写一个函数,将一个3×3的整型矩阵置换。

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include<stdio.h>
int main()
{
int a[3][3];
int *p;
p=&a[0][0]; //通过定义指针,将数组的首地址赋值给指针
printf("请输入数组的元素:");
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
scanf("%d",&a[i][j]);
}
}
for(int i=0;i<3;i++)
{
for(int j=i;j<3;j++)
{
int t=*(p+3*i+j);
*(p+3*i+j)=*(p+3*j+i);
*(p+3*j+i)=t;
}
}
printf("置换后的数组为:\n");
for(int i=0;i<3;i++)
{
printf("%d %d %d",a[i][0],a[i][1],a[i][2]);
putchar('\n');
}
return 0;
}


#include<stdio.h>
int main()
{
int a[3][3];
printf("请输入数组的元素:");
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
scanf("%d",*(a+i)+j); //将数组直接化为指针形式
}
}
//*a=a[0][0] *(a+1)=a[1][0] *(a+1)+1=a[1][1] *a+1=a[0][1]
for(int i=0;i<3;i++)
{
for(int j=i;j<3;j++)
{
int t=*(*(a+i)+j);
*(*(a+i)+j)=*(*(a+j)+i);
*(*(a+j)+i)=t;
}
}
printf("置换后的数组为:\n");
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
printf("%d",*(*(a+i)+j));
}
putchar('\n');
}
return 0;
}

将一个5X5的矩阵中最大的元素放在中心,4 个角分别放4个最小的元素(顺序为从左到右,从上到下依次从小到大存放),写一函数实现之。用main 函数调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include<stdio.h>
int main()
{
void swap(int *p);
int a[5][5];
int *p;
p=&a[0][0]; //*(p+5*i+j)=a[i][j]
printf("请输入数组的元素:\n");
for(int i=0;i<5;i++)
{
scanf("%d %d %d %d %d",&a[i][0],&a[i][1],&a[i][2],&a[i][3],&a[i][4]);
}
swap(p);
printf("转换后的数组为:\n");
for(int i=0;i<5;i++)
{
printf("%d %d %d %d %d\n",a[i][0],a[i][1],a[i][2],a[i][3],a[i][4]);
}
return 0;
}
void swap(int *p)
{
int *pmax,*pmin,temp;
pmax=p; //指针在使用之前需要进行初始化。未初始化的指针可能会指向一个未知的内存地址
pmin=p;
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
if(*pmax<*(p+5*i+j)) //找出最大值的地址赋值给max,最小值地址赋值给min
{
pmax=(p+5*i+j); //将最大值的地址赋值给max
}
if(*pmin>*(p+5*i+j))
{
pmin=(p+5*i+j);
}
}
}
temp=*(p+12); //将最大值赋值给数组中间的变量
*(p+12)=*pmax;
*pmax=temp;
temp=*p; //将最小值赋值给数组左上变量
*p=*pmin;
*pmin=temp;

pmin=p+1;
for(int i=0;i<5;i++) //找出数组中第二小的数
{
for(int j=0;j<5;j++)
{
if((*(p+5*i+j)!=*p)&&(*(p+5*i+j)<*pmin)) //过滤掉最小值的影响
{
pmin=(p+5*i+j);
}
}
}
temp=*(p+4); //将第二小的值赋值给数组右上变量
*(p+4)=*pmin;
*pmin=temp;

pmin=p+1;
for(int i=0;i<5;i++) //找出数组中第三小的数
{
for(int j=0;j<5;j++)
{
if((*(p+5*i+j)!=*(p+4))&&(*(p+5*i+j)!=*p)&&(*(p+5*i+j)<*pmin)) //过滤掉最小值和第二小值的影响
{
pmin=(p+5*i+j);
}
}
}
temp=*(p+20); //将第三小的值赋值给数组左下变量
*(p+20)=*pmin;
*pmin=temp;

pmin=p+1;
for(int i=0;i<5;i++) //找出数组中第四小的数
{
for(int j=0;j<5;j++)
{
if((*(p+5*i+j)!=*(p+20))&&(*(p+5*i+j)!=*(p+4))&&(*(p+5*i+j)!=*p)&&(*(p+5*i+j)<*pmin)) //过滤掉最小值、第二小值和第三小值的影响
{
pmin=(p+5*i+j);
}
}
}
temp=*(p+24); //将第四小的值赋值给数组左下变量
*(p+24)=*pmin;
*pmin=temp;
}

在主函数中输入10个等长的字符串,用另一函数对他们进行排序。然后在主函数输出这10个已排好的字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include<stdio.h>
#include<string.h>
#define N 10
int main()
{
void swap(char a[][50]);
char a[N][50];
for(int i=0;i<N;i++)
{
printf("请输入第%d字符串:",i+1);
gets(a[i]);
}
swap(a);
printf("排序后的字符串为:\n");
for(int i=0;i<N;i++)
{
printf("%s\n",a[i]);
}
return 0;
}
void swap(char a[][50]) //用字符型二维数组
{
for(int i=0;i<N;i++) //冒泡排序,从大到小
{
for(int j=0;j<N-i-1;j++)
{
if(strcmp(a[j],a[j+1])>0) //比较字符串的大小
{
char t[20];
strcpy(t,a[j]); //交换字符串
strcpy(a[j],a[j+1]);
strcpy(a[j+1],t);
}
}
}
}

#include<stdio.h>
#include<string.h>
#define N 10
int main()
{
void swap(char (*p)[50]);
char a[N][50];
char (*p)[50];
p=a;
for(int i=0;i<N;i++)
{
printf("请输入第%d字符串:",i+1);
gets(p[i]);
}
swap(p);
printf("排序后的字符串为:\n");
for(int i=0;i<N;i++)
{
printf("%s\n",p[i]);
}
return 0;
}
void swap(char (*p)[50]) //用指向一维数组的指针做函数参数
{
char temp[20],*t;
t=temp;
for(int i=0;i<N;i++) //冒泡排序,从大到小
{
for(int j=0;j<N-i-1;j++)
{
if(strcmp(p[j],p[j+1])>0) //比较字符串的大小
{
strcpy(t,p[j]); //交换字符串
strcpy(p[j],p[j+1]);
strcpy(p[j+1],t);
}
}
}
}

用指针数组处理上一题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<stdio.h>
#include<string.h>
#define N 10
int main()
{
void swap(char (*p)[50]);
char a[N][50];
char (*p)[50]; //p是一个指针,指向的是具有50个元素的字符数组
p=a;
for(int i=0;i<N;i++)
{
printf("请输入第%d字符串:",i+1);
gets(*(p+i)); //解引用
}
swap(p);
printf("排序后的字符串为:\n");
for(int i=0;i<N;i++)
{
printf("%s\n",*(p+i));
}
return 0;
}
void swap(char (*p)[50])
{
char temp[20],*t;
t=temp;
for(int i=0;i<N;i++) //冒泡排序,从大到小
{
for(int j=0;j<N-i-1;j++)
{
if(strcmp(*(p+j),*(p+j+1))>0) //比较字符串的大小
{
strcpy(t,*(p+j)); //交换字符串
strcpy(*(p+j),*(p+j+1));
strcpy(*(p+j+1),t);
}
}
}
}

image.png

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include<stdio.h>
#include<math.h>
int main()
{
float fsin(float x);
float fcos(float x);
float fexp(float x);
float dfx(float a,float b,float (*p)(float));
float (*p)(float); //指针函数,指向函数的指针
float a1,b1,a2,b2,a3,b3; //积分区间
//函数
// double angle = 45.0; // 角度为45度
// double radian = angle * (3.14159 / 180.0); // 将角度转换为弧度
// double fx = sin(radian); // 计算正弦值
// printf("sin(%.2f) = %.2f\n", angle, result);
printf("请输入a1,b1: "); //输入sinx函数的上下限
scanf("%f,%f",&a1,&b1);
printf("请输入a2,b2: "); //输入sinx函数的上下限
scanf("%f,%f",&a2,&b2);
printf("请输入a3,b3: "); //输入e的x次方的函数的上下限
scanf("%f,%f",&a3,&b3);
p=fsin; //指针指向sinx函数
printf("sinx的积分为:%f\n",dfx(a1,b1,p));
p=fcos; //指针指向cosx函数
printf("cosx的积分为:%f\n",dfx(a2,b2,p));
p=fexp; //指针指向ex函数
printf("ex的积分为:%f",dfx(a3,b3,p));
return 0;

}
float dfx(float a,float b,float (*p)(float))
{
int count=20; //分割数量,将区间分成20等分,微元法
float length=(b-a)/count; //求出微元矩形的长度
float x=a,S=0;
for(int i=1;i<=count;i++) //循环20次
{
x=x+length;
float height = (*p)(x); //求出微元矩形的高度,随这x的变化而变化
S=S+height*length; //矩形面积累加求得积分
}
return S;
}

float fsin(float x) //计算sinx的函数
{
return (sin(x));
}
float fcos(float x) //计算cosx的函数
{
return (cos(x));
}
float fexp(float x) //计算e的x次方的函数
{
return (exp(x));
}

将n个数按输入时顺序的逆序排列,用函数实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
int main()
{
int n;
printf("输入你要输入数据的个数:");
scanf("%d",&n);
int a[n];
printf("请输入%d个数据:\n",n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
printf("逆序排出:\n");
for(int i=0;i<n;i++)
{
printf("%d\n",a[i]);
}
return 0;
}

有一个班4个学生,5门课程。①求第1门课程的平均分;②找出有两门以上课程不及格的学生,输出他们的学号和全部课程成绩及平均成绩;③找出平均成绩在90分以上或全部课程成绩在 85分以上的学生。分别编3个函数实现以上3个要求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include<stdio.h>
#define N 4
#define M 5
int main()
{
double avge(double stu[][M]);
void fail(int stu[N],double couse[][M],double avgescore[N]);
void find(int stu[N],double couse[N][M],double avgescore[N]);
int stu[N]; //学生学号
double couse[N][M]; //4个学生,5门课程
double avgescore[N]; //学生的平均成绩
for(int j=0;j<N;j++)
{
printf("请输入第%d个学生的学号: ",j+1);
scanf("%d",&stu[j]);
}
for(int i=0;i<N;i++)
{
printf("请输入第%d个学生的成绩: \n",i+1);
for(int j=0;j<M;j++)
{
scanf("%lf",&couse[i][j]);
}
}
for(int i=0;i<N;i++) //计算每个学生的平均值
{
double s=0;
for(int j=0;j<M;j++)
{
s=s+couse[i][j];
}
avgescore[i]=s/M;
}
printf("第一门课程的平均分是:%lf",avge(couse));
fail(stu,couse,avgescore);
find(stu,couse,avgescore);
return 0;
}
double avge(double couse[][M]) ///求第1门课程的平均分
{
double S=0;
for(int i=0;i<N;i++)
S=S+couse[i][0];
double avg=S/N;
return avg;
}
void fail(int stu[N],double couse[][M],double avgescore[N]) //找出有两门以上课程不及格的学生
{
printf("\n 有两门以上课程不及格的学生: \n");
for(int i=0;i<N;i++)
{
int t=0;
for(int j=0;j<M;j++)
{
if(couse[i][j]<60)
{
t++;
if(t>=2)
{
printf("学生的学号为: %d",stu[i]);
printf("全部课程成绩: %lf %lf %lf %lf %lf",couse[i][0],couse[i][1],couse[i][2],couse[i][3],couse[i][4]);
printf("学生的平均成绩为: %lf",avgescore[i]);
}
}
}
}
}
void find(int stu[N],double couse[N][M],double avgescore[N]) //找出平均成绩在90分以上或全部课程成绩在 85分以上的学生
{
printf("\n 平均成绩在90分以上或全部课程成绩在 85分以上的学生: \n");
for(int i=0;i<N;i++)
{
if(avgescore[i]>90)
{
printf("学生的学号为: %d\n",stu[i]);
printf("全部课程成绩: %lf %lf %lf %lf %lf\n",couse[i][0],couse[i][1],couse[i][2],couse[i][3],couse[i][4]);
printf("学生的平均成绩为: %lf\n",avgescore[i]);
}else if(couse[i][0]>85 && couse[i][1]>85&&couse[i][2]>85&&couse[i][3]>85&&couse[i][4]>85)
{
printf("学生的学号为: %d\n",stu[i]);
printf("全部课程成绩: %lf %lf %lf %lf %lf\n",couse[i][0],couse[i][1],couse[i][2],couse[i][3],couse[i][4]);
printf("学生的平均成绩为: %lf\n",avgescore[i]);
}
}
}

输人一个字符串,内有数字和非数字字符,例如:A123x45617960?302tab5876将其中连续的数字作为一个整数,依次存放到一数组 a 中。例如,123 放在 a[0],456 放在a[1].·····统计共有多少个整数,并输出这些数。

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include<stdio.h>
#define N 50
int main() //将连续数字字符从字符串中取出来
{
int num(char c[],char a[][10]);
char c[N];
char a[10][10];
printf("请输入字符串:");
fgets(c,1023,stdin); //stdin--标准输入--键盘,从键盘上获取一行数字,最多可获取1023字节
int leng=num(c,a);
printf("输出整数:\n");
for(int i=0;i<leng;i++)
{
printf("%s\n",a[i]);
}
return 0;
}
int num(char c[],char a[][10])
{
char *p=c;
int row=0,col=0; //定义数组的行,列
while(*p!='\0')
{
if(*p>='0'&&*p<='9') //判断是否是数字字符
{
while(*p!='\0'&&*p>='0'&&*p<='9') //循环出一个整体数字字符
{
a[row][col]=*p;
col++;
p++;
}
a[row][col]='\0'; //!!!字符串结尾标志
row++;
col=0;
if(*p=='\0') break;
}
p++;
}
return row;
}

编一程序,输人月份号,输出该月的英文月名。例如,输入3,则输出March,要求用指针数组处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<stdio.h>
int main()
{
char *month[]={ //字符指针数组
NULL, //每个元素都是一个指向字符串的指针
"January", //后续的元素分别指向对应月份的字符串。
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December",
};
int input;
printf("请输入月份:");
scanf("%d",&input);
if(input<=0||input>12)
{
printf("输入错误!");
return -1;
}else
{
printf("%d对应的月份是:%s",input,*(month+input));
}
return 0;
}

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>
#include<stdlib.h>
int main()
{
//分配动态内存空间
int n;
printf("请输入n的数:");
scanf("%d",&n);
int *p=(int *)malloc(sizeof(int)*n);
printf("请输入%d个数:",n);
for(int i=0;i<n;i++)
{
scanf("%d",p+i);
}
printf("输出输入的数:\n");
for(int i=0;i<n;i++)
{
printf("%d\n",*(p+i));
}
free(p); //动态申请的空间并不会随着函数的退出而释放,而是手动申请,手动释放(不释放就是内存泄漏)
return 0;
}

用指向指针的指针的方法对5个字符串排序并输出。

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<stdio.h>
#include<string.h>
#define N 5
int main()
{
void sort(char **p);
char a[N][20],**p;
for(int i=0;i<N;i++)
{
printf("第%d个字符串为:",i+1);
//scanf("%s",a[i]);
gets(a[i]);
}
char *t[N]; //字符指针数组
for(int i=0;i<N;i++)
{
t[i]=a[i]; //将第i个字符串的首地址赋予指针数组t的第i个元素 也可写成t[i]=&a[i][0];
}
p=t; //将字符数组指针赋值给双重指针p
sort(p);
printf("排序后的字符串为:\n");
for(int i=0;i<N;i++)
{
printf("%s\n",*(t+i));
}
return 0;
}
void sort(char **p)
{
char *temp;
for(int j=0;j<N;j++) //冒泡排序,从小到大
{
for(int i=0;i<N-j-1;i++)
{
if((strcmp(*(p+i),*(p+i+1)))>0) //比较字符串大小,*(p+i)>*(p+i+1)后为真
{
temp=*(p+i); //交换字符串地址
*(p+i)=*(p+i+1);
*(p+i+1)=temp;
}
}
}
}

用指向指针的指针的方法对 n个整数排序并输出。要求将排序单独写成一个函数。n个整数在主函数中输入,最后在主函数中输出。

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<stdio.h>
int main()
{
void sort(int **p,int n);
int n;
printf("请输入n的数为:");
scanf("%d",&n);
int a[n],*t[n],**p;
for(int i=0;i<n;i++)
t[i]=&a[i];
printf("请输入%d个数:\n",n);
for(int i=0;i<n;i++)
scanf("%d",t[i]);
p=t;
sort(p,n);
printf("排序后的数为:\n");
for(int i=0;i<n;i++)
printf("%d\n",*t[i]);
return 0;
}
void sort(int **p,int n)
{
int *t;
for(int i=0;i<n;i++) //冒泡排序,由小到大排序
{
for(int j=0;j<n-i-1;j++)
{
if(**(p+j)>**(p+j+1)) //*(p+1)==>t[1] *t[1]==>a[1] **(p+1)==>a[1]
{
t=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=t;
}
}
}
}

第九章

定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<stdio.h>
struct Date{ //定义一个结构体变量
int year;
int month;
int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
}date; //定义结构体变量
int main()
{
struct Date d; //声明结构体变量,也可以用date直接调用
int c,s=0;
printf("请输入年、月、日:");
scanf("%d/%d/%d",&d.year,&d.month,&c); //date.year等
if(d.month>0&&d.month<=12)
{
printf("%d,%d,%d\n",d.year,d.month,d.day[d.month]);
for(int i=1;i<d.month;i++)
{
s=s+d.day[i];
}
if((d.year%4==0&&d.year%100!=0)||d.year%400==0) //判断所输入的年份是闰年,闰年天加一
{
s=s+c+1;
printf("该日在本年中是第%d天",s);
}else{
s=s+c;
printf("该日在本年中是第%d天",s);
}

}
return 0;
}

.编写一个函数 print,输出一个学生的成绩数组,该数组中有5个学生的数据记录每个记录包括num,name,score[3],用主函数输人这些记录,用print 函数输出这些记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<stdio.h>
#define N 5
struct Student{
int num;
char name[20];
float score[3];
}stu[N]; //定义结构体变量
int main()
{
void print(struct Student stu[N]);
for(int i=0;i<N;i++)
{
printf("请输入第%d学生的学号,姓名,成绩:",i+1); //直接调用结构体变量,不需要声明
scanf("%d %s %f %f %f",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
}
print(stu);
return 0;
}
void print(struct Student stu[N])
{
for(int i=0;i<N;i++)
{
printf("第%d个学生信息:",i+1);
printf("学生的学号,姓名,成绩为:%d %s %f %f %f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
}

}

有10个学生,每个学生的数据包括学号、姓名3门课程的成绩,从键盘输入10个学生数据,要求输出3门课程总平均成绩,以及最高分的学生的数据(包括学号、姓名,3门课程成绩、平均分数)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include<stdio.h>
#define N 5
struct Student{
int num;
char name[20];
float score[3];
float aver;
}stu[N];
int main()
{
int swap(struct Student stu[N],float average[]);
float average[3]={0}; //每门课程的平均成绩
for(int i=0;i<N;i++)
{
printf("请输入第%d学生的学号,姓名,成绩:",i+1);
scanf("%d %s %f %f %f",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
}
int j=swap(stu,average);
printf("学号 姓名 课程1 课程2 课程3 平均成绩\n");
for(int i=0;i<N;i++)
{
//printf("第%d个学生信息:",i+1);
printf("%d %s %4.2f %4.2f %4.2f %4.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].aver);
} //前面空四个字格,保留两位小数
for(int i=0;i<3;i++)
{
printf("课程%d的平均分是:%.2f\n",i+1,average[i]);
}
printf("平均分最高的学生信息是:%d %s %.2f %.2f %.2f %.2f\n",stu[j].num,stu[j].name,stu[j].score[0],stu[j].score[1],stu[j].score[2],stu[j].aver);
return 0;
}
int swap(struct Student stu[N],float average[3])
{
for(int i=0;i<N;i++)
{
stu[i].aver=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3; //学生的平均成绩
average[0]+=stu[i].score[0]; //求每门课程分数的总和
average[1]+=stu[i].score[1];
average[2]+=stu[i].score[2];
}
for(int i=0;i<3;i++)
{
average[i]/=N; //计算每门课程的平均成绩
}
int x;
float t=0;
for(int i=0;i<N;i++)
{
if(t<stu[i].aver) //找出成绩最高的学生
{
t=stu[i].aver;
x=i;
}
}
return x;
}

13个人围成一圈,从第1个人开始顺序报号1,2,3。凡报到3者退出圈子。找出最后留在圈子中的人原来的序号。要求用链表处理。

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include<stdio.h>
#define N 13
typedef struct people{ //定义节点
int num;
struct people* next;
}people;
int main()
{
people arr[N]; //用结构体定义包含13个人的数据
people *head=arr; //定义头节点
for(int i=0;i<N;i++)
{
head->num=i+1; //建立环状链表,num存储数字
head->next=&arr[i+1]; //节点指向数组地址
head=head->next; //使pheard指向下一个节点
}
arr[N-1].next=arr; //构成环状
int count = N; //开始报数,定义报数人数,count为1时报数结束
int i=1; //从一开始报数
head=arr; //头指针指向arr
while(count>1)
{
if(head->num==0) //跳过此人
{
head=head->next; //头指针指向下一个节点
continue;
}
if(i==3)
{
printf("第%d个人退出\n",head->num);
head->num=0;
count--;
}
++i; //继续报号
head=head->next;
if(i>3) i=1; //若报号大于三,就重新报号

}
while(head->num==0)
{
head=head->next;
if(head->num!=0)
{
printf("没有退出的人为:%d\n",head->num);
break;
}
}
return 0;
}