C语言题目逻辑实战总结

eg1:

  • 已知有1,2,3,4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少
    已知:1:三位数 ,2:1-4,3:各不相同,
    输出:1:有多少个这样的三位数,2:依次输出
    解题代码和思路
#include
#include 
#include 
#include 

/*
   question1: 已知有1,2,3,4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少
   已知:1:三位数 ,2:1-4,3:各不相同,
   输出:1:有多少个这样的三位数,2:依次输出

   思路:使用代码的方式将我们的代码表示出来
   解题的思路: 获取百位数,10位数,和个位数
   int a = 123; 获取百位数a/100 , 获取10位数a%100/10得到10位数

   1:一个采用分别表示的方法表示这三个数
   int b*100 + s*10 + g
   2: 使用循环的方式进行遍历 for循环,while循环,do while循环
   for(g = 1; g < 5; g++){
      
   }
*/
int main()
{
	int b, s, g;
	// 统计输出了多少个这样的三位数使用计数的方式进行统计,注意加法变量的初始化往往是从0开始的
	int count = 0;
	// 使用嵌套循环的方式进行遍历
	for (b = 1; b < 5; b++) {
		for (s = 1; s < 5; s++) {
			for (g = 1; g < 5; g++) {
				// 使用if语句进行判断,要求三个数都不相等输出三个数
				if (g != s && s != b && g != b ) {
					printf("%d,%d,%d\n", b, s, g);
					// 输出一次统计一次
					count++;
				}
			
			 

			}
		}
	}
	// 在所有的循环条件遍历玩的情况下输出统计的数值
	printf("count = %d\n", count);
	 
	return 0;

}

C语言题目逻辑实战总结_第1张图片- [ ] eg2: 求取利润

  • 题目: 企业发放的奖金根据利润提成
  • #利润(I)低于或等于10万元时,奖金提成10%
  • #利润高于10万元,低于20万时,低于10万的部分按10%提成,高于10万部分可提成百分之7.5
  • #20万到40万之间时,高于20万元的部分,可提成百分之3
  • #60万到100万之间时,高于60万元部分按百分之1提成
  • 从键盘输入当月利润I求应该发放的奖金总数

解题思路的代码
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include

/*

  • eg2: 求取利润
  • 题目: 企业发放的奖金根据利润提成
  • #利润(I)低于或等于10万元时,奖金提成10%
  • #利润高于10万元,低于20万时,低于10万的部分按10%提成,高于10万部分可提成百分之7.5
  • #20万到40万之间时,高于20万元的部分,可提成百分之3
  • #60万到100万之间时,高于60万元部分按百分之1提成
  • 从键盘输入当月利润I求应该发放的奖金总数
  使用if else的进行处理
  int a = 10;
  int b = 20;
  if (a > b) {
  	printf("a>b\n");
  }
  else if(a < b){
  	printf("a<=b\n");
  }
  else {
  	printf("a = b\n");
  }
  */

int main() {
	int profit = 0;
	int bonus = 0;
	int bonus1 = 100000 * 0.1;
	int bonus2 = 100000 * 0.1 + 100000 * 0.075;
	int bonus3 = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05;
	int bonus4 = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 200000 * 0.03;
	int bonus5 = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 200000 * 0.03 +
		400000 * 0.015;
	//获取用户键盘输入
	printf("请输入当前业务利润:");
	scanf("%d:", &profit);
	// #利润(I)低于或等于10万元时,奖金提成10%
	if (profit <= 100000) {
		bonus = profit * 0.1;
	}
	else if (profit <= 200000) {
		bonus = bonus1 + (profit-100000) * 0.075;
	}
	else if (profit <= 400000) {
		bonus = bonus2 + (profit - 200000) * 0.05;
	}
	else if (profit <= 600000) {
		bonus = bonus3 + (profit - 400000) * 0.03;
	}
	else if (profit <= 1000000) {
		bonus = bonus4+ (profit - 600000) * 0.015;
	}
	else {
		bonus = bonus5 + (profit - 1000000) * 0.01;
	}
	printf("你获得的奖金为 = %d\n", bonus);
	return 0;
}

C语言题目逻辑实战总结_第2张图片eg3: 一个整数,他加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
解题思路代码

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 

/*
	eg3: 一个整数,他加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
	表示的意思是 
	x + 100 = n ^2; x + 100 + 168 = m^2;  ----------> x
	根据题目的意思:因为x可以推导数n 和 m 所以将x消去然后使用n 和 m  进行取值
	如: n ^2 - 100 = m ^2 - 268;m^2 - n ^2 = 168; (m + n) - (m - n) = 168; m + n = i; m - n = j ; i - j = 168;   
	2 <= i*j <= 168 / 2
*/

int main() {
	int j, n, m, x;
	for (int i = 2; i <= 168 / 2; i++) {
		if (168 % i == 0) {
			 j = 168 / i;
			 m = (i + j) / 2;
			 n = (i - j) / 2;
			 x = n * n - 100;
		}
	}
	printf("x = %d", x);


	return 0;

}

C语言题目逻辑实战总结_第3张图片eg4: 输入某年某月某日,判断这一天是这一年的第几天
解题思路和代码

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 

/*
   eg4: 输入某年某月某日,判断这一天是这一年的第几天
*/

int main() {
    // 获取用户键盘输入
	int day, month, year;
	int sum = 0;
	int leap = 0;
	printf("请输入当前的年月和日:");
	scanf("%d,%d,%d", &year, &month, &day);
	printf("year = %d , month = %d, day = %d\n", year, month, day);
	// 明显循环带选择的往往使用switch语句进行处理,根据某一个变量判断可取的值但是值也有限优先考虑switch语句
	

	switch (month) {
	case 1:
		printf("一月份\n");
		sum = 0; 
		break;
	case 2:
		printf("二月份\n"); 
		sum = 31;
		break;
	case 3:
		printf("三月份\n"); sum = 58; break;
	case 4:
		printf("四月份\n"); sum = 90; break;
	case 5:
		printf("五月份\n"); sum = 120; break;
	case 6:
		printf("六月份\n"); sum = 150;break;
	case 7:
		printf("七月份\n"); sum = 180; break;
	case 8:
		printf("八月份\n"); sum = 210; break;
	case 9:
		printf("九月份\n"); sum = 240; break;
	case 10:
		printf("十月份\n"); sum = 270; break;
	case 11:
		printf("十一月份\n"); sum = 300; break;
	case 12:
		printf("十二月份\n"); sum = 330; break;
	}
	// 判断是平年还是润年的代码
	if (year % 400 || (year % 4 == 0 && year % 100 != 0)) {
		leap = 1;
	}
	else {
		leap = 0;
	}
	if (leap == 1 && month > 2) {
		sum++;
	}
	sum = sum + day;
	printf("总天数是%d\n", sum);
	return 0;

}

C语言题目逻辑实战总结_第4张图片eg5: 输入三个整数想,x,y,z,把这三个数从小到大输出
解题代码和思路

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 

/*
   eg5: 输入三个整数想,x,y,z,把这三个数从小到大输出
   这个类型的题目还可以用冒泡排序进行处理
*/

int main() {
    // 先找出最小的数然后进行比较
	int a = 15;
	int b = 20;
	int c = 8;
	int sum = a + b + c;
	int min, max, middle;
	//printf("%d\n", a < b ? a : b);
	min = (a < b ? a : b) < c ? (a < b ? a : b) : c;
	max = (a > b ? a : b) > c ? (a > b ? a : b) : c;
	middle = sum - (min + max);
	printf("Smallest %d\n", min);
	printf("Max %d\n", max);
	printf("Middle %d\n", middle);
	return 0;
}

C语言题目逻辑实战总结_第5张图片eg6: 使用*输出一个字母c
解题思路和代码

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 

/*
  eg6: 使用*输出一个字母c,注意要输出带弧度的图案可以使用二维数组进行输出
*/

int main() {
	int m = 5;
	for (int i = 0; i < 5; i++) {
		printf("*");
	}
	printf("\n");
	for (int i = 0; i < m - 1; i++) {
		printf("*\n");
	}
	for (int i = 0; i < 5; i++) {
		printf("*");
	}
	printf("\n");
	return 0;
}

C语言题目逻辑实战总结_第6张图片eg7: 输出99乘法表

解题思路和代码

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 

/*
  eg7:输出一个9*9的乘法口诀表
*/

