过于简单的题目直接贴答案

习题4

image.png

(1)反向输出16进制数

  1. #include<stdio.h>
  2. void main() {
  3. unsigned short a,b;
  4. scanf("%4X",&a);
  5. b = (a & 0x000F)<<12;
  6. b += (a & 0x00F0)<<4;
  7. b += (a & 0x0F00)>>4;
  8. b += (a & 0xF000)>>12;
  9. printf("%04X\n",b);
  10. }

【解析】

  • 对一个十六进制数而言,若要取其中的某一位,如9AF0取其中的9,则只需要将9AF0与F000进行 & 运算。如此一来,不需要的位数AF0在于0&时全部变为0。而需要的位数9,与F相&,即(1001)2 & (1111)2,为1的不变,为0的还是0,这样就巧妙地达到了保存的目的。
  • 而后的移位操作,其实就是16进制的每一位对应四位2进制位,所以9AF0&F000=9000右移12位后,相当于9往右移动3位,变成了0009,最后加上它就相当于低四位变成了0009。其余的各位数同理。

image.png

(2)不用辅助变量,交换a,b两个数

  1. #include<stdio.h>
  2. void main() {
  3. int a,b;
  4. scanf("%d,%d",&a,&b);
  5. a = a+b;
  6. b = a-b;
  7. a = a-b;
  8. printf("%d,%d",a,b);
  9. }

image.png
image.png

image.png

(4)原样输出输入的负十六进制数

  1. //参考答案
  2. #include<stdio.h>
  3. void main() {
  4. short int a;
  5. scanf("%X",&a);
  6. printf("-%hX\n",-a);
  7. }
  8. //第一次做的答案
  9. #include<stdio.h>
  10. void main() {
  11. char flag = getchar();
  12. unsigned int a;
  13. scanf("%X",&a);
  14. printf("%c",flag);
  15. printf("%0X",a);
  16. }

【解析】

  • -FA98在计算机中以补码存放,其二进制原码为 1111 1010 1001 1000,求得补码为 0000 0101 0110 1000,即十六进制数0568。
  • 则通过对0568进行取反操作,并在输出时加上符号“-”,达成题意要求。

image.png
image.png

image.pngimage.png

(6)输入历经秒数,计算精确时间

  1. #include<stdio.h>
  2. void main() {
  3. unsigned long seconds;
  4. scanf("%ld",&seconds);
  5. int day,hour,minute,second,remainSeconds,remainMinute;
  6. day = seconds/(1*24*60*60);
  7. remainSeconds = seconds%(1*24*60*60);
  8. hour = remainSeconds/(1*60*60);
  9. remainMinute = remainSeconds%(1*60*60);
  10. minute = remainMinute/60;
  11. second = remainMinute%60;
  12. printf("Have passed %d days.Now is %02d:%02d:%02d.",day,hour,minute,second);
  13. }
  14. //输入1234567,输出的结果为Have passed 14 days.Now is 06:56:07.标答中的06:57:06是错的。

习题5

image.png

  1. #include<stdio.h>
  2. void main() {
  3. int x;
  4. scanf("%d",&x);
  5. if (x>0)
  6. {
  7. printf("正数\n");
  8. } else {
  9. printf("负数\n");
  10. }
  11. if (x%2==0)
  12. {
  13. printf("偶数\n");
  14. } else {
  15. printf("奇数\n");
  16. }
  17. }

image.png

  1. #include<stdio.h>
  2. void main() {
  3. int x,sign;
  4. scanf("%d",&x);
  5. if (x>0)
  6. {
  7. sign = 1;
  8. } else if (x==0)
  9. {
  10. sign = 0;
  11. } else {
  12. sign = -1;
  13. }
  14. printf("%d",sign);
  15. }

image.png

  1. #include<stdio.h>
  2. void main() {
  3. int num1,num2,num3,temp,max,min;
  4. scanf("%d %d %d",&num1,&num2,&num3);
  5. if (num1<=num2)
  6. {
  7. if (num2<=num3)
  8. {
  9. printf("%d,%d,%d",num1,num2,num3);
  10. } else {
  11. if (num1>=num3)
  12. {
  13. printf("%d,%d,%d",num3,num1,num2);
  14. } else {
  15. printf("%d,%d,%d",num1,num3,num2);
  16. }
  17. }
  18. } else {
  19. if (num2>=num3)
  20. {
  21. printf("%d,%d,%d",num3,num2,num1);
  22. } else {
  23. if (num1>=num3)
  24. {
  25. printf("%d,%d,%d",num2,num3,num1);
  26. } else {
  27. printf("%d,%d,%d",num2,num1,num3);
  28. }
  29. }
  30. }
  31. }
  32. //另解,更新于2021/12/21
  33. #include<stdio.h>
  34. #include<string.h>
  35. int main() {
  36. int i, num[3];
  37. int min,mid,max;
  38. printf("输入三个数:\n");
  39. for(i=0;i<3;i++){
  40. scanf("%d", &num[i]);
  41. }
  42. min = num[0]<num[1]?num[0]:num[1];
  43. min = min<num[2]?min:num[2];
  44. max = num[0]>num[1]?num[0]:num[1];
  45. max = max>num[2]?max:num[2];
  46. mid = num[0]+num[1]+num[2]-max-min; //三个数的和减去另外两个数就是剩下的那个数
  47. printf("min=%d mid=%d max=%d",min, mid, max);
  48. return 0;
  49. }

