1.第三章
纯代公式题
#include<stdio.h>
int main()
{
float p=1.07; //第一年倍数
for (int i = 1; i < 10; i++) //只用循环了9次,因为是从第一年开始
{
p = p * 1.07;
}
printf("%f%%%",p*100);
}
第2题也是代进公式即可
其实也是代给出的公式,这里我们不用公式换个思路思考
#include<stdio.h>
int main()
{
float d = 300000, p = 6000, r = 0.01;
int month = 1; //从第一个月开始,用于计数
for (int i = 0; d => 0; i++) //换到d小于等于0后就结束循环
{
d = (d - p) * (1 + r); //欠的钱每个月都会减p元又会加上减去p后计算的利息
printf("%f\n",d);
month++;
}
printf("%d",month);
}
这一题scanf语句中的第二个a应为x
char与int之间存在着十分灵活的变换
#include<stdio.h>
int main()
{
char c1 = 'C', c2 = 'h', c3 = 'i', c4 = 'n', c5 = 'a';
c1 += 4;
putchar(c1);
c2 += 4;
putchar(c2);
c3 += 4;
putchar(c3);
c4 += 4;
putchar(c4);
c5 += 4;
putchar(c5);
printf("%c%c%c%c%c\n",c1,c2,c3,c4,c5);
}
#include<stdio.h>
int main()
{
float r = 1.5, h = 3;
float pi = 3.14;
printf("圆的周长:%.2f\n", 2 * pi * r);
printf("圆的面积:%.2f\n", pi * r * r);
printf("球的面积:%.2f\n", 4 * pi * r * r);
printf("球的体积:%.2f\n", (4.0 / 3.0) * pi * r * r * r);
printf("圆柱的体积:%.2f\n", pi * r * r * h);
}
int和char不是无条件替换,仅仅限于在ASCII码中的int。无法识别的int会使用‘?’代替。
2.第四章
1.0
2.1
3.1
4.0
5.1
#include<stdio.h>
int main()
{
int a, b, c, t;
scanf("%d %d %d",&a,&b,&c);
if (a > b) //用一个中间变量来装第一次较大的数
{
t = a;
}
else
{
t = b;
}
if (t > c)
{
printf("%d",t);
}
else
{
printf("%d", c);
}
}
#include<stdio.h>
#include<math.h>
int main()
{
float a;
scanf("%f",&a);
if (a >= 1000) //可以用while要求输入正确为止
{
scanf("%f",&a);
}
printf("%.0f\n",sqrt(a));
//下面这种方式会彻底忽略小数部分
int x = sqrt(a);
printf("%d\n",x);
}
#include<stdio.h>
#include<math.h>
int main()
{
int x, y;
scanf("%d", &x);
if (x < 10)
{
if (x >= 1)
{
y = 2 * x - 1;
}
else
{
y = x;
}
}
else
{
y = 3 * x - 11;
}
printf("%d",y);
}
第7题注意if中嵌套if不带花括号下面的else会实行就近原则即可,两个都不符合。
#include<stdio.h>
#include<math.h>
int main()
{
int a;
char c;
scanf("%d",&a);
if (a >= 90)
{
c = 'A';
}
if (a >= 80 && a < 90)
{
c = 'B';
}
if (a >= 70 && a < 80)
{
c = 'C';
}
if (a >= 60 && a < 70)
{
c = 'D';
}
if (a < 60)
{
c = 'E';
}
printf("%c",c);
}
不用循环写就用if判断a是否大于10000,大于1000,大于100,大于10,小于10来判断位数(别忘了还要有下限),
#include<stdio.h>
#include<math.h>
int main()
{
int a, n, count=0;
int b[10];
scanf("%d",&a);
for (int i = 1; i <= 10000; i *= 10) //计算数字的位数
{
if (a > i)
{
count++;
}
}
printf("该数字为%d位数\n",count);
for (int j = 0; j < count; j++) //求出每一位数字
{
n = a % 10; //对10求余可以得到每次的最后一位数字
a = a / 10; //得到最后一位数字可以对a除10来去掉
b[j] = n;
}
for (int z = 0, m=count-1; z < count; z++,m--) //因为上一个for中每次我们得到的是最后一位的数字
{
printf("第%d位数字为:%d\n",z+1, b[m]); //所以数组中的数字是反着放的
if (z == count - 1)
{
for (int q = 0; q < count; q++)
printf("%d",b[q]);
}
}
第10题思路和第8题一样
#include<stdio.h>
int main()
{
int a,b[10],t;
for (int i = 0; i < 4; i++)
{
printf("请输入第%d个数字:",i+1);
scanf("%d",&a);
b[i] = a;
}
for (int n = 0; n < 3; n++) //一共只循环数字个数-1次,
{
for (int j = 0; j < 3; j++) //每一次的循环要比较数字个数-1次
{
if (b[j] > b[j + 1]) //如果后面的数字大于前面的数字则交换顺序
{
t = b[j + 1];
b[j + 1] = b[j];
b[j] = t;
}
}
}
for (int z = 0; z < 4; z++)
{
printf("%d",b[z]);
}
}
转换为求一个点到这四个圆圆心的距离问题,小于1则是在园内,大于1则是在园外。其实不需要判断输入的点在哪个象限,因为这四个圆的对称性,我们只需要把点都变成第一象限的点,这个点到第一象限圆的距离和到其他象限圆的距离是一样的。
#include<stdio.h>
#include<math.h>
int main()
{
double x, y, len, x1 = 2, y1 = 2;
scanf("%lf %lf",&x,&y);
if (x < 0)
{
x = -x;
}
if (y < 0)
{
y = -y;
}
len = sqrt((x1 - x) * (x1 - x) + (y1 - y) * (y1 - y));
if (len <= 1)
{
printf("10");
}
else
{
printf("0");
}
}
3.第五章
穷举法
#include<stdio.h>
int main()
{
int m,n,t=0,d1,d2;
scanf("%d %d", &m, &n);
if (m < n) d1 = m, d2 = n;
else d1 = n, d2 = m; //分出最大最小数有利于减少循环次数
for (int i = 1; i <= d1; i++) //循环到m,n中最小数即可
{
if (m % i == 0 && n % i == 0 && i > t)
{
t = i;
}
}
printf("最大公约数为:%d\n", t);
for (int j = m;; j++) //从m,n中最大数开始循环即可
{
if (j % m ==0 && j % n == 0)
{
t = j;
break;
}
}
printf("最小公倍数为:%d", t);
}
#include<stdio.h>
int main()
{
char a[100], * p = a, t;
int q=0, m=0, n=0, l=0;
gets(a);
for (int i = 0; *p != '\0'; i++, p++)
{
t = *p;
if ((t >= 65 && t <= 90) || (t >= 97 && t <= 122))
{
q++;
}
else if (t == 32)
{
m++;
}
else if (t >= 48 && t <= 57)
{
n++;
}
else
{
l++;
}
}
printf("英文字母有%d个\n", q);
printf("空格有%d个\n", m);
printf("数字有%d个\n", n);
printf("其他字符有%d个\n", l);
}
只要写出1+11+111就能写出n+nn+nnn,11=1+10,111=1+10+100,1111=1+10+100+1000
#include<stdio.h>
int main()
{
int n, sum = 2;
int a = 1, b = 1;
scanf("%d",&n);
for (int i = 0; i < n-1; i++)
{
a *= 10;
b += a;
sum += (b * 2);
printf("%d\n",sum);
}
}
#include<stdio.h>
int main()
{
int sum = 0,t=1;
for (int i = 1; i <= 20; i++)
{
t = 1; //不要忘记每开始一个数字要重置t
for (int j = 1; j <= i; j++)
{
//这里不可令j*=j,因为j在for中语句执行后会再自增1
t = t * j;
printf("%d\n", t);
}
sum += t;
}
printf("%d", sum);
}
#include<stdio.h>
int main()
{
float sum = 0;
float b;
int a;
for (int i = 1; i <= 100; i++)
{
a = i * i;
b = 1.0 / i;
if (i > 50)
{
a = 0;
}
if (a > 10)
{
b = 0;
}
sum += i + a + b;
}
printf("%f",sum);
}
#include<stdio.h>
int main()
{
int m, n, l;
for (int i = 100; i < 1000; i++)
{
m = i / 100;
n = i / 10 % 10;
l = i % 100 % 10;
if (i == m * m * m + n * n * n + l * l * l)
{
printf("%d\n", i);
}
}
}
#include<stdio.h>
int main()
{
for (int i = 2; i <= 1000; i++)
{
int sum = 0;
for (int j = 1; j <= i / 2; j++)
{
if (i % j == 0)
{
sum += j;
}
}
if (sum == i)
{
printf("%d its factors are ",sum);
for (int j = 1; j <= i / 2; j++)
{
if (i % j == 0 && j != i/2)
{
printf("%d, ",j);
}
else if(i % j == 0 && j == i / 2)
{
printf("%d", j);
}
}
printf("\n");
}
}
}
注意循环的次数,当i=1时sum为2/1,当i=2时,sum=2/1+3/2,所以20项的和要进行20次循环
#include<stdio.h>
int main()
{
float a = 1, b = 2, sum = 0, t;
for (int i = 1; i <= 20; i++)
{
sum += b / a;
t = b;
b = a + b;
a = t;
}
printf("%f",sum);
}
#include<stdio.h>
int main()
{
float sum = 100, h = 100, t;
for (int i = 0; i < 9; i++)
{
t = h / 2; //每次回弹上一次h一半的距离
h = h - t; //每次离地面的距离为h-t
sum += 2 * t; //落下和弹起的距离一样
}
printf("%f",sum);
从后向前推,前一天的总数等于后一天的桃子+1个再*2,注意只吃了9天
#include<stdio.h>
int main()
{
int a=1;
for (int i = 0; i < 9; i++)
{
a = (a + 1) * 2;
}
printf("%d",a);
}
#include<stdio.h>
#include<math.h>
int main()
{
double a, x0, x1;
scanf("%lf",&a);
x0 = a / 2;
x1 = 2 * (x0 + a / x0);
for (int i = 0; fabs(x0 - x1) >= 1e-5; i++)
{
x0 = x1;
x1 = (x0 + a / x0) / 2;
}
printf("%lf",x0);
}
代入公式即可
#include<stdio.h>
#include<math.h>
float a3, a2, a1, a0;
float fx(float m) {
float n;
n = a3 * m * m * m + a2 * m * m + a1 * m + a0;
return n;
}
int main() {
float a, b;
float y1, y2, mid;
int flag=0;
scanf("%f %f %f %f", &a3, &a2, &a1, &a0);
scanf("%f %f", &a, &b);
y1 = fx(a);
y2 = fx(b);
if (y1 * y2 < 0)
{
while (fabs(a-b)>=0.01)
{
mid = fx((a + b) / 2);
if (mid == 0)
{
printf("%.2f", (a + b) / 2);
flag = 1;
break;
}
else
{
if (mid * y1 > 0)
{
a = (a + b) / 2;
}
if (mid * y2 > 0)
{
b = (a + b) / 2;
}
}
y1 = fx(a);
y2 = fx(b);
}
}
else if (y1 * y2 == 0)
{
flag = 1;
if (y1 = 0)printf("%.2f",a);
else printf("%.2f", b);
}
if (flag != 1)
{
printf("%.2f", (a + b) / 2);
}
}
纯用循环写,n只能输入奇数。然后中间最长的只能有一行,所以第二个循环初始数i会比n少2
#include<stdio.h>
#include<math.h>
int main()
{
int n;
scanf("%d",&n);
int t = n / 2; //t用于控制输出空格
for (int i = 1; i <= n; i += 2) //输出上面的大三角形
{
for (int z = t; z > 0; z--)
{
printf(" ");
}
for (int j = 1; j <= i; j++)
{
printf("*");
}
printf("\n");
t--;
}
t = 1;
for (int i = n - 2; i > 0; i -= 2) //输出下面的小三角
{
for (int z = 1; z <= t; z++)
{
printf(" ");
}
for (int j = i; j > 0; j--)
{
printf("*");
}
printf("\n");
t++;
}
}
先通过下面的例子了解更清晰的思路,穷举法一力降十会
#include<stdio.h>
int main()
{
int x = 0, y = 1, z = 2;
int a, b, c;
for (a = 0; a <= 2; a++)
{
for (b = 0; b <= 2; b++)
{
for (c = 0; c <= 2; c++)
{
if (a != 0 && c != 0 && c != 2 && a != b && a != c && b != c)
{
printf("A和%d B和%d C和%d",a,b,c);
}
}
}
}
}
然后我们会发现把xzy用字符表示,abc定义为字符型,每个循环令a = X,结束为<=Z,这样就更方便输出了
3.第六章
#include<stdio.h>
/*筛选法:准备一个自然排序的数列,1不是素数,划去;
2是素数,留下,将2的倍数划去;
3没被划去,将3的倍数划去;
以此类推,将i的倍数划去;
留下的就是素数;这里划去我们用标0来实现*/
int main()
{
int a[100];
for (int i = 0; i < 100; i++) //准备有序数组
{
a[i] = i + 1;
}
a[0] = 0; //1不是素数
for (int i = 0; i < 100; i++)
{
if (a[i] != 0) //由于能整除2的数会被变为0,0整除其他的数也是0
{
for (int j = i + 1; j < 100; j++) //a[i]后的数能整除a[i]就置0
{
if (a[j] % a[i] == 0)
{
a[j] = 0;
}
}
}
}
for (int i = 0; i < 100; i++)
{
if (a[i] != 0)
{
printf("%d\n",a[i]);
}
}
}
#include<stdio.h>
int a[10], b, size = 10;
int main()
{
//srand(10);
int x;
void upper();
void lower();
for (int i = 0; i < size; i++)
{
//随机生成20以内的整数
int x = rand()%20;
a[i] = x;
printf("%d ", x);
}
printf("\n");
printf("选择实现的功能(1.升序 2.降序): ");
scanf("%d", &x);
printf("\n");
switch (x)
{
case 1:upper(); break;
case 2:lower(); break;
}
for (int i = 0; i < size; i++)
{
printf("%d ",a[i]);
}
}
void upper()
{
for (int j = 0; j < size; j++)
{
int t = 0; //每次从数组的第一个元素开始比较
for (int i = 1; i < size - j; i++)
{
//通过一个循环找到每次数组最大元素下标
//注意每一次的内循环要比上一次少1,因为不用比较
//上一次交换到最后位置的最大数
if (a[i] > a[t])
{
t = i;
}
}
//实现交换,同样注意下标,不要影响到上一次循环已经交换好的值
b = a[size - j - 1];
a[size - j - 1] = a[t];
a[t] = b;
}
}
void lower()
{
for (int j = 0; j < size; j++)
{
int t = 0; //每次从数组的第一个元素开始比较
for (int i = 1; i < size - j; i++)
{
//通过一个循环找到每次数组最小元素下标
//注意每一次的内循环要比上一次少1,因为不用比较
//上一次交换到最后位置的最小数
if (a[i] < a[t])
{
t = i;
}
}
//实现交换,同样注意下标,不要影响到上一次循环已经交换好的值
b = a[size - j - 1];
a[size - j - 1] = a[t];
a[t] = b;
}
}
#include<stdio.h>
int main()
{
int a[3][3], t = 1, sum = 0;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
a[i][j] = t++;
}
}
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (i == j)
{
sum += a[i][j];
}
}
}
printf("%d",sum);
}
#include<stdio.h>
//在升序的数组中插入
int main()
{
int a[100] = { 2,4,6,8,10,12,14 };
int n = 9, t, f;
for (int i = 0; i < 7; i++) //找到要插入的位置
{
if (a[i] > n)
{
t = i;
break;
}
}
for (int i = 7 + 1; i > t; i--) //从后面开始遍历将前一个数字放到后一个中
{
a[i] = a[i - 1];
}
a[t] = n; //插入数字
for (int i = 0; i < 8; i++)
{
printf("%d ",a[i]);
}
}
#include<stdio.h>
int main()
{
int a[10] = { 8, 6, 5, 4, 1 };
//int a[10] = { 1,4,5,6,8 };
if (a[0] > a[1])
{
for (int i = 0; i < 5; i++)
{
int flag = a[0], t = 0, f = 0;
for (int j = 0; j < 5 - i; j++)
{
if (a[j] > flag)
{
flag = a[j];
f = j;
}
if (j == 5 - i - 1)
{
t = a[j];
a[j] = flag;
a[f] = t;
}
}
}
}
else
{
for (int i = 0; i < 5; i++)
{
int flag = a[0], t = 0, f = 0;
for (int j = 0; j < 5 - i; j++)
{
if (a[j] < flag)
{
flag = a[j];
f = j;
}
if (j == 5 - i - 1)
{
t = a[j];
a[j] = flag;
a[f] = t;
}
}
}
}
for (int i = 0; i < 5; i++)
{
printf("%d ",a[i]);
}
}
#include<stdio.h>
int main()
{
int a[10][10];
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < i + 1; j++)
{
//可以观察出第一列和对角线都是1
if (j == 0 || i == j)
{
a[i][j] = 1;
}
//其他位置上的数等于该数上一行的数+该数左边一列上一行的数
//不用担心越界,因为第一第二行都满足if中的条件
else
{
a[i][j] = a[i - 1][j] + a[i - 1][j - 1];
}
}
}
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < i + 1; j++)
{
printf("%5d",a[i][j]);
}
printf("\n");
}
}
由于魔方阵有奇魔方阵,偶魔方阵,奇偶魔方阵,之后再补。
在该列最小,数组可能没有鞍点
#include<stdio.h>
int main()
{
int a[3][3] = { {7,8,9},{1,2,3},{4,5,6} };
int flag = 0, f;
for (int i = 0; i < 3; i++)
{
//有多少行外层循环就有多少次
int temp = a[i][0], t = 0;
for (int j = 1; j < 3; j++)
{
//找到每一行的最大的值,有多少列就循环多少次
if (a[i][j] > temp)
{
//记录该行的最大值和行号
temp = a[i][j];
t = j;
}
}
for (int z = 0; z < 3; z++)
{
//比较行上最大值这一列上的值,看是否为列上最小
if (a[z][t] < temp)
{
break;
}
//f用于看是否能遍历到最后一行也发现不了小于temp的值
f = z;
}
//遍历到最后一行也没发现这一列上小于temp的值,说明temp为鞍点
if (f == 2)
{
printf("%d", temp);
flag = 1;
break;
}
}
if (flag == 0)
{
printf("该数组没有鞍点");
}
}
#include<stdio.h>
# define N 15
int main()
{
int a[N], t = 15;
for (int i = 0; i < 15; i++)
{
a[i] = t--;
}
for (int i = 0; i < 15; i++)
{
printf("%d ",a[i]);
}
printf("\n");
int x, f = 0, b = N, mid, flag = 0;
scanf("%d", &x);
//二分法,循环次数为数组长度能除多少次2再+1
for (int i = 0; i < 4; i++)
{
mid = (f + b) / 2;
if (x < a[mid])
{
f = mid;
}
else if (x > a[mid])
{
b = mid;
}
else if (x == a[mid])
{
printf("数字位置为:%d", mid);
flag = 1;
break;
}
}
if (flag == 0)
{
printf("该数字不在数组中!");
}
}
#include<stdio.h>
int main()
{
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < i; j++)
{
printf(" ");
}
printf("* * * * *");
printf("\n");
}
}
#include<stdio.h>
int main()
{
char a[100];
scanf("%s", a);
for (int i = 1; a[i - 1] != '\0'; i++)
{
if (a[i - 1] >= 65 && a[i - 1] <= 90)
{
a[i - 1] = 90 - i + 1;
}
else if(a[i - 1] >= 97 && a[i - 1] <= 122)
{
a[i - 1] = 122 - i + 1;
}
printf("%c", a[i - 1]);
}
}
#include<stdio.h>
int main()
{
char a[10] = { '\0' }, b[10] = { '\0' }, c[20] = { '\0' };
int i, j, z;
scanf("%s", a);
scanf("%s", b);
for (i = 0; a[i] != '\0'; i++)
{
c[i] = a[i];
}
for (j = i,z = 0; b[z] != '\0'; j++, z++)
{
c[j] = b[z];
}
printf("%s", c);
}
#include<stdio.h>
int main()
{
char a[10] = { '\0' }, b[10] = { '\0' };
int i, flag = 0;
scanf("%s", a);
scanf("%s", b);
for (i = 0; a[i] != 0 && b[i] != 0; i++)
{
if (a[i] > b[i])
{
flag = 1;
printf("%d", a[i] - b[i]);
break;
}
else if (a[i] < b[i])
{
flag = 1;
printf("%d", -(b[i] - a[i]));
break;
}
}
if (flag == 0)
{
printf("0");
}
}
#include<stdio.h>
int main()
{
char a[20] = { '\0' }, b[10] = { '\0' };
int i, flag = 0;
gets(b);
for (i = 0; b[i] != '\0'; i++)
{
a[i] = b[i];
}
a[i] = '\0';
puts(a);
}
4.第七章
#include<stdio.h>
int main()
{
int x, y;
void f1(int, int);
void f2(int, int);
scanf("%d %d",&x, &y);
f1(x, y);
f2(x, y);
}
//求最大公约数
void f1(int m, int n)
{
int t = 0;
if (n > m)
{
t = m;
m = n;
n = t;
}
for (int i = 1; i <= n; i++)
{
if (m % i == 0 && n % i == 0)
{
t = i;
}
}
printf("最小公约数为:%d\n", t);
}
//求最大公倍数
void f2(int m, int n)
{
int t;
if (n > m)
{
t = m;
m = n;
n = t;
}
for (int i = m;;i++)
{
if (i % m == 0 && i % n == 0)
{
printf("最大公倍数为:%d", i);
break;
}
}
}
#include<stdio.h>
#include<math.h>
int main()
{
float a, b, c, t;
void f1(float, float);
void f2(float, float, float, float);
void f3();
scanf("%f %f %f", &a,&b,&c);
t = b * b - 4 * a * c;
if (t == 0)
{
f1(a, b);
}
else if (t > 0)
{
f2(a, b, c, t);
}
else
{
f3();
}
}
void f1(float m, float n)
{
printf("方程的根为:%f", -n / (2 * m));
}
void f2(float m, float n, float p, float q)
{
float x1, x2;
x1 = (-n + sqrtf(q)) / (2 * m);
x2 = (-n - sqrtf(q)) / (2 * m);
printf("方程的根为:%f %f", x1, x2);
}
void f3()
{
printf("方程无解");
}
#include<stdio.h>
#include<math.h>
int main()
{
int x;
scanf("%d", &x);
void f1(int);
f1(x);
}
void f1(int m)
{
int flag = 0;
for (int i = 2; i < m; i++)
{
if (i % m == 0)
{
flag = 1;
printf("该数不是素数!");
break;
}
}
if (flag == 0)
{
printf("该数是素数!");
}
}
#include<stdio.h>
#include<math.h>
int main()
{
int a[3][3], t = 1;
void f1(int);
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
a[i][j] = t++;
}
}
f1(a);
}
void f1(int a[3][3])
{
int t;
for (int i = 0; i < 3; i++)
{
for (int j = i; j < 3; j++)
{
t = a[i][j];
a[i][j] = a[j][i];
a[j][i] = t;
}
}
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%d", a[i][j]);
}
printf("\n");
}
}
#include<stdio.h>
#include<math.h>
int main()
{
void f1(char);
char a[10] = {'\0'};
scanf("%s", a);
f1(a);
printf("%s", a);
}
void f1(char b[10])
{
int t = 0, temp;
for (int i = 0; b[i] != 0; i++)
{
t++;
}
for (int j = 0; j < t / 2; j++)
{
temp = b[j];
b[j] = b[t - 1 - j];
b[t - 1 - j] = temp;
}
}
#include<stdio.h>
int main()
{
void f1(char, char);
char a[20] = {'\0'}, b[10] = { '\0' };
scanf("%s %s", a, b);
f1(a, b);
printf("%s", a);
}
void f1(char x[20], char y[10])
{
int t = 0, i, j, z;
for (i = 0; x[i] != '\0'; i++)
{
t++;
}
for (j = t, z = 0; y[z] != '\0'; j++, z++)
{
x[j] = y[z];
}
x[j] = '\0';
}
#include<stdio.h>
int main()
{
int f1(char);
void f2(char, char, int);
char a[100] = {'\0'}, b[10] = { '\0' };
int t = 0;
scanf("%s %s", a, b);
for (int i = 0; a[i] != '\0'; i++)
{
//统计a的长度
t++;
}
for (int i = 0; b[i] != '\0'; i++)
{
int flag = f1(b[i]);
//如果是元音f1会返回1.反之为0
if (flag == 1)
{
//是元音则实行f2
f2(a, b[i], t);
t++;
}
}
f1(a, b);
printf("%s", a);
}
int f1(char x)
{
//判断是否为元音
if (x == 'a' || x == 'e' || x == 'i' || x == 'o' || x == 'u')
return 1;
else
return 0;
}
void f2(char x[20], char y, int f)
{
//将元音插入a中t的位置
x[f] = y;
}
#include<stdio.h>
#include<math.h>
int main()
{
void f1();
char a[10] = {'\0'};
scanf("%s", a);
for (int i = 0; a[i]!='\0'; i++)
{
printf("%c", a[i]);
f1();
}
}
void f1()
{
printf(" ");
}
#include<stdio.h>
int sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0;
int main()
{
void f1(char);
char a[100] = {'\0'};
gets(a);
f1(a);
printf("字母个数为:%d\n", sum1);
printf("数字个数为:%d\n", sum2);
printf("空格个数为:%d\n", sum3);
printf("其他字符个数为:%d\n", sum4);
}
void f1(char x[100])
{
for (int i = 0; x[i] != '\0'; i++)
{
if ((x[i] >= 'a' && x[i] <= 'z') || (x[i] >= 'A' && x[i] <= 'Z'))
sum1++;
else if (x[i] >= '0' && x[i] <= '9')
sum2++;
else if (x[i] == ' ')
sum3++;
else
sum4++;
}
}
#include<stdio.h>
#include<string.h>
int main()
{
void f1(char, char);
char a[100] = { 0 };
char b[100] = { 0 };
gets(a);
f1(a, b);
puts(b);
}
void f1(char x[], char y[])
{
int len = 0, i = 0, j = 0;
//思路是:假设有“i am fine”我们要做的就是统计空格之前
//的长度,使用i和j来当单词的开头下标和结束下标。
while(x[i] != '\0')
{
//每次循环开始时j都会等于i的位置
j = i;
//然后就可以统计j过了多少个字符到下一个空格
//值得注意的是如果到了最后一个单词的结尾,如果不加上x[j]!='\0',它会继续向后找空格
while (x[j] != ' ' && x[j] != '\0')
j++;
//这个单词的长度就是j - i
len = j - i;
//统计出此时y中的字符长度
int t = 0;
while (y[t] != '\0')
t++;
//如果此时我们找的单词比之前的y中的要长就替换掉
if (len > t)
{
strncpy(y, x+i, len);
}
//此时的j还在空格处,我们继续推进j和i到下一个单词的开头
j++;
i = j;
}
}
#include<stdio.h>
int main()
{
void f1(char);
char a[100] = {'\0'};
scanf("%s", a);
f1(a);
for (int i = 0; a[i]!='\0'; i++)
{
printf("%c", a[i]);
}
}
void f1(char x[])
{
for (int i = 0; x[i] !='\0'; i++)
{
char t;
for (int j = i; x[j] !='\0'; j++)
{
if (x[i] < x[j])
{
t = x[j];
x[j] = x[i];
x[i] = t;
}
}
}
}
先百度出牛顿迭代法的公式,然后根据公式来迭代
#include<stdio.h>
#include<math.h>
int main()
{
double f1(double, double, double, double);
double a, b, c, d;
scanf("%lf %lf %lf %lf", &a, &b, &c, &d);
double result = f1(a, b, c, d);
printf("%lf", result);
}
double f1(double m, double n, double p, double q)
{
double x = 1, x1, f, f1;
x1 = x;
f = m * pow(x1, 3) + n * pow(x1, 2) + p * x1 + q;
f1 = 3 * m * pow(x1, 2) + 2 * n * x1 + p;
x = x1 - f / f1;
for (int i = 0; fabs(x - x1) >= 1e-5; i++)
{
x1 = x;
f = m * pow(x1, 3) + n * pow(x1, 2) + p * x1 + q;
f1 = 3 * m * pow(x1, 2) + 2 * n * x1 + p;
x = x1 - f / f1;
}
return x;
}
#include<stdio.h>
int main()
{
double f1(double, double);
double x, n;
scanf("%lf %lf",&x,&n);
double result = f1(x, n);
printf("%lf", result);
}
double f1(double x, double n)
{
if (n == 0)
return 1;
else if (n == 1)
return x;
else
return ((2 * n - 1) * x - f1(x, n - 1) - (n - 1) * f1(x, n - 2)) / n;
}
#include<stdio.h>
//根据这里来控制表格的行宽和列宽
#define N 2
#define M 2
double a[M][N] = { 0 };
double stu_avg_score[M] = { 0 }; //方便计算方差
int main()
{
void import(); //用于输入成绩
void show(); //用于展示成绩
void avge_stu(); //用于计算学生成绩
void avge_lesson(); //用于计算课程平均成绩
void max(); //用于输出最大成绩
void expect(); //用于计算方差
int select;
printf("1.输入成绩\n");
printf("2.输出成绩\n");
printf("3.计算每个学生平均分\n");
printf("4.计算每门课平均分\n");
printf("5.计算最高分\n");
printf("6.计算平均方差\n");
printf("0.结束\n");
printf("选择想要实现的功能:");
scanf("%d", &select);
while (select != 0)
{
system("cls");
switch (select)
{
case 1: import(); break;
case 2: show(); break;
case 3: avge_stu(); break;
case 4: avge_lesson(); break;
case 5: max(); break;
case 6: expect(); break;
case 0: break;
}
}
}
void import()
{
for (int i = 0; i < M; i++)
{
printf("输入第%d位学生的成绩:\n", i + 1);
for (int j = 0; j < N; j++)
{
printf("第%d门课:", j + 1);
scanf("%lf", &a[i][j]);
}
}
system("pause");
system("cls");
}
void show()
{
for (int i = 0; i < M; i++)
{
printf("第%d位学生的成绩为:\n", i + 1);
for (int j = 0; j < N; j++)
{
printf("第%d门:%lf\n", j + 1, a[i][j]);
}
}
system("pause");
system("cls");
}
void avge_stu()
{
for (int i = 0; i < M; i++)
{
double sum = 0;
for (int j = 0; j < N; j++)
{
sum += a[i][j];
if (j == 1)
{
printf("第%d位学生的平均分为:%lf\n", i + 1, sum / 2);
}
}
}
system("pause");
system("cls");
}
void avge_lesson()
{
for (int i = 0; i < M; i++)
{
double sum = 0;
for (int j = 0; j < N; j++)
{
sum += a[j][i];
if (j == 1)
printf("第%d门的课的平均分为:%lf\n", i + 1, sum / 2);
}
}
system("pause");
system("cls");
}
void max()
{
double max = 0;
int col, row;
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
if (a[i][j] > max)
{
max = a[i][j];
col = j;
row = i;
}
}
}
printf("第%d位学生的第%d门成绩最高,为:%lf\n", row + 1, col + 1, max);
system("pause");
system("cls");
}
void expect()
{
double sum_avg_score = 0, sum_avg_score_sqr = 0, exp;
for (int i = 0; i < M; i++)
{
double sum = 0;
for (int j = 0; j < N; j++)
{
sum += a[i][j];
if (j == 1)
{
stu_avg_score[i] = sum / 2;
}
}
}
for (int i = 0; i < M; i++)
{
sum_avg_score += stu_avg_score[i];
sum_avg_score_sqr += (stu_avg_score[i] * stu_avg_score[i]);
}
exp = (sum_avg_score_sqr / 2) - (sum_avg_score / 2) * (sum_avg_score / 2);
printf("%lf\n", exp);
system("pause");
system("cls");
}
和上一题大同小异
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
void transfer(char a[]);
char a[100] = {'\0'};
scanf("%s", a);
strupr(a);
transfer(a);
}
void transfer(char a[])
{
int t = 0, sum = 0;
int b[100];
for (int i = 0; a[i] != '\0'; i++)
{
b[i] = a[i];
t++;
}
for (int i = t - 1, j = 0; i >= 0; i--, j++)
{
if (b[i] >= 48 && b[i] < 58)
{
b[i] = pow(16, j) * (b[i] - 48);
}
else if (b[i] >= 65 && b[i] <= 90)
{
b[i] = pow(16, j) * (b[i] - 55);
}
sum += b[i];
}
printf("%d\n", sum);
}
#include<stdio.h>
int main()
{
void transfer(int, char a[]);
char a[100] = { '\0' };
int x;
scanf("%d", &x);
transfer(x, a);
}
void transfer(int x, char a[])
{
int t = 0, i = 0, temp = x;
//统计数字的位数
while (temp != 0)
{
temp /= 10;
i++;
}
//将数字转换为对应字符的ascii码值,要逆序放入数组中
for (i--; i >= 0; i--)
{
t = x % 10;
x /= 10;
a[i] = t + 48;
}
puts(a);
}
#include<stdio.h>
int main()
{
void f1(int, int ,int ,int month[]);
int month[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int y, m, d;
scanf("%d-%d-%d", &y, &m, &d);
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
{
month[1] = 29;
f1(y, m, d, month);
}
else
{
month[1] = 28;
f1(y, m, d, month);
}
}
void f1(int y, int m, int d, int month[])
{
int sum = 0;
for (int i = 1; i < m; i++)
{
sum += month[i];
}
sum += d;
printf("%d", sum);
}
5.第八章
#include<stdio.h>
#define N 3
int main()
{
int a[N];
int* p = a;
int* p_a[N];
for (int i = 0; i < N; i++)
{
scanf("%d", p);
p_a[i] = p;
p++;
}
//冒泡排序
for (int i = 0; i < N - 1; i++)
{
int t;
for (int j = i; j < N; j++)
{
if (*p_a[i] > *p_a[j])
{
t = *p_a[j];
*p_a[j] = *p_a[i];
*p_a[i] = t;
}
}
}
p = a; //初始化指针的位置
for (int i = 0; i < N; i++)
{
printf("%d\n", *p);
p++;
}
}
#include<stdio.h>
#include<string.h>
#define M 3
#define N 10
int main()
{
char a[M][N] = {0};
char* p[M];
for (int i = 0; i < M; i++)
{
gets(a+i); //输入字符串
p[i] = a + i;//记录每一行的地址
}
for (int i = 0; i < M; i++)
{
int flag;
char *t;
for (int j = i; j < M; j++)
{
flag = strcmp(a[i], a[j]);
if (flag > 0)
{
//交换指针数组中指针变量的值(地址),是没有改变原数组的内容的
t = p[j];
p[j] = p[i];
p[i] = t;
}
}
}
for (int i = 0; i < 3; i++)
{
printf("%s\n", p[i]);
}
}
#include<stdio.h>
#define M 3
#define N 10
int main()
{
void input(int a[]);
void exchange(int a[]);
void output(int a[]);
int a[N];
input(a);
exchange(a);
output(a);
}
void input(int a[])
{
int* p = a;
for (int i = 0; i < N; i++)
{
scanf("%d", p++);
}
}
void exchange(int a[])
{
int *t_min = a, *t_max = a, *p = a;
for (int i = 0; i < 10; i++)
{
if (*p < *t_min)
{
t_min = p;
}
if (*p > *t_max)
{
t_max = p;
}
if (i == 9)
{
int temp = a[0], flag = a[9];
a[0] = *t_min;
*t_min = temp;
a[9] = *t_max;
*t_max = flag;
}
p++;
}
}
void output(int a[])
{
int* p = a;
for (int i = 0; i < N; i++)
{
printf("%d\n", *(p++));
}
}
#include<stdio.h>
#define M 3
#define N 10
int main()
{
void f1(int x[], int n);
//int a[N], m;
int a[N] = { 0, 1,2,3,4,5,6,7,8,9 }, m;
//for (int i = 0; i < N; i++)
//{
// scanf("%d", a+i);
//}
scanf("%d", &m);
f1(a, m);
for (int i = 0; i < N; i++)
{
printf("%d\n", *(a+i));
}
}
void f1(int x[],int n)
{
for (int i = n; i > 0; i--)
{
int *t = x+i-1, *f = x+i+n-1, temp;
temp = *t;
*t = *f;
*f = temp;
}
}
#include<stdio.h>
#define M 3
#define N 10
int main()
{
//对每个学生进行编号
int a[N] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int* p = a;
//t为报数
int sum = N, t = 0;
for (int i = 0; sum > 1; i++)
{
//只要报数为3,就会将数组中的数变为0,变成0后就不能再使t增加
//使用sum来控制循环结束,当只剩下最后一个人时就会结束
if (*(p + i) != 0)
{
t++;
}
if (t == 3)
{
*(p + i) = 0;
sum -= 1;
t = 0;
}
if (i == N-1)
{
i = -1;
}
}
for (int i = 0; i < N; i++)
{
if(*(p+i))
printf("%d", *(p + i));
}
}
#include<stdio.h>
#define M 3
#define N 10
int main()
{
int sum(char a[]);
char a[100];
int result;
gets(a);
result = sum(a);
printf("%d", result);
}
int sum(char x[])
{
char* p = x;
int sum = 0;
for (int i = 0; *(p + i) != '\0'; i++)
{
sum++;
}
return sum;
}
#include<stdio.h>
#define M 3
#define N 10
int main()
{
void strcopy(char a[], char result[], int n);
char a[N], result[N];
int n;
gets(a);
scanf("%d", &n);
strcopy(a, result, n - 1);
puts(result);
}
void strcopy(char x[], char y[], int m)
{
char* p = x, * q = y;
for (int i = m; *(p + i) != '\0'; i++)
{
*q = *(p + i);
//因为没有对result进行初始化,所以其中的字符都是随机的
//这会导致输出时找不到结束字符,因为才有下一句语句
*(q + 1) = '\0';
q++;
}
}
#include<stdio.h>
#define M 3
#define N 100
int main()
{
void str_num(char a[]);
char a[N];
gets(a);
str_num(a);
}
void str_num(char x[])
{
char* p = x;
int a = 0, b = 0, c = 0, d = 0, e = 0; //分别代表大写,小写,空格,数字,其他字符的和
for (int i = 0; *(p + i) != '\0'; i++)
{
if (*(p + i) >= 'A' && *(p + i) <= 'Z')
{
a++;
}
else if (*(p + i) >= 'a' && *(p + i) <= 'z')
{
b++;
}
else if (*(p + i) >= '0' && *(p + i) <= '9')
{
c++;
}
else if (*(p + i) == ' ')
{
d++;
}
else
{
e++;
}
}
printf("%d %d %d %d %d", a, b, c, d, e);
}
#include<stdio.h>
#define M 3
#define N 3
int main()
{
void T(char a[M][N]);
int a[M][N], t = 1;
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
*(*(a + i) + j) = t++;
}
}
T(a);
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
printf("%d", * (*(a + i) + j));
}
putchar('\n');
}
}
void T(int x[M][N])
{
for (int i = 0; i < M; i++)
{
//遍历列只需从上一次的行号开始,否则会重复置换
for (int j = i; j < N; j++)
{
//对角线不会变
if (i != j)
{
int temp;
temp = *(*(x + i) + j);
*(*(x + i) + j) = *(*(x + j) + i);
*(*(x + j) + i) = temp;
}
}
}
}