int main() {
	int i = 0;
	int j = 0;

	for (i = 0; i < 9; i++) { // i表示输出的是第几行
		for (j = 0; j < i+ 1; j++) { // j表示第几行中输出的数
			printf("%d * %d = %-2d  ", i, j, i * j);
		}
		printf("\n");
	}
	
	return 0;

}
#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 

/*
  eg7:输出一个9*9的乘法口诀表
*/

int main() {
	int i = 10;
	int j = 0;

	for (i = 1; i <= 9; i++) { // i表示输出的是第几行
		for (j = 1;j <= i; j++) { // j表示第几行中输出的数
			printf("%d*%d=%-2d  ", i, j, i * j);
		}
		printf("\n");
	}
	
	return 0;

}

C语言题目逻辑实战总结_第7张图片

  • eg8:斐波那楔数列古典问题(兔子生崽):
    有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可)
  • 程序分析:兔子的规律为数列1, 1, 2, 3, 5, 8, 13, 21…,即下个月是上两个月之和(从第三个月开始)。

解题代码和思路

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 

/*
   eg8:斐波那楔数列古典问题(兔子生崽):
   有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔
   子,假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可)
   程序分析:兔子的规律为数列1, 1, 2, 3, 5, 8, 13, 21....,即下个月是上两个月之和(从第三个月开始)。

   数学模型 ----> 程序
*/

int main() {
	int a = 1;
	int b = 1;
	for (int i = 1; i <= 10; i++) {
		 a = a + b;
		 b = b + a;
		printf("%d,%d", a, b);
	}



	return 0;
}

C语言题目逻辑实战总结_第8张图片eg9:判断101-200之间的素数
1:质数,素数
大于1的整数中,只能被1和这个数本身整除的数
2:如何判断是否是素数
3:一次枚举出每个数

解题思路和代码

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 

/*
    eg9:判断101-200之间的素数
	1:质数,素数
		大于1的整数中,只能被1和这个数本身整除的数
	2:如何判断是否是素数
	3:一次枚举出每个数
*/
// 函数的定义
int isPrimeNumber(int m) {
	int i;
	// 计算一个数的平方使用函数sqrt()使用sqrt需要使用math.h的包
	int k = (int)sqrt((double)m);
	for (i = 2; i <= k; i++) {
		// 判断是否能够整除,如果可以整除的话说明不是素数,切断break跳出
		if (m % i == 0) {
			break;
		}
	}
	if (i > k) {
		return 1;
	//printf("%d,是素数", m);
	}
	else {
		return 0;
		// 到这一步break被执行,说明不是素数; i < m;
	//	printf("%d,不是素数", m);
	}
}
int main() {
	// 函数的声明
	int isPrimeNumber(int m);
	int j;
	// for循环进行判断遍历循环101-200之间的数
	for (j = 101; j <= 200; j++) {
		if (isPrimeNumber(j)) {
			printf("%d  ", j);
		}
	

	}
	return 0;

}

C语言题目逻辑实战总结_第9张图片eg10: 题目 -> 打印水仙花数:打印出所有的水仙花数,所谓的水仙花数是指一个三位数,其各位数字立方 和等于该数本身 例如:153是一个水仙花数,因为153 = 1的三次方 + 5 的三次方 + 3的三次方

解题思路和代码

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 

/*
  题目 -> 打印水仙花数:打印出所有的水仙花数,所谓的水仙花数是指一个三位数,其各位数字立方和等于该数本身
  例如:153是一个水仙花数,因为153 = 1的三次方 + 5 的三次方 + 3的三次方
*/
int main() {
	// 分别表示个位,10位,和百位的数
	int x = 0, y = 0, z = 0;
	int i;
	// 将三位数的每一个位取出来
	for (i = 100; i <= 999; i++) {
		x = i % 10;// 获取位个数
		y = i / 10 % 10; // 获取十位数
		z = i / 100 % 10; // 获取百位数
		// 使用if进行判断
		if (i == (x * x * x + y * y * y + z * z * z)) {
			printf("%d 是水仙花数\n",i);
		}
	}
	return 0;
}

C语言题目逻辑实战总结_第10张图片eg11: 题目:将正数分解为质因数,例如:输入90,打印出90 = 2 * 3 * 3 * 5
程序分析:对n进行分解质因数,应该先找到一个最小的质因数K然后按照以下的步骤完成
1:如果这个是质数恰巧等于(小于的时候,继续执行循环)n,则说明分解质因数的过程已经结束另外打印出 即可
2:但n能被k整除,则打印输出k的值,并用n除以k的商,作为新的正整数n,重复执行第二步
3:如果n不能被k整除,则用k+1作为k的值,重复执行第一步

解题思路和代码

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 

/*
  题目:将正数分解为质因数,例如:输入90,打印出90 = 2 * 3 * 3 * 5
  程序分析:对n进行分解质因数,应该先找到一个最小的质因数K然后按照以下的步骤完成
  1:如果这个是质数恰巧等于(小于的时候,继续执行循环)n,则说明分解质因数的过程已经结束另外打印出即可
  2:但n能被k整除,则打印输出k的值,并用n除以k的商,作为新的正整数n,重复执行第二步
  3:如果n不能被k整除,则用k+1作为k的值,重复执行第一步
*/
int main() {
    int m = 90;
    int i;
    for (i = 2; i <= m; i++) {
        while (m % i == 0) {
            printf("%d ", i);
            m = m / i;
        }
    }
    return 0;
}

C语言题目逻辑实战总结_第11张图片eg12: 题目:利用条件运算符来嵌套完成此题,学习成绩>= 90分的同学用A表示,60-89分的同学用B表示,60分以下的同学用C表示 程序分析:(a>b)?a:b 这是条件运输符的基本例子。

解题思路和代码

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 

/*
       题目:利用条件运算符来嵌套完成此题,学习成绩>= 90分的同学用A表示,60-89分的同学用B表示,60分以下的同学用C表示
       程序分析:(a>b)?a:b 这是条件运输符的基本例子。
*/
int main() {
    int score = 50;
    char grade;
    grade = (score >= 90) ? 'A' : ((score >= 60) ? 'B' : 'C');
    printf("grade = % c\n", grade);
    return 0;
}

C语言题目逻辑实战总结_第12张图片**eg13:题目:输入两个正整数m和n,求取其最大的公约数和最小公倍数
1: 最小公倍数:两个数的积 / 最大公约数
2: 求最大公约数用辗转相除法(有名欧几里得算法)

例如需要求1997 和 615两个正整数的最大公约数,用欧几里得算法,是这样进行的
1997/615 =3(余152)
615 / 152 =4(余7)
152 / 7 = 21 (余5)
7 / 5 = 1 (余2)
5 / 2 = 2 (余1)
2 /1 = 2 (余0)
至此,最大公约数为1
以除数和余数反复的做除法运算,当余数为0时,取当前算式除数位最大公约数,所以得出1997和615的最大公约数为1**

解题思路和代码

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 

/*
      题目:输入两个正整数m和n,求取其最大的公约数和最小公倍数 
      1: 最小公倍数:两个数的积 / 最大公约数
      2: 求最大公约数用辗转相除法(有名欧几里得算法)

      例如需要求1997 和 615两个正整数的最大公约数,用欧几里得算法,是这样进行的
      1997/615 =3(余152)
      615 / 152 =4(余7)
      152 / 7 = 21 (余5)
      7 / 5 = 1 (余2)
      5 / 2 = 2 (余1)
      2 /1 = 2 (余0)
      至此,最大公约数为1
      以除数和余数反复的做除法运算,当余数为0时,取当前算式除数位最大公约数,所以得出1997和615的最大公约数为1

*/
int main() {
    int a = 885;
    int b = 615;
    int r;

    r = a % b;
    
    while (r != 0) {
        a = b;
        b = r;
        r = a % b;
    }
    printf("所以最大公约数是:%d\n", b);
    return 0;

}

C语言题目逻辑实战总结_第13张图片eg14:输入一行字符,分别统计出其中的英文字母,空格,数字,和其他字符的个数
解题代码和思路

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 

/*
  eg14:输入一行字符,分别统计出其中的英文字母,空格,数字,和其他字符的个数
  通过字符和ascill码的方式统计字符的值和个数

*/
int main() {
    char c;
    int letter = 0;
    int number = 0;
    int space  = 0;
    int others = 0;
    // 使用getchar函数获取字符的个数
    c = getchar();
    // 当输入没有回车的时候就不结束,为回车的时候就判断个数
    while (c != '\n') {
        //使用if语句判断字符并且统计字符的个数
        if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
            letter++;
        }
        else if (c >= '0' && c <= '9') {
            number++;
        }
        else if (c == ' ') {
            space++;
        }
        else {
            others++;
        }
        c = getchar();
    }

    printf("字母 = %d, 数字 = %d,空格 = %d ,其他 = %d ", letter, number, space, others);
    return 0;
}