image.png

  1. #include<stdio.h>
  2. void main() {
  3. printf("*****Time*****\n");
  4. printf("%d%5s%-7s\n",1," ","morning");
  5. printf("%d%5s%-9s\n",2," ","afternoon");
  6. printf("%d%5s%-5s\n",3," ","night");
  7. printf("Please enter your choice:");
  8. int choice;
  9. scanf("%d",&choice);
  10. //用这种方式获取选择也是可以的 choice = getchar()
  11. switch (choice)
  12. {
  13. case 1:
  14. printf("Good morning");
  15. break;
  16. case 2:
  17. printf("Good afternoon");
  18. break;
  19. case 3:
  20. printf("Good night");
  21. break;
  22. default:
  23. printf("Selection error!");
  24. break;
  25. }
  26. }//标答的空格相当之简陋,某种意义应该是错的,因为跟题目里的空格根本对不上23333

image.png

(5)闰年判断

  1. #include<stdio.h>
  2. void main() {
  3. int year,month;
  4. scanf("%d,%d",&year,&month);
  5. switch (month)
  6. {
  7. case 1:
  8. case 3:
  9. case 5:
  10. case 7:
  11. case 8:
  12. case 10:
  13. case 12:
  14. printf("31天\n");
  15. break;
  16. case 4:
  17. case 6:
  18. case 9:
  19. case 11:
  20. printf("30天\n");
  21. break;
  22. case 2:
  23. if ((year%4==0&&year%100!=0) || (year%400==0))
  24. {
  25. printf("29天\n");
  26. } else {
  27. printf("28天\n");
  28. }
  29. break;
  30. default:
  31. printf("输入数据有误!\n");
  32. break;
  33. }
  34. }

image.png

(6)switch区间化简

image.png
这题主要就是switch区间化简的问题。根据题目给定的区间,发现都是250的倍数,因此自然联想到除250进行化简。这里的输出保留了两位小数,元角分。


习题6

image.png
image.png

image.png

(2)n x (n+1) x (n+2)

  1. #include<stdio.h>
  2. void main() {
  3. int i;
  4. long mul=1,result=0;
  5. for (i = 1; i <= 99; i = i+2)
  6. {
  7. mul = i*(i+1)*(i+2);
  8. result += mul;
  9. }
  10. printf("%ld",result);
  11. }

image.png

(3)阶乘累加

  1. #include<stdio.h>
  2. void main() {
  3. long sum = 0;
  4. for (int i = 1; i <= 10; i++)
  5. {
  6. long mul=1;
  7. for (int j = 1; j <= i; j++)
  8. {
  9. mul *= j;
  10. }
  11. sum += mul;
  12. }
  13. printf("%ld",sum);
  14. }

image.png

(4)a+aa+aaa+…+n个a

  1. #include<stdio.h>
  2. void main() {
  3. long sum=0,temp=0; //这里千万记得初始化
  4. int i,a,n;
  5. printf("input a,n:\n");
  6. scanf("%d,%d",&a,&n);
  7. for (i=1; i<=n; i++) {
  8. temp = temp*10 + a;
  9. sum += temp;
  10. }
  11. printf("%ld",sum);
  12. }

image.png

(5)π近似值估算

  1. #include<stdio.h>
  2. void main() {
  3. float result=1, temp=1;
  4. int n;
  5. for ( n = 2; n <= 100; n+=2)
  6. {
  7. temp = (float)(n*n)/((n-1)*(n+1));
  8. result*=temp;
  9. }
  10. printf("%f",2*result);
  11. }

image.png

(6)sinx 泰勒展开

  1. #include<stdio.h>
  2. #include<math.h>
  3. void main() {
  4. float x;
  5. printf("input x:\n");
  6. scanf("%f",&x);
  7. double result=x,temp=x;
  8. int n=1,count=0;
  9. do
  10. {
  11. temp=(-temp*x*x)/((n+1)*(n+2));
  12. result+=temp;
  13. n+=2;
  14. count++;
  15. } while (fabs(temp)>=1e-5); //后面会越来越小,所以是大于等于1e-5时执行循环
  16. printf("sin(x)=%f,count=%d",result,count);
  17. }

image.png

(7)水仙花数

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

image.png

  1. #include<stdio.h>
  2. #include<math.h>
  3. void main() {
  4. int x,x1,x2,x3,x4,k;
  5. printf("input x:\n");
  6. scanf("%d",&x);
  7. k = abs(x);
  8. x1 = k/1000;
  9. x2 = (k-x1*1000)/100;
  10. x3 = (k-x1*1000-x2*100)/10;
  11. x4 = k%10;
  12. printf("%d",x1+x2+x3+x4);
  13. } //以上为教材标答,不难发现是错的。例如输入12345就gg了,毕竟题目要求的是输入任意整数x
  14. #include<stdio.h>
  15. #include<math.h>
  16. void main() {
  17. int x,k,sum=0;
  18. printf("input x:\n");
  19. scanf("%d",&x);
  20. k = abs(x);
  21. while (k/10!=0)
  22. {
  23. sum = sum+(k%10);
  24. k=k/10;
  25. }
  26. sum = sum+k;
  27. printf("%d",sum);
  28. } //这个更贴近标答。之所以是更贴近,是因为没有考虑整数的位数问题。

image.png

  1. #include<stdio.h>
  2. #include<math.h>
  3. void main() {
  4. int x,k,r,new=0;
  5. printf("input x:\n");
  6. scanf("%d",&x);
  7. k=x;
  8. while (k!=0)
  9. {
  10. r=k%10;
  11. new=10*new+r;
  12. k=k/10;
  13. }
  14. if (new==x)
  15. {
  16. printf("yes\n");
  17. } else {
  18. printf("no\n");
  19. }
  20. }

