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; //不要忘记每开始一个数字要重置tfor (int j = 1; j <= i; j++) {//这里不可令j*=j,因为j在for中语句执行后会再自增1t = 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-tsum += 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++){//可以观察出第一列和对角线都是1if (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 15int 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再+1for (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.反之为0if (flag == 1){//是元音则实行f2f2(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;elsereturn 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++;elsesum4++;}
}
#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 - ilen = 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;elsereturn ((2 * n - 1) * x - f1(x, n - 1) - (n - 1) * f1(x, n - 2)) / n;
}
#include<stdio.h>
//根据这里来控制表格的行宽和列宽
#define N 2
#define M 2double 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 3int 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 10int 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 10int 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 10int 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 10int 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 10int 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 10int 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 100int 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 3int 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;}}}
}