C语言题目逻辑实战总结_第14张图片 eg15:求s = a+ aa + aaa + aaaa+ …a的值其中a是一个数字,几个数的相加由键盘控制

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 

/*
  eg15:求s = a+ aa + aaa + aaaa+ .....a的值
  其中a是一个数字,几个数的相加由键盘控制

*/
int main() {
    // 如何控制 , 如何求S
    int n = 1;
    int a = 2;
    // 使用中间变量保证这个2是永远不变的
    int t = a;
    int sum = 0;
    while (n <= 5) {
        a *= 20;
        a += t;
        printf("a = %d\n", a);
        sum += a;
        n++;
    }
    printf("sum = %d\n", sum);
    return 0;
}

C语言题目逻辑实战总结_第15张图片eg16:一个数刚好等于他的因子之和,这个数就称之为完数例如 6 = 1 + 2 +3 ,编程找出1000以内的所有完数

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 

/*
  eg16:一个数刚好等于他的因子之和,这个数就称之为完数
  例如 6 = 1 + 2 +3 ,编程找出1000以内的所有完数

*/
// 使用函数的方式判读是不是完数,返回值得类型是int,参数的类型也是int
int compNum(int m) {
    int n;
    int sum = 0;
    for (n = 1; n < m; n++) {
        if (m % n  == 0) {
            sum += n;
        }
        else {
            ;
        }
    }
    if (m == sum) {
        return 1;
       // printf("是完数\n");
    }
    else {
        return 0;
        // printf("不是完数\n");
    }
}

int main() {
    /*
      将一个大问题拆解为一个个小的问题
      1:如何判断一个数是不是完数
      2:使用循环遍历1-1000内的完数
      3:输出完数
    */
    int compNum(int m);
    int s = 6;
    for (s = 1; s <= 1000; s++) {
        if (compNum(s)) {
            printf("%d\n",s);
        }
        else {
            //printf("不是完数\n");
        }
    }

    return 0;

}

C语言题目逻辑实战总结_第16张图片eg17:一个求从100米的高度自由落下每次落下后反跳回原高度的一半,再落下求他在第10次落地时,共经过多少米,第10次反弹多高

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 

/*
eg17:一个求从100米的高度自由落下每次落下后反跳回原高度的一半,再落下求他在第10次落地时,共经过多少米,第10次反弹多高

*/
int main() {
    /*
       解题思路:1:第一次小球落下是反弹的高度数h = 100;
       路程s = 100;
       然后没一次的弹起和落下都比上一次小一半
       s = s + h/2;
       h = h /2;
    */
    float h = 100;
    float s = 100;
    h = h / 2;
    int i;
    for (i = 2; i <= 10; i++) {
        s = s + h * 2;
        h = h / 2;
    }
    printf("s = %f,h = %f\n", s, h);

    return 0;

}

C语言题目逻辑实战总结_第17张图片eg18:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃掉一般,还不够,又多吃了一个
第二天早上又将剩下的桃子吃了一般,又多吃了一个,以后每天的早上都吃掉前一天剩下的一半零一个
到第10天早上再想吃时,只剩下一个桃子了
求第一天一共摘了多少

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 

/*
eg18:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃掉一般,还不够,又多吃了一个
第二天早上又将剩下的桃子吃了一般,又多吃了一个,以后每天的早上都吃掉前一天剩下的一半零一个
到第10天早上再想吃时,只剩下一个桃子了
求第一天一共摘了多少
*/
int main() {
    /*
       循环:for循环和while循环,一般有明确的开始和结束值得时候多使用for循环,while训话某一个值得时候使用while循环
       将题目表达的意思转换为数学模型,使用数学表达式的方式表示出来,题目的求解过程是从已知推导出未知
       x10 = 1;
       x9 = (x10 + 1)*2
       x8 = (x9 + 1)*2 
       ......
     */
    int day;
    int y = 0;
    int x = 1;
    for (day = 9; day >= 1; day--) {
        y = (x + 1) * 2;
        x = y;
    }
    printf("y = %d\n", y);

    return 0;

}

C语言题目逻辑实战总结_第18张图片eg19:打印出一个菱形图案

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 

/*
eg19:打印出一个菱形
*/
int main() {

    // 打印图形需要两个变量,二维的图形需要两个变量完成打印
    int i;
    int j;
    int k;
    for (i = 0; i < 4; i++) {
        for (j = 0; j < 3 - i + 1; j++) {
            printf(" ");
        }
        for (k = 0; k < 2 * i + 1; k++) {
            printf("*");
        }
    
        printf("\n");
    }
    
    return 0;

}

C语言题目逻辑实战总结_第19张图片eg20:有一组分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前二十项之和,程序分析:抓住分子和分母的变化规律

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 

/*
eg20:有一组分数序列:2/1,3/2,5/3,8/5,13/8,21/13....求出这个数列的前二十项之和,程序分析:抓住分子和分母的变化规律
*/
int main() {

    int i;
    float sum = 0;
    float a = 2, b = 1;
    float t;
    for (i = 0; i < 20;i++) {
        sum += a / b;
        t = a;
        a = a + b;
        b = t;
    }
    printf("sum =  %.2f\n", sum);
    return 0;

}

C语言题目逻辑实战总结_第20张图片- [ ] eg21:利用递归的方法,一个函数在它的函数内调用它自身的称为递归调用,这种函数被称为递归函数

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 

/*
eg21:利用递归的方法,一个函数在它的函数内调用它自身的称为递归调用,这种函数被称为递归函数
*/
//递归函数
int f(int n) {
    if (n == 1) {
        return 1;
    }
    else {
        return n * f(n - 1);
    }
    return f(n);
}

int main() {
    // 函数的声明
    int f(int n);
    int m = 5;
    printf("5! = %d\n", f(m));
    return 0;
}

C语言题目逻辑实战总结_第21张图片eg22:利用函数递归调用的方式,将输入的5个字符以相反的方式打印输出

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 

/*
eg22:利用函数递归调用的方式,将输入的5个字符以相反的方式打印输出
*/
//递归函数
void f(int n) {
    // 如果当前的条件成立的话就输出...递归函数的流程就是先判断函数什么时候结束然后在判断不结束的时候的执行
    char c;
    if (n == 1) {
        c = getchar();
        putchar(c);
    }
    else {
        c = getchar();
        f(n - 1);
        putchar(c);
    }
}

int main() {
    void f(int n);
    f(5);
    return 0;
}

C语言题目逻辑实战总结_第22张图片eg23:有5个人坐在一起,问第五个人多少岁,他说比第四个大2岁
问第四个人的岁数,他说比第三个人大2岁
问第3个人的岁数,他说比第2个人大2岁
问第二个人他说比第一个人大两岁,问最后一个人他说是10岁
请问第五个人多大
程序分析:使用递归的方法,递归分为回推和递推两个阶段,要想知道低5个人岁数,需要知道第四个人的岁数,依次类推推到第一个人10,再往回推

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 

/*
    eg23:有5个人坐在一起,问第五个人多少岁,他说比第四个大2岁
    问第四个人的岁数,他说比第三个人大2岁
    问第3个人的岁数,他说比第2个人大2岁
    问第二个人他说比第一个人大两岁,问最后一个人他说是10岁
    请问第五个人多大
    程序分析:使用递归的方法,递归分为回推和递推两个阶段,要想知道低5个人岁数,需要知道第四个人的岁数,依次类推推到第一个人10,再往回推
*/
// 函数的创建
int age(int n) {
    int c = 0;
    if (n == 1) {
        c = 10;
        printf("c = %d\n", c);
    }
    else {
        c = age(n - 1) + 2;
        printf("c = %d\n", c);

    }
    return c;

}
int main() {
    int age(int n);
    printf("age(5) = %d\n ", age(5));
    return 0;
}

C语言题目逻辑实战总结_第23张图片- [ ] eg24:给一个不多于5位的正整数,要求,求它是几位数,逆序打印出各位数字
解题代码和思路

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 

/*
    - [ ] eg24:给一个不多于3位的正整数,要求,求它是几位数,逆序打印出各位数字
*/