image.png

  1. #include<stdio.h>
  2. #include<math.h>
  3. void main() {
  4. int x,y,z,count=0;
  5. for ( x = 1; x <= 30; x++)
  6. {
  7. for ( y = 1; y <= 75; y++)
  8. {
  9. z=100-x-y;
  10. if (5*x+2*y+z==150)
  11. {
  12. count++;
  13. printf("%02d,%02d,%02d ",x,y,z);
  14. if (count%6==0)
  15. {
  16. printf("\n");
  17. }
  18. }
  19. }
  20. }
  21. printf("%d",count);
  22. }

image.png
image.png

  1. #include<stdio.h>
  2. #include<math.h>
  3. void main() {
  4. int i=0, sum=0, flag=0;
  5. char man = ' ';
  6. for ( i = 0; i <= 3; i++)
  7. {
  8. man = 'A' + i;
  9. sum = (man!='A') + (man=='C') + (man=='D') + (man!='D');
  10. if (sum == 3)
  11. {
  12. printf("target is %c",man);
  13. flag = 1;
  14. }
  15. }
  16. if (flag==0)
  17. {
  18. printf("can't found");
  19. }
  20. }

image.png
image.png
image.png
image.png
image.png


习题7

xodo yyds!

image.png新版教材还要统计非负数个数。

  1. #include <stdio.h>
  2. void main() {
  3. int num[20],i,sum=0,count=0;
  4. for(i=0;i<20;i++) {
  5. scanf("%d",&num[i]);
  6. if(num[i]>=0) {
  7. count++;
  8. sum+=num[i];
  9. }
  10. }
  11. printf("非负数个数为%d个,其总和为%d\n",count,sum);
  12. }

image.png

  1. #include <stdio.h>
  2. void main() {
  3. int num[10],i,j,k,t;
  4. int ji=0,ou=9; //分别表示奇数和偶数,奇数从数组左边开始,偶数从右边开始
  5. for(i=0;i<10;i++) {
  6. scanf("%d",&t);
  7. if(t%2==0) {
  8. num[ou--]=t;
  9. } else
  10. num[ji++]=t;
  11. }
  12. //选择排序,奇数
  13. for(i=0;i<ji-1;i++) { //最后一个奇数存入后,ji++,会变到偶数的位子,所以这里<ji-1
  14. k=i;
  15. for(j=i+1;j<ji;j++) {
  16. if(num[k]>=num[j]) {
  17. k=j;
  18. }
  19. }
  20. if(k!=i) {
  21. t = num[i];
  22. num[i] = num[k];
  23. num[k] = t;
  24. }
  25. }
  26. //选择排序,偶数
  27. for(i=ji;i<9;i++) { //同理,ji最后+1就到了偶数的位子。然后10个数排9个,最后一个不用排,因此i<9
  28. k=i;
  29. for(j=i+1;j<10;j++) {
  30. if(num[k]>=num[j]) {
  31. k=j;
  32. }
  33. }
  34. if(k!=i) {
  35. t = num[i];
  36. num[i] = num[k];
  37. num[k] = t;
  38. }
  39. }
  40. for(i=0;i<10;i++) {
  41. printf("%d ",num[i]);
  42. }
  43. }

image.png

  1. #include <stdio.h>
  2. void main() {
  3. int num[10];
  4. int i,max=0,min=0xffffffff,t=0;
  5. int maxIndex=0,minIndex=0;
  6. for(i=0;i<10;i++) {
  7. scanf("%d",&num[i]);
  8. //输入时就找出最大最小值
  9. if(num[i]>=num[maxIndex])
  10. maxIndex = i;
  11. if(num[i]<=num[minIndex])
  12. minIndex = i;
  13. }
  14. //交换极值
  15. t = num[maxIndex];
  16. num[maxIndex] = num[minIndex];
  17. num[minIndex] = t;
  18. for(i=0;i<10;i++)
  19. printf("%d ",num[i]);
  20. }

image.pngimage.png

  1. #include <stdio.h>
  2. void main() {
  3. int num[6];
  4. int i,j,temp;
  5. for(i=0; i<6; i++)
  6. scanf("%d",&num[i]);
  7. for(i=0; i<5; i++) { //输出5行,每行最后一个数移到第一位构成下一行
  8. temp = num[5]; //先把最后一位数存着
  9. for(j=5; j>0; j--)
  10. num[j] = num[j-1]; //用前一位值覆盖后一位,即逐位右移
  11. num[0] = temp;
  12. for(j=0; j<6; j++)
  13. printf("%d ",num[j]);
  14. printf("\n");
  15. }
  16. }

image.png

  1. #include <stdio.h>
  2. void main() {
  3. int a[5][5] = {0};
  4. int i,j,sum=0,mul=1;
  5. for(i=0;i<5;i++) {
  6. for(j=0;j<5;j++) {
  7. scanf("%d",&a[i][j]);
  8. }
  9. }
  10. //左上角到右下角对角线
  11. for(i=0;i<5;i++) {
  12. sum+=a[i][i];
  13. if(i%2==0) {
  14. mul*=a[i][i];
  15. }
  16. }
  17. //另一条对角线
  18. for(i=0,j=4; i<5&&j>-1; i++,j--) {
  19. sum+=a[i][j];
  20. if(i%2==0 && j%2==0) {
  21. mul*=a[i][j];
  22. }
  23. }
  24. //两条对角线相交元素算了两次
  25. printf("两条对角线和为%d\n",sum-a[2][2]);
  26. printf("两条对角线上下标为偶数的元素乘积为%d\n",mul/a[2][2]);
  27. }