int main() {
    // 求出个位,10位和百位的数
    int number = 123;
    int ge, shi, bai;
    bai = number / 100;
    printf("bai = %d\n", bai);
    shi = number % 100 / 10;
    printf("shi = %d\n", shi);
    ge = number % 100 % 10;
    printf("ge = %d\n", ge);
    if (bai != 0) {
        printf("是个三位数");
        printf("%d %d %d\n", ge, shi, bai);
    }
    else if (shi != 0) {
        printf("是一个两位数");
        printf("%d %d\n", ge, shi);
    }
    else if (ge != 0) {
        printf("是个个位数");
        printf("%d\n", ge);
    }
    return 0;
}

C语言题目逻辑实战总结_第24张图片eg25: 判断一个数是不是回文数

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 

/*
   题目:一个五位数,判断是不是回文数,即12321是回文数,个位和万位相同,10位和千位相同
*/

int main() {
    int number = 12345;
    scanf("%d",&number);
    printf("number = %d\n", number);
    //获取五位数
    int wan, qian, shi, ge;
    wan = number / 10000;
    qian = number % 10000 / 1000;
    shi = (number / 10) % 10;
    ge = number % 10;
    if (ge == wan && shi == qian) {
        printf("这是回文数");
    }
    else {
        printf("这不是回文数");
    }
    return 0;
}
```![在这里插入图片描述](https://img-blog.csdnimg.cn/5c2a0b44d9f84d71a1bb6086ba8e8b81.png)**eg26:   题目:请输入星期几的第一个字母来判断是星期几,如果第一个字母一样,则继续判断第二个字母 程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或者if语句判断第二个字母
 monday,tuesday,wednesday,thursday,friday,saturday,sunday**

```cpp
#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 

/*
   题目:请输入星期几的第一个字母来判断是星期几,如果第一个字母一样,则继续判断第二个字母
   程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或者if语句判断第二个字母
   monday,tuesday,wednesday,thursday,friday,saturday,sunday
*/

int main() {
	char c;
	char j;
	c = getchar();
    // 注意这里的getchar是用来吃掉上面的回车的相当于是一个缓冲,不然会报错
	getchar();
	switch (c) {
		case 'm':
			printf("monday\n");
		case 'w':
			printf("wednesday\n");
		case 't':
			printf("please input another letter\n");
			j = getchar();
			if (j == 'u') {
				printf("tuesday\n");
			}if (j == 'h') {
				printf("thurday\n");
			}
			break;
		default:
			break;
	}

}

C语言题目逻辑实战总结_第25张图片eg27: 题目:删除一个字符串中的指定字母比如字符串 “aca 删除其中的字母a” 可以思考使用指针对其进行遍历

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
/*
   题目:删除一个字符串中的指定字母比如字符串 “aca 删除其中的字母a”
   可以思考使用指针对其进行遍历
*/

int main() {
	// 初始化字符串
	char str[] = "sifosijfjkpfjfaphnjdsndjffffedf";
	printf("%s\n", str);
	char s = 'e';
	printf("%c\n", s);
	// 使用for循环遍历字符串数组
	for (int i = 0; i < strlen(str); i++) {
		if (str[i] == s) {
			for (int j = i; j < strlen(str); j++) {
				// 向前移动
				str[j] = str[j + 1];
			}
		}
		

	}
	printf("%s\n", str);
	return 0;

}

在这里插入图片描述eg28: 题目:判断一个数是否是质数程序分析:质数,又称素数,有无限个,一个大于1的自然数,除了1和它本身外,不能被其他自然数整除。

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
/*
   题目:判断一个数是否是质数
   程序分析:质数,又称素数,有无限个,一个大于1的自然数,除了1和它本身外,不能被其他自然数整除
*/
int isPrime(int m) {
	if (m <= 0) {
		return 0;
	}
	if (m == 1) {
		return 0;
	}
	if (m == 2) {
		return 0;
	}
	for (int i = 3; i < (int)sqrt((double)m); i ++) {
		if (m % i == 0) {
			return  0;
		}

	}
	return 1;

}
int main() {
	int isPrime(int m);
	int n = 13;
	//printf("%d\n", (int)sqrt((double)n));
	printf("%d\n",isPrime(n));
	return 0;
}

C语言题目逻辑实战总结_第26张图片eg29:题目:字符串反转,如将字符串“I LIKE KOBE”反转为 “EBOK EKIL I”

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
/*
   题目:字符串反转,如将字符串“I LIKE KOBE”反转为 “EBOK EKIL I”
*/

int main() {
	char s[] = "I LIKE KOBE";
	int len = 0;
	len = strlen(s);
	printf("%d\n", len);
	int i;
	char temp;
	for (i = 0; i < len / 2; i++) {
		temp = s[i];
		s[i] = s[len - 1 - i];
		s[len - 1 - i] = temp;
	}
	printf("%s\n", s);
	return 0;
}

C语言题目逻辑实战总结_第27张图片使用指针的方式进行处理

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
/*
   题目:字符串反转,如将字符串“I LIKE KOBE”反转为 “EBOK EKIL I”
*/

int main() {
	char s[] = "I LIKE KOBE";
	int len = 0;
	char* p = s;
	// 使用while循环求取字符长度
	while (*p != '\0') {
		len++;
		p++;
	}
	printf("len = %d\n", len);
	int i;
	char temp;
	for (i = 0; i < len / 2; i++) {
		temp = *(s+i);
		*(s + i) = *(s+len-1-i);
		*(s + len - 1 - i) = temp;
	}
	printf("%s\n", s);
	return 0;
}

- [ ] eg30:题目:求100以内的素数

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
/*
   题目:求100以内的素数
*/
int isPrime(int m) {
	if (m <= 0) {
		return 0;
	}
	if (m == 1) {
		return 0;
	}
	if (m == 2) {
		return 0;
	}
	for (int i = 3; i < (int)sqrt((double)m); i++) {
		if (m % i == 0) {
			return  0;
		}

	}
	return 1;

}
int main() {
	int isPrime(int m);
	int i;
	for (i = 2; i <= 100; i++) {
		if (isPrime(i)) {
			printf("%d  ", i);

	   }
	}
	return 0;

}

C语言题目逻辑实战总结_第28张图片

  • eg31: 题目:求一个3*3矩阵对角线元素之和
#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
/*
   题目:求一个3*3矩阵对角线元素之和
*/