image.png

image.png

  1. #include <stdio.h>
  2. #define N 6
  3. void main() {
  4. int i,j,a[N][N];
  5. for(i=0;i<N;i++) {
  6. a[i][0] = 1; //每行的头尾两个数为1
  7. a[i][i] = 1;
  8. for(j=1;j<i;j++) { //中间部分索引为1~i-1
  9. a[i][j] = a[i-1][j-1] + a[i-1][j]; //每个数等于左上角的数加正上方的数(不要看图形中的位置,看索引)
  10. }
  11. }
  12. for(i=0; i<N; i++) { //6阶三角有6行
  13. for(j=0; j<N-i-1; j++) { //第一行输出5个空格,第二行4个...
  14. printf(" ");
  15. }
  16. for(j=0; j<=i; j++) { //只输出到i,右边的空格自然就出来了
  17. printf("%2d ",a[i][j]);
  18. }
  19. printf("\n");
  20. }
  21. }

image.png
image.png

image.png
image.png

image.png
image.png

image.png

  1. #include <stdio.h>
  2. #define N 6
  3. #include<string.h>
  4. void main() {
  5. char srcStr[20]="abcde";
  6. char dstStr[20]="12345";
  7. int i;
  8. int j=strlen(dstStr); //dstStr的长度值即为'\0'的索引。标答中是通过for循环找'\0'的位置
  9. for(i=0; srcStr[i]!='\0'; i++) {
  10. dstStr[j++] = srcStr[i];
  11. }
  12. dstStr[j] = '\0'; //最后一个数挂载后,j++,所以此时的j就是'\0'应该所处的位置
  13. printf("%s\n",dstStr);
  14. }
  1. #include <stdio.h>
  2. void main() {
  3. int num[10]={1,3,5,7,9};
  4. int x,i;
  5. scanf("%d",&x);
  6. printf("插入前\n");
  7. for(i=0; i<5; i++)
  8. printf("%d ",num[i]);
  9. printf("\n插入后\n");
  10. for(i=4; i>=0; i--) {
  11. if(num[i] >= x)
  12. num[i+1] = num[i]; //数组右移给插入数腾地方。当然,这是建立在数组足够大的基础上
  13. else
  14. break; //就在当前数的右边插入就行了。因为上面的if已经右移好了,所以直接退出循环插入即可。
  15. }
  16. num[i+1] = x;
  17. for(i=0; i<6; i++)
  18. printf("%d ",num[i]);
  19. }

习题8

image.png

  1. #include <stdio.h>
  2. #include<math.h>
  3. int isPrimeNumber(int number);
  4. void main() {
  5. int number;
  6. printf("input number:\n");
  7. scanf("%d",&number);
  8. if(isPrimeNumber(number)==1)
  9. printf("yes");
  10. else
  11. printf("no");
  12. }
  13. int isPrimeNumber(int number) {
  14. int i;
  15. if(number <= 1) {
  16. return 0;
  17. }
  18. for(i=2; i<=sqrt(number); i++) { //教材标答此处为<而不是<=,其实是错的,一试便知
  19. if(number%i==0)
  20. return 0;
  21. }
  22. return 1;
  23. }

image.png

(2)最大公约数

  1. //计算两个正整数的最大公约数
  2. int maxCommonFactor(int a, int b) {
  3. if(a<=0 || b<=0) {
  4. return -1;
  5. }
  6. while(a!=b) {
  7. if(a>b)
  8. a = a-b;
  9. else
  10. b = b-a;
  11. }
  12. return a;
  13. }

image.png

  1. #include <stdio.h>
  2. #include<math.h>
  3. //选择排序
  4. void Sort(int a[], int n) {
  5. int i,j,k,t;
  6. for(i=0; i<n-1; i++) {
  7. k=i;
  8. for(j=i+1; j<n; j++) {
  9. if(a[i]<=a[j])
  10. k=j;
  11. }
  12. if(k!=i) {
  13. t = a[i];
  14. a[i] = a[k];
  15. a[k] = t;
  16. }
  17. }
  18. }
  19. //整型数组输入
  20. void getData(int a[], int n) {
  21. int i;
  22. printf("input number:\n");
  23. for(i=0; i<n; i++) {
  24. scanf("%d",&a[i]);
  25. }
  26. }
  27. void main() {
  28. int a[10];
  29. int i;
  30. getData(a,10);
  31. Sort(a,10);
  32. for(i=0; i<10; i++)
  33. printf("%d ",a[i]);
  34. }

image.png

  1. #include <stdio.h>
  2. #include<string.h>
  3. void JsSort(char str[]) {
  4. int i,j,k,len;
  5. char ch;
  6. len = strlen(str);
  7. for(i=1; i<len-1; i=i+2) { //只对下标为奇数的排序
  8. k=i;
  9. for(j=i+2; j<len; j=j+2) {
  10. if(str[i]<=str[j])
  11. k=j;
  12. }
  13. if(k!=i) {
  14. ch = str[i];
  15. str[i] = str[k];
  16. str[k] = ch;
  17. }
  18. }
  19. }
  20. void main() {
  21. char str[80];
  22. gets(str);
  23. JsSort(str);
  24. puts(str);
  25. }