int main() {
	// 创建二维数组
	int a[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
	int i = 0;
	int sum = 0;
	for (i = 0; i < 3; i++) {
		sum += a[i][i];
	}
	printf("对角线之和sum = %d\n", sum);
	return 0;
}

C语言题目逻辑实战总结_第29张图片- [ ] eg32: 题目:有一个已经排好序的数组,现输入一个数,要求按原来的规律将它插入属猪中程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间数的情况,插入后此元素之后的数,依次后移一个位置。

解题代码个思路

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
/*
   题目:有一个已经排好序的数组,现输入一个数,要求按原来的规律将它插入属猪中
   程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间数的情况,插入后此元素之后的数,依次后移一个位置
*/

int main() {
	int a[12] = { 1,4,6,9,13,16,19,28,40,100 };
	int i;
	int j;
	int b = 10;
	// 求取数组长度
	int length = sizeof(a) / sizeof(a[0]);
	printf("原来的数组是:");
	// 对数组进行遍历
	for (i = 0; i < length; i++) {
		printf("%-4d", a[i]);
	}
	printf("\n");
	//插入这个数
	if (b > a[9]) {
		a[10] = b;
	}
	else {
		for (i = 0; i < 10; i++) {
			if (a[i] < b) {
				continue;
			}
			else {
				for (j = 9; j >= i; j--) {
					a[j + 1] = a[j];
				}
				a[j + 1] = b;
			}
			break;
		}
	}


	printf("之后输入的数组是:");
	// 对数组进行遍历
	for (i = 0; i < length; i++) {
		printf("%-4d", a[i]);
	}
	printf("\n");
	return 0;

}

C语言题目逻辑实战总结_第30张图片eg33:题目将一个数组逆序输出。程序分析:用最后一个和第一个交换

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
/*
   eg33:题目将一个数组逆序输出。程序分析:用最后一个和第一个交换.
*/

int main() {
	// 创建一个数组
	int a[] = { 0,1,2,3,4,5,6,7,8,9 };
	// 求取数组长度
	int length = sizeof(a) / sizeof(a[0]);
	// 定义一个变量I
	int i;
	// 创建一个中间变量用于交换
	int temp;
	// 输出一下
	printf("原始数组是:\n");
	// 遍历数组
	for (i = 0; i < length; i++) {
	    // 将遍历后的数组打印输出
		printf("%d ", a[i]);
	}
	printf("\n");
	//数据的置换
	for (i = 0; i < length / 2; i++)
	{
		// 数组中数据的置换
		temp = a[i];
		a[i] = a[length - 1 - i];
		a[length - 1 - i] = temp;
	}


	// 打印输出排序后的数组
	printf("排序后的数组\n");
	for (i = 0; i < length / 2; i++) {
		printf("%d ", a[i]);
	}
	printf("\n");
	return 0;

}

C语言题目逻辑实战总结_第31张图片eg34:全局变量,静态变量,auto变量,register变量

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
/*
   eg33:全局变量,静态变量,auto变量,register变量
*/
// 创建函数返回值为void
void sellTicket() {
	// 只初始化一次,不会对这个变量重新的初始化
	static int num = 5;
	num--;
	printf("inside sellTicke() num = %d\n", num);
}
int main() {
	int a;
	for (a = 0; a < 5; a++) { 
		sellTicket();
	}return 0;

}

C语言题目逻辑实战总结_第32张图片eg35:变量的作用域**

解题的代码和思路

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
/*
   eg33:函数变量的作用域
*/
// 全局变量
int a = 1;
int b = 10;
int c;
void add() {
	c = a + b;
	printf("a = %d\n", a);
}

int main() {
    // 变量的作用域,对这个变量进行重新的赋值
    a = 20;
	add();
	printf("c = %d\n", c);
	return 0;
}

C语言题目逻辑实战总结_第33张图片eg:36变量的宏定义,宏定义的三种用法

解题代码和思路

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
//变量的宏定义,用法1:给变量符初始值
#define PI 3.1415926
// 使用宏定义定义一个标识符用法2:替换某一个操作符
#define CH *
// 使用宏定义的方式定义公式,像定义函数一样定义公式
#define mj(a,b) a*b*b
/*
   eg35:变量的宏定义
   1: 定义一个变量
*/

int main() {
	float r = 1.5;
	//int pai = 3.1415926;
	float mianji = PI CH r CH r;
	printf("%f\n", mianji);
	printf("mj(a,b) =%f\n", mj(PI, r));
	return 0;
}

C语言题目逻辑实战总结_第34张图片- [ ] eg37:关于宏定义的优先级问题

解题代码和思路

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 

/*
   eg35:宏定义的优先级问题
*/
#define PI 3.14
#define DaYu >
// 宏定义计算时要考虑到优先级的问题
#define MAXIMUM(X,Y) ((X>(Y))?(X):(Y))

int MaxiMum(int x, int y) {
	return (x > y ? x : y);
}

int main() {
	int MaxiMum(int x, int y);
	int a = 10;
	int b = 20;
	int c = MAXIMUM(a,a+b);
	printf("大的那个是:%d\n", c);
	return 0;
}

C语言题目逻辑实战总结_第35张图片eg38:条件编译,#if,#ifdef,#ifndef编译器没有编译该语句,该语句不生成汇编语言

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 

/*
  eg38:条件编译,#if,#ifdef,#ifndef编译器没有编译该语句,该语句不生成汇编语言
*/
#define MAX
#define MAXIMUM(x,y) (x>y)?x:y
#define MINIMUM(x,y) (x>y)?y:x



int main() {
    // 编写预编译语言的代码
	int a = 10, b = 20;
		//定义过表示执行这个语句下的语句没有定义过就不执行这个语句下的语句
		#ifdef MAX
			printf("更大的数字是 %d\n", MAXIMUM(a, b));
        #else
	        printf("更小的数字是 %d\n", MINIMUM(a, b));
		#endif

	return 0;

}

C语言题目逻辑实战总结_第36张图片eg39:协作式开发c语言项目
C语言题目逻辑实战总结_第37张图片在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
#include "myTestHead.h"
#include "myName.h"
/*
  eg38:条件编译,#if,#ifdef,#ifndef编译器没有编译该语句,该语句不生成汇编语言
*/
#define MAX
#define MAXIMUM(x,y) (x>y)?x:y
#define MINIMUM(x,y) (x>y)?y:x



int main() {
	int addInt(int x, int y);
	float addFloat(float x, float y);
	float r = 1.5;
	float area = PI * r * r;
	printf("areas = %f\n", area);

	int a = 30;
	int b = 50;
	float c = 1.4;
	float d = 2.9;
	printf("a + b = %d\n", addInt(a, b));
	printf("c + d = %f\n", addFloat(c, d));
	return 0;

}

在这里插入图片描述

#pragma once
#define PI 3.1415926734198

C语言题目逻辑实战总结_第38张图片

#include "myName.h"
// 在这个文件中编写函数,实现模块的独立化开发
int addInt(int x, int y) {
	return x + y;
}

float addFloat(float x, float y) {
	return x + y;
}

eg39:按位与&,按位或|,按位异或^

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
#include "myTestHead.h"
#include "myName.h"
/*
  eg39:按位与&,按位或|,按位异或^
*/

// 二进制转换函数
int f(int desc) {
	int result = 0;
	int temp = 1;
	int yushu = 0;

	while (1) {
		yushu = desc % 2;
		desc /= 2;
		result += yushu * temp;
		temp *= 10;
		if (desc < 2) {
			result += desc * temp;
			break;
		}
	}
	return result;

}


int main() {
	int f(int desc);
	int a = 6;
	int b = 5;
	printf("%d的二进制是%d\n", a, f(a));
	// c语言的二进制表示
	printf("%d的二进制是%d\n", a, f(b));
	// 按位与 0&0 = 0, 1 & 0 = 0, 1&1 = 1;
	int c = a & b;
	printf("%d的二进制是:%d\n", c, f(c));

	// 按位与 0|0 = 0, 1 & 0 = 1, 1&1 = 1;
	int d = a | b;
	printf("%d的二进制是:%d\n", d, f(d));
	
	// 按位与 0^0 = 0, 1 & 0 = 1, 1&1 = 0;
	int e = a ^ b;
	printf("%d的二进制是:%d\n", e, f(e));
	return 0;

}

C语言题目逻辑实战总结_第39张图片eg40:对一个二进制进行按位取反

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
#include "myTestHead.h"
#include "myName.h"
/*
  eg40:对一个数的二进制进行按位取反
  原码:正数的原码等于反码等于补码,正数的符号位为0负数的原码,负数的符号位为1
  反码:正数的反码和原码一致,负数的反码是原码按位取反,符号位不变
  补码:正数的补码和原码一致,负数的补码等于:取法然后加上 1
  推理论证:
     5 ----> 0000 0101
	 ~a----> 1111 1010
	 -1----> 1111 1001
	 取反--> 1000 0110
	 b = -6;
*/


int main() {
	int a = 5;
	int b = ~a;
	printf("b = %d\n", b);
	return 0;
}

C语言题目逻辑实战总结_第40张图片eg41:杨辉三角行

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
#include "myTestHead.h"
#include "myName.h"
/*
  eg41:输出杨辉三角形
*/


int main() {
	int i;
	int j;
	int a[10][10] = {};

	for (i = 0; i < 9; i++) {
		for (j = 0; j <= i; j++) {
			if (i == j || j == 0) {
				a[i][j] = 1;
			}
	
		}
		printf("\n");
	}
	for(i = 2; i < 10; i++){
		for (j = 1; j < i; j++) {
			a[i][j] = a[i - 1][j] + a[i - 1][j - 1];
		}
		
	}
	
	for (i = 0; i < 10; i++) {
		for (j = 0; j <= i; j++) {
			printf("%-4d", a[i][j]);
	
		}
		printf("\n");
	}
	return 0;

}

在这里插入图片描述eg41:用函数交换两个变量的值

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
#include "myTestHead.h"
#include "myName.h"
/*
  eg41:使用函数交换两个变量的值

*/


// 函数的定义需要有函数头,函数体,返回值

int main() {
	// 使用中间变量的方式交换两个变量的值
	int a = 10;
	int b = 20;
	int temp;

	printf("a = %d,b = %d\n", a, b);
	// 对两个变量进行交换
	temp = a;
	a = b;
	b = temp;
	printf("a = %d,b = %d\n",a,b);
	return 0;

}

使用参数传递的方式完成数值的交换

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
#include "myTestHead.h"
#include "myName.h"
/*
  eg41:使用函数交换两个变量的值
  函数的定义需要有函数头,函数体,返回值
*/

void swap2(int* p_x, int* p_y) {
	// 中间变量
	int temp;
	temp = *p_x;
	*p_x = *p_y;
	*p_y = temp;
}


// 使用指针传递值得方式实现数值的交换
int main() {
	void swap2(int* p_x, int* p_y);
	int a = 10;
	int b = 20;
	int* pa;
	// 把a的地址给指针pa
	pa = &a;
	int* pb = &b;
	swap2(pa, pb);
	printf("a = %d, b = %d\n", *pa, *pb);
	return 0;
}

C语言题目逻辑实战总结_第41张图片eg42:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组程序分析:输出正确的答案

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
#include "myTestHead.h"
#include "myName.h"
/*
 eg42:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组程序分析:输出正确的答案
 程序分析:
 1:输入数组
 2:最大值
 3:最大值和第一个元素交换
 4:最小值
 5:最小值与最后一个元素交换
 6:输出数组
*/



int main() {
	// 创建数组
	int a[5] = {1,2,3,4,5};
	int i;
    

	int* p; // p叫做,指针变量,指针是地址,是内存地址
	for (p = a; a < a + 5; p++) { // a+0, a[0],a[4],p+5
		printf("%-4d", *p);
	}printf("\n");
	return 0;

}

以下的代码提供了一个交换最大最小值的思路:后续代码需要自己进一步完善

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
#include "myTestHead.h"
#include "myName.h"
/*
 eg42:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组程序分析:输出正确的答案
 程序分析:
 1:输入数组
 2:最大值
 3:最大值和第一个元素交换
 4:最小值
 5:最小值与最后一个元素交换
 6:输出数组
*/



int main() {
	// 创建数组
	int a[5] = {1,9,3,8,5};
	int i;
	// 用于存储最大值的下标
	int x;

	// 交换之前将数据输出一下
	int* p; // p叫做,指针变量,指针是地址,是内存地址
	for (p = a; p < a + 5; p++) { // a+0, a[0],a[4],p+5
		printf("%-4d", *p);
	}
	
	int max;
	// max 表示的是数组首元素的地址
	max = a[0];
	for (i = 0; i < 5; i++) {
		if (a[i] > max) {
			max = a[i];
			// x是最大值得坐标
			x = i;
		}
	}
	printf("max = %d,x = %d\n", max,x);
	
	int temp;
	temp = a[0];
	a[0] = a[x];
	a[x] = temp;for (p = a; p < a + 5; p++) { // a+0, a[0],a[4],p+5
		printf("%-4d", *p);
	}printf("\n");
	return 0;

}

C语言题目逻辑实战总结_第42张图片一定要记住回来完善补全这部分的代码
eg43:有n个整数,使其前面的各数顺序向后移动n个位置,最后m个数编程最前面的m个数
解题代码和思路

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
#include "myTestHead.h"
#include "myName.h"
/*
   eg43:有n个整数,使其前面的各数顺序向后移动n个位置,最后m个数编程最前面的m个数。

	for (i = 0; i < length; i++) {
		printf("%-4d", a[i]);
	}

*/



int main() {
	// 创建一个数组
	int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int i;
	// 计算数组中的元素
	int length = sizeof(a) / sizeof(a[0]);
	int* p;


	for (int i = 1; i <= 3; i++) {
			/*
		   解题思路:
		   1:保存10
		   2:把10前面的所有数,依次后移一位
		   3:把10放到第一个位置
		   4:循环进行两次
		   */
			p = a + length - 1;
			int temp;
			temp = *p;
			// 把10前面的元素依次往后移
	
			while (p > a) {
				*p = *(p - 1);
				p--;
			}
			*p = temp;
	
	}
	
	for (p = a; p <= a + length - 1; p++) {
		printf("%-4d", *p);
	}



	return 0;

}

C语言题目逻辑实战总结_第43张图片- [ ] eg44:有n个人围成一圈,顺序排号

  • 从第一个人开始报数(从1-3开始报数),凡是报到3的人退出圈子,问最后留下来的是原来第几号那位
    解题的代码和思路
#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
#include "myTestHead.h"
#include "myName.h"
/*



int main() {
	int table[100] = { 1,1,1,1 };
	for (int i = 0; i <= 8; i++) {
		table[i] = 1;
	}
	for (int i = 1; i <= 8; i++) {
		printf("%-4d", table[i]);
	}
	printf("\n");
	int index;
	int baoShu;
	int count = 8;
	index = 0;
	baoShu = 0;
	while (count > 0) {
		index++;
		baoShu++;
		// 判断出界操作的时候一般是先判断然后再啊执行我们的操作
		while (table[index] == 0) {
			index++;
			if (index > 8) {
				index = 1;
			}
		}
		if (baoShu == 3) {
			table[index] == 0;
			printf("%-4d", index);
			count--;
			baoShu = 0;
		}
	

	}


	return 0;

}

C语言题目逻辑实战总结_第44张图片 eg45: 写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度
1: 写一个函数
2:求一个字符串长度
3:在main函数中输入字符串

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
#include "myTestHead.h"
#include "myName.h"
/*
   eg45: 写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度
   1: 写一个函数
   2:求一个字符串长度
   3:在main函数中输入字符串
*/

int lenoString(char a[]) {
     // 通过指针对数组进行操作
	char* p;
	p = a;
	int count = 0;
	while (*p != '\0') {
		count++;
		p++;
	}
	return count;
}
int lenoString2(char* p) {
	int count = 0;
	while (*p != '\0') {
		count++;
		p++;
	}
	return count;
}


int main() {
	int lenoString(char a[]);
	int lenoString2(char* p);
	char a[] = "vsbudvnsonvaonvjsnv";
    char *p = (char *)"svhnsnvsonvsnvjsfsdf";
	char* p_a;
	p_a = a;


	int count = 0;
	while (*p_a != '\0') {
		count++;
		p_a++;
	}
	printf("count == %d\n", count);
	printf("lenoString = %d\n", lenoString(a));
	printf("lenoString2 = %d\n", lenoString2(p));
	return 0;

}

C语言题目逻辑实战总结_第45张图片eg46:编写input()和output()函数输入,输出5个学生的数据记录

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
#include "myTestHead.h"
#include "myName.h"
/*
	eg46:编写input()和output()函数输入,输出5个学生的数据记录
	1:函数,定义,声明,调用
	2:学生数据记录。实体,对象,结构体
	3:多个结构体,结构体数组
*/
struct student {
	char name[30];
	char sex[5];
	char age;

};

// 输入一个函数不需要返回值要给结构体赋初始值
void input(struct student *stu) {
	int i;
	for (i = 0; i < 3; i++) {
		scanf("%s%s%d", stu[i].name, stu[i].sex, &stu[i].age);

	}

}
// 字符输出函数
void output(struct student* stu) {
	int i;
	for (i = 0; i < 3; i++) {
		printf("name->is : %s, sex->is : %s, age->is: %d\n", stu[i].name, stu[i].sex, stu[i].age);
	}
}

// 等于就是,定义了一种新的数据类型叫做struct student
int main() {

    // 结构体的声明
    struct student stu1;
    struct student stu2[3];
    // 函数的声明
    void input(struct student* stu);
    void output(struct student* stu);
    // 使用循环的方式对数组进行赋值
    input(stu2);
    output(stu2);
    
    /*
    			调用结构体中的数据,使用字符串拷贝函数将字符串赋值到字符串拷贝函数中
    			strcpy(stu1.name, "1419010114");
    			stu1.age = 23;
    			strcpy(stu1.sex, "男");
    			printf("name->is : %s, age->is : %d, sex->is: %s\n", stu1.name, stu1.age, stu1.sex);
    */
    return 0;

}

C语言题目逻辑实战总结_第46张图片
**eg47:malloc的用法,创建一个链表(malloc动态创建链表)
void *malloc(size_t,size)
void *realloc(void ptr,size_t size);
void free(void p);

解题代码和思路

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
#include "myTestHead.h"
#include "myName.h"
/*
	eg47:malloc的用法,创建一个链表(malloc动态创建链表)
	void *malloc(size_t,size)
	void *realloc(void *ptr,size_t size);
	void free(void *p);
*/

int main() {
	/*
	  	// 强制类型转换一下
		int *p =(int *) malloc(sizeof(int) * 20);
		int i = 10;
		*p = i;
		printf("*p = %d\n", *p);
		// 释放内存空间
		free(p);
	

	*/
	char* p;
	p = (char*)malloc(sizeof(char) * 20);
	strcpy(p, "helloword");
	printf("%s sizeof(p) = %zd\n", p, sizeof(p));
	
	char* q;
	q = (char*)realloc(p,sizeof(char) * 20);
	// 使用字符串拼接函数
	strcat(q, "teacher");
	printf("%s sizeof(q) = %zd\n", q, sizeof(q));
	free(p);
	free(q);
	
	return 0;

}

C语言题目逻辑实战总结_第47张图片eg47:输入一个整数,并将其反转后输出
C语言题目逻辑实战总结_第48张图片C语言题目逻辑实战总结_第49张图片
eg48:编写一个函数,输入n为偶数时,调用函数1/2+1/4+…+1/n,当输入n为奇数时调用函数1/1+1/3+…+1/n(利用指针函数)
指针函数:本质是一个函数,不过它的返回值是一个指针
函数指针:本质是一个指针,该指针的地址指向一个函数,所以它是指向函数的指针,定义如下:
#include
int main(void){
​ return 0;
}

eg48:编写一个函数,输入n为偶数时,调用函数1/2+1/4+…+1/n,当输入n为奇数时调用函数1/1+1/3+…+1/n(利用指针函数)
指针函数:本质是一个函数,不过它的返回值是一个指针
函数指针:本质是一个指针,该指针的地址指向一个函数,所以它是指向函数的指针,定义如下:
#include
int main(void){
​ return 0;
}

函数指针的用法,求两个值相加后的结果
C语言题目逻辑实战总结_第50张图片
C语言题目逻辑实战总结_第51张图片取出函数的地址实现三个数之间的和(用于理解函数指针的用法,定义和函数指针的调用)

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
#include "myTestHead.h"
#include "myName.h"
/*
	eg48:编写一个函数,输入n为偶数时,调用函数1/2+1/4+.....+1/n,当输入n为奇数时调用函数1/1+1/3+.......+1/n(利用指针函数)

	指针函数:本质是一个函数,不过它的返回值是一个指针
	
	函数指针:本质是一个指针,该指针的地址指向一个函数,所以它是指向函数的指针,定义如下:
	typedef int (*fun_ptr)(int,int);

*/

// 定义一个实现加法的函数
int add(int x, int y) {
	return x + y;
}
int main(void) { 
	int add(int x, int y);
	// 将函数的地址取出来存储发哦p_add中
	int (*p_add)(int, int) = &add;
	int a = 10;
	int b = 20;
	int c = 30;
	int sum = 0;
	sum = p_add(a, b);
	printf("sum = %d\n", sum);
	// 求三个数的和
	printf("三个数的和是%d\n", p_add((a, b), c));
	return 0;
}

C语言题目逻辑实战总结_第52张图片以下代码存在一点小的问题需要后续去解决处理

*eg49:编写一个函数,输入n为偶数时,调用函数1/2+1/4+…+1/n,当输入n为奇数时调用函数1/1+1/3+…+1/n(利用指针函数)
指针函数:本质是一个函数,不过它的返回值是一个指针
函数指针:本质是一个指针,该指针的地址指向一个函数,所以它是指向函数的指针,定义如下:
typedef int (fun_ptr)(int,int);

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
#include "myTestHead.h"
#include "myName.h"
/*
	eg48:编写一个函数,输入n为偶数时,调用函数1/2+1/4+.....+1/n,当输入n为奇数时调用函数1/1+1/3+.......+1/n(利用指针函数)

	指针函数:本质是一个函数,不过它的返回值是一个指针
	函数指针:本质是一个指针,该指针的地址指向一个函数,所以它是指向函数的指针,定义如下:
	typedef int (*fun_ptr)(int,int);

*/
double fun1(int n) {
	int i;
	double k = 0.0;
	double sum = 0;
	for (i = 2; k <= n; i += 2) {
		k = (double)1 / i;
		sum += k;
	}
	return sum;
}

double fun2(int n) {
	int i;
	double k= 0.0;
	double sum = 0;
	for (i = 1; k <= n; i += 2) {
		k = (double)1 / i;
		sum += k;
	}
	return sum;
}

int main(void) { 
	double fun1(int n);
	double fun2(int n);
	// 使用函数指针的方式进行调用
	double (*p)(int);

	int n = 5;

//	scanf("%d", &n);
	if (n % 2 == 0) {
		p = fun1;
	}
	else {
		p = fun2;
	}
	double result = p(n);
	printf("result = %lf\n", result);

	return 0;

}

eg50:指向指针的指针,二级指针(表示的是指向指针的指针)

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
#include "myTestHead.h"
#include "myName.h"
/*
	eg49:1:指向指针的指针(二级指针)
	      2:二维数组

*/

int main(void) { 
    // 指向指针的指针
	int a = 100;
	int* p1 = &a;
	int** p2 = &p1;

	printf("&a = %x\n", &a);
	printf("*p2 = %x\n",*p2);
	printf("a = %d\n", a);
	printf("**p2 = %d\n", **p2);
	
	return 0;

}

C语言题目逻辑实战总结_第53张图片使用指针获取数组元素的方式

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
#include "myTestHead.h"
#include "myName.h"
/*
	eg49:1:二维数组
	      

*/

int main(void) { 
    // c语言中的二维数组,定义了一个3行4列的二维数组
	int a[3][4] = { {2,1,2,3},{4,5,6,7},{8,9,10,11} };
	int* p0 = (int *) &a[0];
	int* p1 = (int *) &a[1];
	int* p2 = (int *) &a[2];
	printf("*p0 = %d\n", *p0);


	/*
	   使用指针访问二维数组中的任何一个数
	*/
	// 获取数组中不同元素的方式
	int(*p)[4] = a;
	// 表示的是:获取第一行中的第一个元素
	printf("%d\n", *(*p + 0) + 0);
	// 表示的是:获取第一行中的第二个元素
	printf("%d\n", *(*p + 0) + 1);
	// 表示的是:获取第二行中的第二个元素
	printf("%d\n", *(*p + 1) + 1);
	return 0;

}

C语言题目逻辑实战总结_第54张图片指针数组二级指针访问数据
C语言题目逻辑实战总结_第55张图片C语言题目逻辑实战总结_第56张图片C语言题目逻辑实战总结_第57张图片
C语言题目逻辑实战总结_第58张图片eg51:1:二维数组获取字符串的值

C语言题目逻辑实战总结_第59张图片
C语言题目逻辑实战总结_第60张图片eg52:结构体的定义和调用
C语言题目逻辑实战总结_第61张图片
C语言题目逻辑实战总结_第62张图片C语言题目逻辑实战总结_第63张图片

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
#include "myTestHead.h"
#include "myName.h"
/*
	eg50:结构体指针找一个年龄大的人     
*/
struct man {
	char name[20];
	char age;
}person[3] = { "li",18,"huang",23,"zhou",22 };


int main(void){
	/*
	   void 表示的是没有返回值,没有形式参数
	   void  *
	  

	*/
	
	struct man* p; 
	p = person;
	int m = 0;
	struct man* q = NULL;
	for (int i = 0; i < 3; i++) {
		if (p-> age > m) {
			m = p->age;
			q = p;
	
		}
		p++;
	}
	printf("%s, %d\n", q->name, q->age);
	return 0;

}

C语言题目逻辑实战总结_第64张图片

eg53字符串排序操作

eg51:字符串排序
1:首先要有若干个字符串
2:排序,比较大小
3:展示出来: a = 10; b = 20; b , a , a = 20, b = 10;

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
#include "myTestHead.h"
#include "myName.h"
/*
	eg51:字符串排序
	1:首先要有若干个字符串
	2:排序,比较大小
	3:展示出来: a = 10; b = 20; b , a , a = 20, b = 10;
*/
void swap(char* str1,char*str2) {
	char temp[20];
	// 交换两个字符串
	strcpy(temp, str1);
	strcpy(str1, str2);
	strcpy(str2, temp);
}


int main(void){
	char str1[20] = "1234";
	char str2[20] = "1134";

	//fgets(str2, 20, stdin);
	//printf("%s\n", str2);
	
	if (strcmp(str1,str2) > 0) {
		printf("str1 is bigger\n");
	}
	else {
		// swap函数交换两个字符串
		swap(str1, str2);
		printf("str2 is bigger\n");
	}
	printf("%s,%s\n", str1, str2);
	return 0;

}

eg52:question —> 809?? = 800 * ?? + 9 ??,其中??代表的是两位数
809
??为4位数,8
??的结果是两位数,9*??的结果是三位数,求??代表的两位数,以及809*??后的结果**

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
#include "myTestHead.h"
#include "myName.h"
/*
	eg52:question ---> 809*?? = 800 * ?? + 9 *??,其中??代表的是两位数
	809*??为4位数,8*??的结果是两位数,9*??的结果是三位数,求??代表的两位数,以及809*??后的结果
*/


int main(void){
	int a = 0;
	for (a = 10; a < 100; a++) {
		if (809 * a >= 1000 && 809 * a <= 10000 && 8 * a < 100 && 9 * a >= 100) {
			printf("%d = %d * %d\n", 809 * a, 800 * a, 9 * a);

		}
	}
	
	return 0;

}

C语言题目逻辑实战总结_第65张图片eg53:将八进制的数转换为10进制

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
#include "myTestHead.h"
#include "myName.h"
/*
	eg52:将8进制转换为10进制
	(123)8 = 1 * 8 ^2 ...

*/


int main(void){
	char s[20] = "123";
	int i = 0;
	int n = 0;
	while (s[i] != '\0') {
		n = n * 8 + s[i] - '0';
		i++;
	}
	printf("%d\n", n);
	

	return 0;

}

C语言题目逻辑实战总结_第66张图片**- [ ] eg54:求0-7所能组成的奇数个数

  • 这个问题其实是一个数组排列组合问题,设这个数为sun = a1a2a3a4a5a6a7a8 ,a1 - a8
  • 当表示这个数的某位数值,当一个数的最后一位为奇数时,那么这个数一定为奇数,不管前面的几位是什么数字,如果最后的一位数为偶数,则这个一定为偶数
  • a1-a8可以取 0-7这八个数字,首位数字不为0;
  • 从该数为一位数到该数为8位数统计奇数个数
  • 1:当只有一位数时也就是该数的最后一位,奇数个数为4
  • 2:当该数为两位数时,奇数个数为4*7 = 28;
  • 3:当该数为三位数时,奇数个数为4 * 8*7 = 224**
#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
#include "myTestHead.h"
#include "myName.h"
/*
	eg52:将8进制转换为10进制
	(123)8 = 1 * 8 ^2 ...

*/


int main(void){
	int n = 0;
	int sum = 4;
	for (n = 1; n <= 4; n++) {
		if (n == 1) {
			printf("一共有%d位数,奇数的个数为%d\n", n, 4);
		}
		else if (n == 2) {
			sum += 4 * 7;
			printf("一共有%d位数,奇数的个数为%d\n", n, 4 * 7);

		}
		else {
			sum += 7 * (int)pow(8, n - 2) * 4;
			printf("一共有%d位数,奇数的个数为%d\n", n, 7 * (int)pow(8, n - 2) * 4);
		}
	}
	
	printf("奇数的总数是%d\n", sum);
	return 0;

}

C语言题目逻辑实战总结_第67张图片eg54:判断一个素数可以被几个9整除

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
#include "myTestHead.h"
#include "myName.h"
/*
   eg54:判断一个素数可以被几个9整除
*/

int main(void){
	int ss = 11;
	int a = 9;
	while (a % ss != 0) {
		a = a * 10 + 9;
	}
	printf("a = %d\n", a);
	return 0;
}

C语言题目逻辑实战总结_第68张图片
*- [ ] eg55:两个字符串链接程序
1: 在c语言中字符串的处理是使用 char a , 和 char a[]

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
#include "myTestHead.h"
#include "myName.h"
/*
   eg55:两个字符串链接程序
   1: 在c语言中字符串的处理是使用 char *a , 和 char a[]
*/

int main(void){
	char str1[50] = " I am a teacher";
	puts(str1);
	char str2[50] = "love";
	puts(str2);
	// 字符串链接函数strcat(str1, str2);
	char * str = (char*)malloc(strlen(str1) + strlen(str2) + 1);
	strcat(str, str1);
	strcat(str, str2);
	puts(str);
	return 0;
}

C语言题目逻辑实战总结_第69张图片eg56:结构体变量传递

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
#include "myTestHead.h"
#include "myName.h"
/*
	eg56:结构体变量传递
	1: 结构体初始化:结构体的值是如何传递的
*/
struct student {
	int age;
	int gender;

};


void changeStu(struct student a) {
	a.age = 22;
	a.gender = 'M';
}

void changeStuAgain(struct student *a) {
	a->age = 30;
	a->gender = 'M';
}

int main(void){
	void changeStu(struct student a);
	void changeStuAgain(struct student* a);
	struct student oneStu;
	struct student* p_oneStu;
	p_oneStu = &oneStu;
	oneStu.age = 23;
	oneStu.gender = 'H';
	printf("oneStu  age  = %d ,gender = %c\n",oneStu.age,oneStu.gender);
	// 调用函数并传入参数
	changeStu(oneStu);
	printf("option -> oneStu  age  = %d ,option -> gender = %c\n", oneStu.age, oneStu.gender);
	// 调用函数传入当前定义的指针
	changeStuAgain(p_oneStu);
	printf("option_p -> oneStu  age  = %d ,option_p -> gender = %c\n", oneStu.age, oneStu.gender);
	return 0;
}

C语言题目逻辑实战总结_第70张图片eg56:读取7个数(1-59)的整数值,每读取一个值,程序打印出该值个数
1:如何读一个数
2:如何打印出一个

3:如何打印出这么多个***

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
#include "myTestHead.h"
#include "myName.h"
/*
	eg56:读取7个数(1-59)的整数值,每读取一个值,程序打印出该值个数*
	1:如何读一个数
	2:如何打印出一个*
	3:如何打印出这么多个*
*/

void printStar(int n) {
	int i;
	for (i = 0; i < n; i++) {
		printf("*");
	}
	printf("\n");
}

int main(void){
	void printStar(int n);
	int n = 10;
	printf("请输入一个整数: ");
	scanf("%d", &n);
	printStar(n);

	return 0;

}

C语言题目逻辑实战总结_第71张图片eg56:某公司采用公用电话传递数据,数据是四位整数,在传递的过程中是加密的,加密的规则如下,每位数字都加上5,然后用10的余数代替该数字,在将第一位和第四位交换,第二位和第三位交换

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 
#include "myTestHead.h"
#include "myName.h"
/*
	eg56:某公司采用公用电话传递数据,数据是四位整数,在传递的过程中是加密的,加密的规则如下,每位数字都加上5,然后用
	10的余数代替该数字,在将第一位和第四位交换,第二位和第三位交换
*/

int main(void){
	int a;
	printf("请你输入一个四位数: ");
	scanf("%d", &a);
	printf("&-4d\n", a);
	// 每位数字都加上5
	int aa[4] = {0};
	aa[0] = a % 10;
	aa[1] = a % 100 / 10;
	aa[2] = a % 1000 / 100;
	aa[3] = a / 1000;
	for (int i = 0; i < 4; i++) {
		printf("%-4d", aa[i]);
	}
	for (int i = 0; i < 4; i++) {
		aa[i] += 5;
		aa[i] %= 10;
	}
	for (int i = 0; i < 4; i++) {
		printf("%-4d", aa[i]);
	}
	int t;
	for (int i = 0; i < 2; i++) {
		t = aa[i];
		aa[i] = aa[3 - i];
		aa[3 - i] = t;
	}
	printf("加密之后的数组: ");
	for (int i = 0; i < 4; i++) {
		printf("%-4d", aa[i]);
	}

	return 0;

}

C语言题目逻辑实战总结_第72张图片c语言中函数的递归问题:简单来说就是函数自己调用自己的过程就是递归

#define _CRT_SECURE_NO_WARNINGS
#include
#include 
#include 
#include 
#include 

/*
	eg56:用递归的方法实现循环嵌套
*/
int sumN(int n) {
	if (n == 1) {
		return 1;
	}
	else {
		return sumN(n - 1) + n;
	}
}

int main(){
	int sumN(int n);
	int k = 100;
	printf("sumN = %d\n", sumN(k));

	return 0;
}

C语言题目逻辑实战总结_第73张图片

持续更新中…

你可能感兴趣的:(c语言,开发语言,visual,code,visual,studio)