image.png

  1. #include <stdio.h>
  2. //p为编号数组,共有n个人,从第s个人开始报数,每次报数到第m个人
  3. void Josegh(int p[], int n, int s, int m) {
  4. int i,j,s1,w;
  5. s1 = s; //s1从1开始
  6. for(i=1; i<=n; i++) {
  7. p[i-1] = i; //30人,数组0-29分别置为30人的编号1-30
  8. }
  9. for(i=n; i>=2; i--) { //30个人,报数出圈29人后,最后一个人无需进行操作
  10. s1 = (s1 + m -1)%i; //出圈人下一位的下标
  11. if(s1 == 0) //报数正好到最后一个
  12. s1 = i;
  13. w = p[s1-1]; //将出圈人编码记录下
  14. for(j=s1; j<i; j++) { //从出圈的位置开始,所有人左移一位,等价于将出圈人删除
  15. p[j-1] = p[j];
  16. }
  17. p[i-1] = w; //将刚刚记录下的出圈人逐次放置于倒数位置上
  18. }
  19. }
  20. void main() {
  21. int i,p[N];
  22. Josegh(p,N,1,10);
  23. for(i=N-1; i>=0; i--) { //将数组倒过来输出,即为出圈人的次序
  24. printf("%4d", p[i]);
  25. if(i%10==0)
  26. printf("\n");
  27. }
  28. }

image.png

(6)串的简单匹配

  1. #include <stdio.h>
  2. #include<string.h>
  3. int StrLoc(char str1[], char str2[]) {
  4. unsigned int i, len1, len2;
  5. len1 = strlen(str1);
  6. len2 = strlen(str2);
  7. if(len1>len2)
  8. return -1;
  9. for(i=0; i<=len2-len1; i++) { //当i>len2-len1时,说明str2剩下的位数已经小于str1,则必不可能相等
  10. if(strncmp(str1,str2+i,len1)==0) //str2+i是地址,等价于从str2[i]开始的字符串
  11. return i;
  12. }
  13. return -1;
  14. }
  15. void main() {
  16. int loc;
  17. char str1[] = "do";
  18. char str2[] = "how do you do?";
  19. loc = StrLoc(str1,str2);
  20. printf("%d",loc);
  21. }

image.png
image.png

image.png

(8)递归求斐波那契

image.png

image.png

(9)求组合数Cnm

  1. #include <stdio.h>
  2. long fun(int m, int n) {
  3. if(m==n||n==0)
  4. return 1;
  5. else
  6. return (m*fun(m-1,n)/(m-n)); //Cmn = m/(m-n)*C(m-1)n
  7. }
  8. void main() {
  9. int m,n;
  10. long c;
  11. printf("input m and n(m>=n):");
  12. scanf("%d%d",&m,&n);
  13. c = fun(m,n);
  14. printf("c=%ld\n",c);
  15. }

image.png

  1. #include <stdio.h>
  2. #include<string.h>
  3. char str[80] = {0};
  4. //将一整形数(不可为0)转换成字符串,str需足够大
  5. void intToStr(int num) {
  6. int i;
  7. if(num==0) //数字为0时结束递归
  8. return;
  9. for(i=strlen(str)-1; i>=0; i--) //将整个字符串往后移一位
  10. str[i+1] = str[i];
  11. str[0] = num%10 + 0x30; //取得末位数字并转为字符存放在数组首位。由于每次操作前都会移位,因此无需担心字符顺序颠倒
  12. intToStr(num/10); //剩余数位组成的数字继续递归
  13. }
  14. void main() {
  15. int num;
  16. printf("input number:\n");
  17. scanf("%d",&num);
  18. intToStr(num);
  19. printf("the string is:%s\n",str);
  20. }

习题9

image.png

  1. #include <stdio.h>
  2. void exchange(int *x, int *y) {
  3. int temp;
  4. temp = *x;
  5. *x = *y;
  6. *y = temp;
  7. }
  8. void main() {
  9. int a[10],b[10],i,n;
  10. printf("input array length<10\n");
  11. scanf("%d",&n);
  12. printf("input array a:\n");
  13. for(i=0;i<n;i++)
  14. scanf("%d",&a[i]);
  15. printf("input array b:\n");
  16. for(i=0;i<n;i++)
  17. scanf("%d",&b[i]);
  18. for(i=0;i<n;i++)
  19. exchange(&a[i],&b[i]);
  20. printf(">>>>>>>>\n");
  21. for(i=0;i<n;i++)
  22. printf("%d ",a[i]);
  23. printf("\n");
  24. for(i=0;i<n;i++)
  25. printf("%d ",b[i]);
  26. }

image.png

  1. #include <stdio.h>
  2. #include<string.h>
  3. void sstrcat(char *x, char *y) {
  4. while(*x!='\0')
  5. x++;
  6. while(*y!='\0') {
  7. *x=*y;
  8. x++;
  9. y++;
  10. }
  11. *x='\0';
  12. }
  13. void main() {
  14. char str1[100],str2[100];
  15. gets(str1);
  16. gets(str2);
  17. sstrcat(str1,str2);
  18. puts(str1);
  19. }

image.png

  1. #include<stdio.h>
  2. #include<string.h>
  3. void main() {
  4. char str[100];
  5. char *start,*end;
  6. gets(str);
  7. start=str;
  8. end=str+strlen(str)-1;
  9. while(*start==*end && start<=end) {
  10. start++;
  11. end--;
  12. }
  13. if(start<end)
  14. printf("no");
  15. else
  16. printf("yes");
  17. }

image.png

  1. #include<stdio.h>
  2. #include<string.h>
  3. char *substr(char *s, int startloc, int len) {
  4. static char temp[100];
  5. int i;
  6. char *p;
  7. if(startloc<0 || startloc>=strlen(s) || len<0)
  8. return 0;
  9. for(i=startloc; i<startloc+len; i++) {
  10. temp[i] = *(s+startloc);
  11. s++;
  12. }
  13. temp[i]='\0';
  14. return temp;
  15. }
  16. void main() {
  17. char str[20];
  18. gets(str);
  19. char *p=substr(str,0,5);
  20. printf("%s",p);
  21. }

image.png

image.png

  1. #include<stdio.h>
  2. #include<string.h>
  3. //将字符串s循环左移n个字符
  4. void strlshif(char *s, int n) {
  5. int i, len;
  6. char ch;
  7. len = strlen(s);
  8. for(i=0; i<n; i++) { //循环n次,左移n位
  9. ch = s[0]; //保存第一个变量
  10. strncpy(s, s+1, len-1); //从第二个字符开始的字符串左移
  11. s[len-1] = ch; //第一个字符置于末尾
  12. }
  13. }
  14. void main() {
  15. char str[] = "0123456789";
  16. strlshif(str,3);
  17. printf("%s\n",str);
  18. }

image.png

  1. #include<stdio.h>
  2. #include<string.h>
  3. //删除字符串中的数字
  4. void deleteNum(char *s) {
  5. char *pstr;
  6. for(pstr=s; *pstr!='\0'; pstr++) {
  7. while(*pstr>='0' && *pstr<='9')
  8. strcpy(pstr, pstr+1);
  9. }
  10. }
  11. void main() {
  12. char str[] = "a1b2c3d4e5";
  13. deleteNum(str);
  14. printf("%s\n",str);
  15. }

image.png

  1. #include<stdio.h>
  2. #include<string.h>
  3. //统计子串在主串中的出现次数
  4. int totsubstrnum(char *str, char *substr) {
  5. int i=0, count=0, len1, len2;
  6. len1 = strlen(str);
  7. len2 = strlen(substr);
  8. while(i <= len1-len2) {
  9. if(strncmp(str+i, substr, len2)==0) {
  10. count++;
  11. i = i+len2;
  12. } else {
  13. i++;
  14. }
  15. }
  16. return count;
  17. }
  18. void main() {
  19. char str[] = "abcabcabc";
  20. char substr[] = "abc";
  21. int c = totsubstrnum(str,substr);
  22. printf("%d",c);
  23. }

image.png

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. int getWeek(char *str) {
  5. int k, i=0;
  6. while(str[i]!=0) {
  7. if(str[i]<'0' || str[i]>'9') //要是数字
  8. return -1;
  9. else
  10. i++;
  11. }
  12. k = atoi(str); //字符串转为数字
  13. if(k<0 || k>6) //1-6为周一到周六,0为周天
  14. return -1;
  15. return k;
  16. }
  17. void main(int n, char *args[]) {
  18. int k;
  19. static char *weekStr[] = {"sunday","mondat","2","3","4","5","6"};
  20. if(n!=2) {
  21. printf("invalid input!");
  22. exit(-1);
  23. }
  24. k = getWeek(args[1]);
  25. if(k==-1) {
  26. printf("invalid input!");
  27. exit(-1);
  28. }
  29. printf("%s\n",weekStr[k]);
  30. }
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. #include<conio.h>
  5. #define N 30
  6. void beep();
  7. void getNumStr(char *s);
  8. void subNumStr(char *a, char *b, char *c);
  9. char subChar(char ch1, char ch2);
  10. void leftTrim(char *str,char sign);
  11. int tag=0;
  12. #if defined (N)
  13. int a=666;
  14. #endif
  15. void main() {
  16. char a[21]={0},b[21]={0},c[22];
  17. //输入被减数a,减数b
  18. printf("a=");
  19. while(strlen(a)==0)
  20. getNumStr(a);
  21. printf("\nb=");
  22. while(strlen(b)==0)
  23. getNumStr(b);
  24. //计算差数c
  25. subNumStr(a,b,c);
  26. printf("\na-b=%s\n",c);
  27. }
  28. //读取数字字符串
  29. void getNumStr(char *s) {
  30. int i=0;
  31. char ch;
  32. while(1) {
  33. ch = getch();
  34. if(ch=='\r') { //回车符
  35. break;
  36. }
  37. if(ch=='\b') { //退格符
  38. if(i>0) {
  39. printf("%c %c",ch, ch);
  40. i--;
  41. } else
  42. beep();
  43. continue;
  44. }
  45. if(ch<'0' || ch>'9') { //非数字字符
  46. beep();
  47. continue;
  48. }
  49. if(i<20) {
  50. printf("%c",ch);
  51. s[i++]=ch;
  52. } else
  53. beep();
  54. }
  55. s[i]='\0';
  56. }
  57. //报警响铃
  58. void beep() {
  59. printf("\07");
  60. }
  61. //计算两个数字字符串之差,放在c中
  62. void subNumStr(char *a, char *b, char *c) {
  63. int i,j,k;
  64. char t[20+1],sign=' ';
  65. //大数放在a中,小数放在b中
  66. if(strlen(a)<strlen(b) || strlen(a)==strlen(b)&&strcmp(a,b)<0) {
  67. sign = '-';
  68. strcpy(t,a);
  69. strcpy(a,b);
  70. strcpy(b,t);
  71. }
  72. memset(c, ' ', 20+2); //将c全部清空
  73. i=strlen(a)-1;
  74. j=strlen(b)-1;
  75. k=20;
  76. while(i>=0 && j>=0) //将被减数和减数按从右到左的顺序相减
  77. c[k--]=subChar(a[i--],b[j--]);
  78. while(i>=0)
  79. c[k--]=subChar(a[i--],'0');
  80. c[21]='\0';
  81. leftTrim(c,sign); //去掉字符串c左边的空格和0
  82. }
  83. //计算两个字符的差
  84. char subChar(char ch1, char ch2) {
  85. char ch;
  86. ch=ch1-ch2-tag; //两字符对应数字与借位相减
  87. if(ch>=0) { //结果>=0
  88. tag=0; //没借位
  89. return ch+0x30; //差数转换为对应数字字符
  90. } else { //结果小于0
  91. tag=1; //有进位
  92. return ch+10+0x30; //差数+10再转换为数字字符
  93. }
  94. }
  95. //去掉字符串左边的空格和0
  96. void leftTrim(char *str, char sign) {
  97. int i;
  98. for(i=0; str[i]==' '||str[i]=='0'; i++)
  99. ; //查找第一个非0非空格的字符
  100. if(str[i]=='\0') //如果差值为0
  101. i--;
  102. if(sign=='-') //如果为负数,添加负号
  103. str[--i]=sign;
  104. strcpy(str, str+i);
  105. }

习题11

image.png

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. struct Student {
  4. char no[10]; //学号
  5. float score; //成绩
  6. };
  7. //根据学生人数录入信息
  8. struct Student *input(int num) {
  9. int i;
  10. struct Student *p;
  11. p=(struct Student *)malloc(num*sizeof(struct Student));
  12. for(i=0; i<num; i++) {
  13. printf("student %d\n",i+1);
  14. scanf("%s%f",p[i].no,&p[i].score); //不能用p[i]->,因为p是指针,但p[i]不是
  15. }
  16. return p;
  17. }
  18. //查找最低成绩的学生记录
  19. struct Student getMin(struct Student *p, int num) {
  20. int i,k=0;
  21. for(i=1; i<num; i++) {
  22. if(p[i].score<p[k].score)
  23. k=i;
  24. }
  25. return p[k];
  26. }
  27. void main() {
  28. int num;
  29. printf("input student number:\n");
  30. scanf("%d",&num);
  31. struct Student *p=input(num),minStu;
  32. if(p==NULL) {
  33. printf("memory is not enough!");
  34. exit(-1);
  35. }
  36. minStu = getMin(p,num);
  37. printf("the lowest score is:%.1f\n",minStu.score);
  38. printf("no is:%s",minStu.no);
  39. free(p);
  40. }

image.png

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct Product {
    char dm[5];
    char mc[11];
    int dj;
    int sl;
    long je;
};

//输入(多少个产品)
struct Product *input(int num) {
    int i;
    struct Product *p;
    p=(struct Product *)malloc(num*sizeof(struct Product));
    if(p==NULL) {
        printf("memory is not enough!");
        exit(-1);
    }
    for(i=0; i<num; i++) {
        printf("Product %d:\n",i+1);
        scanf("%4s%10s%d%d", &p[i].dm, &p[i].mc, &p[i].dj, &p[i].sl);
        p[i].je = p[i].dj * p[i].sl; //金额=单价*数量
    }
    return p;
}

//输出(产品,数量)
void output(struct Product *p, int num) {
    int i;
    printf("代码\t名称\t单价\t数量\t金额\t\n");
    for(i=0; i<num; i++) {
        printf("%s\t%s\t%d\t%d\t%d\t\n", p[i].dm, p[i].mc, p[i].dj, p[i].sl, p[i].je);
    }
}

//按产品代码排序(降序,产品代码相同按金额排)
void pro_sort(struct Product *p, int num) { //冒泡排序
    int i,j; 
    struct Product temp;
    for(i=0; i<num-1; i++) {
        for(j=i+1; j<num; j++) {
            if(strcmp(p[j].dm ,p[i].dm)>0 || strcmp(p[j].dm ,p[i].dm)==0 && p[j].je>p[i].je) { //注意先 && 后 ||
                temp = p[j];
                p[j] = p[i];
                p[i] = temp;
            }
        }
    }
}

void main() {
    int num;
    struct Product *p;
    printf("input product quantity:\n");
    scanf("%d",&num);
    p=input(num);
    if(p==NULL) {
        printf("memory is not enough!");
        exit(-1);
    }
    pro_sort(p,num);
    output(p,num);
    free(p);
}

image.png

#include<stdio.h>
#include<stdlib.h>

typedef struct Student {
    float score;
    struct Student *next;
} stu;

void main() {
    int i;
    float score;
    stu *p,*q;
    stu *head = (stu *)malloc(sizeof(stu));
    if(head==NULL) {
        printf("memory not enough");
        exit(-1);
    }
    head->next=NULL;
    for(i=0; i<10; i++) {
        stu *node = (stu *)malloc(sizeof(stu));
        if(node==NULL) {
            printf("memory not enough");
            exit(-1);
        }
        printf("input %d score:\n",i+1);
        scanf("%f",&score);
        node->score = score;
        p=head;
        while(p->next!=NULL) {
            if(p->next->score < node->score) 
                break;
            p=p->next;
        }
        node->next = p->next;
        p->next = node;
    }
    printf("after sort:\n");
    p=head;
    while(p->next!=NULL) {
        printf("%.1f ", p->next->score); //注意,头结点没有数据
        p = p->next;
    }
    //链表销毁 
    p=head;
    while(p->next!=NULL) {
        q=p->next;
        p->next = q->next;
        free(q);
    }
    free(head);
}

image.png

#include<stdio.h>

void main() {
    int i,j,k,z=0;
    char *color[5]={"red", "yellow", "blue", "whight", "black"};
    for(i=0; i<5; i++) {
        for(j=i+1; j<5; j++) {
            for(k=j+1; k<5; k++) {
                z++;
                printf("%d:%s, %s, %s\n", z, color[i], color[j], color[k]);
            }
        }
    }
}

image.png

#include<stdio.h>
#include<stdlib.h>

typedef struct Link {
    int data;
    struct Link *next;
} link;
link *head;

link *createNode(int nodeNumbers) {
    link *p;
    p=(link *)malloc(sizeof(link));
    if(p==NULL) {
        printf("memory is not enough");
        exit(-1);
    }
    p->next = NULL;
    p->data = nodeNumbers+1;
    return p;
}

void displayLink(link *head) {
    link *p;
    int i=1;
    p=head;
    // while(p!=NULL) {
    //     printf("%5d%10d\n", i++, p->data);
    //     p=p->next;
    // }
    do
    {
        printf("%5d%10d\n", i, p->data);
        p=p->next;
        i++;
    } while(p!=NULL);
}

link *deleteNode(link *current, link *pre) { //删头或尾节点返回新的头节点,删普通节点返回下一个节点
    if(current == head) { //当前要删除的结点是头结点
        head = current->next;
        free(current);
        return head;
    } 
    if(current->next == NULL) { //尾结点
        pre->next = NULL;
        free(current);
        return head;
    } else { //普通结点
        pre->next = current->next;
        free(current);
        return pre->next;
    }
}

void main() {
    int i=0, nodeNum=25;
    link *current, *pre;
    head = NULL;
    for(i=0; i<25; i++) {
        if(i==0) {
            head = createNode(i);
            pre = head;
        } else {
            pre->next = createNode(i);
            pre = pre->next;
        }
    }
    printf("first print\n");
    displayLink(head);

    i=1;
    current = head;
    while(1) {
        if(i%3==0) {
            current = deleteNode(current,pre);
            i++; //报数+
            nodeNum--; //人数-
            if(nodeNum < 3) {
                break; //人数小于3结束
            }
        } else {
            pre = current;
            current = current->next;
            if(current == NULL) {
                current = head;
            }
            i++;
        }
    }
    printf("last is:\n");
    displayLink(head);
}

习题12

image.png

#include<stdio.h>
#include<stdlib.h>
#define MAX 256

void main() {
    FILE *fp;
    char string[MAX];
    int i=1;
    if((fp = fopen("aaa.txt","r"))==NULL) {
        printf("can't open the file");
        exit(-1);
    }
    while(fgets(string, MAX, fp) != NULL) {
        printf("%d %s",i++,string);
    }
    fclose(fp);
}

image.pngimage.png

#include<stdio.h>
#include<stdlib.h>
#define MAX 256

void main(int arg, char *argv[]) {
    FILE *input1, *input2, *output;
    char string[MAX];
    if(arg!=4) {
        printf("input error");
        exit(-1);
    }
    input1 = fopen(argv[1],"r");
    input2 = fopen(argv[2],"r");
    output = fopen(argv[3],"w");
    if(input1==NULL || input2==NULL || output==NULL) {
        printf("open or create file error!");
        exit(-1);
    }
    while(fgets(string, MAX, input1) != NULL) {
        fputs(string, output);
    }
    while(fgets(string, MAX, input2) != NULL) {
        fputs(string, output);
    }
    fclose(input1);
    fclose(input2);
    fclose(output);
}

image.png

#include<stdio.h>
#include<stdlib.h>
#define MAX 256

void main(int arg, char *argv[]) {
    FILE *fp;
    char string[MAX];
    //以下5行为测试用,按题意运行需命令行输入参数
    argv[0] = "test2.exe";
    argv[1] = "aaa.txt";
    argv[2] = "2";
    argv[3] = "4";
    arg=4;
    int i, m, n, tag=0;
    if(arg!=2 && arg!=4) {
        printf("parameters error!");
        exit(-1);
    }
    if(arg==4) { //参数为4个,获取行区间
        m = atoi(argv[2]);
        n = atoi(argv[3]);
        if(m>n) {
            printf("parameters error!");
            exit(-1);
        }

    }
    if((fp = fopen(argv[1],"r"))==NULL) {
        printf("open file error!");
        exit(-1);
    }
    if(arg==4) {
        for(i=1; i<m; i++) { //不输出前m-1行
            if(fgets(string, MAX, fp) == NULL) { //读到文件尾或出错
                tag = 1;
                break;
            }
            //不为空则无操作,跳过
        }
        //为什么有上面这一段?FILE*内部存在一个读写指针,只要不关闭、不人为移动,它会根据读写过程不断后移
        //上述操作正是为了让其移动到第m行为止
        if(tag==0) { //4个参数,输出m-n行
            for(; i<=n&&fgets(string, MAX, fp) != NULL; i++) {
                printf("%s",string);
            }
        }
    } else { //两个参数,输出所有
        while(fgets(string, MAX, fp) != NULL) {
            printf("%s",string);
        }
    }
    fclose(fp);
}