C语言学习心得 (阶段:小白)

首先和大家介绍一下:

从这个阶段开始,大家有几条路可以走

1.深入学习C语言和其他语言,然后学数据结构与算法,刷PTA和Leetcode上的题(软件)

2.转向arduino,51,32等单片机领域(硬件)

3.二者交叉,转向物联网,机器视觉,计算机视觉,图形学等交叉领域(交叉)

我选择了第三条路,所以在今后的博客中,我会把我所学所练的知识进行整合概括,并在博客中体现出来。

—————————————————————

1.注意scanf中如果用了逗号,输入数字的时候也需要有逗号(极其易犯的错误)

#include 
float sub(float x, float y);
void main()
{
	float a, b, c;
	scanf("%f,%f", &a, &b);
	c = sub(a,b);
	printf("sub is %f\n", c);
}
float sub(float x, float y)
{
	float z;
	z = x - y;
	return (z);
}//输入的时候也要记得带逗号

在以下的内容中,我们开始练习比较难的程序,会把数组,指针和递归算法融合进程序中

2.分别用循环法和递归法求n的阶乘

下面的这段代码利用循环法求出了n的阶乘

#include 
int fac(int n)
{
	int ret=1;
	for (int i = 1; i <= n; i++) 
	{
		ret *= i;//ret=ret*i;
	}
	return ret;
}
int main()
{
	int ret = 1;
	int num = 0;
	scanf("%d", &num);
	if (num == 0)
	{
		ret = 1;
		printf("阶乘是:%d\n", ret);
	}
	else if (num < 0)
	{
		printf("请输入一个大于0的数字\n");
	}
	else
	{
		printf("%d\n", fac(num));
	}	
	return 0;
}

用递归法求n的阶乘

#include 
int fac(int n)
{
	int f;
	    if (n < 0)
		    printf("error!");
	    else if (n == 0 || n == 1)
		    f = 1;
		else
			f = fac(n - 1) * n;
	    return(f);
}
int main()
{
	int n, y;
	printf("请输入一个整数");
	scanf("%d", &n);
	y = fac(n);
	printf("%d!=%d\n", n, y);
	return 0;

}

其实我在这个阶段的时候,真的不清楚递归是什么,后来看了很多篇博客,在老师的点拨之下才明白:

C语言学习心得 (阶段:小白)_第1张图片

其实就是依次递推。。。。。(真的没有想的这么难) 

练习:用递推法求斐波那契数列的前十项

#include 
int main()
{
	int a[10] = { 1,1 }, i;
	for (i = 2; i <10; i++) {
		a[i] = a[i - 1] + a[i - 2];
	}
	for (i = 0; i <10; i++)//数组元素是从零开始的
		printf("%6ld\n", a[i]);

}

在用for循环数组时,一定要记住i是从零开始遍历的,至n-1结束

3.进行摄氏度和华氏之间的转换(摄氏度和华氏都有可能是小数,所以要用float进行定义)

#include 
int main()
{
	float celsius, fahr;
	int a, b,c;
	a = 0;
	b = 300;
	c = 20;
	printf("C   F\n\n");
	celsius = a;
	while(celsius<=b)
	{
		fahr = (9.0 / 5.0) * celsius + 32.0;
		printf("%3.0f%6.1f\n", celsius, fahr);
		celsius = celsius + c;
	}

}

以相反的顺序打印温度表

#include 
int main()
{
	float celsius, fahr;
	int a, b, c;
	a = 0;
	b = 300;
	c = 20;
	printf("C    F\n\n");
	celsius = b;
	while (celsius >= a)
	{
		fahr = (9.0 / 5.0) * celsius + 32.0;
		printf("%3.0f%6.1f\n", celsius, fahr);
		celsius = celsius - c;
	}

}

以最少的代码完成和上述代码一样的功能

#include 
int main(){
	int celsius;
	for (celsius = 300; celsius >=0; celsius = celsius - 20)//最大值,大于等于最小值;循环+、-值
		printf("%3d%6.1f\n", celsius, (9.0 / 5.0) * celsius+32.0);
}

 4.在键盘上输入一个学生5门考试成绩,计算平均值,最低分,最高分

#include 
int main()
{
	float a[5],min,max,avarage = 0,sum=0;//用float初始化也可以
	for (int i = 0; i < 5; i++)
		scanf("%f",&a[i]);//把i的值赋到数组中
	min = a[0];
	max = a[0];
	for (int i = 0; i < 5; i++)
	{
		sum = sum + a[i];
		if (a[i] < min)
			min = a[i];//把i的值赋给min
		if (a[i]> max)
			max = a[i];
	}
	avarage = sum / 5;
	printf("平均值为%f,最低分为%f,最高分为%f", avarage, min, max);
	return 0;
}

在输入这个程序时,当时的我出现了如下问题:

1.把i与a割裂看待,实际上i是a中的元素,为a[i]
2.把i值附到a中时形式错误,应是scanf("%d",&a[i])
3.scanf中格式符忘写了
4.min和max也是a[i]中的元素,和数组一样一开始需要赋初值
5.min和max在调用的时候不要再用数组表示了,可以理解为选择循环,数组中的第一个值恒为min或max,其他通过i来循环,比较i和min,max的大小
6.平均值是循环后才得出的,不要写在循环外
7.要写返回值
8.成绩不可能只为整数,要用float来设定某些值
9.多检查几遍

5.实现二维数组行列互换

#include 
int main()
{
	int a[2][3], b[3][2];
	int i, j;
	for (i = 0; i < 2; i++)
		for (j = 0; j < 3; j++)
			scanf("%d", &a[2][3]);
	for (j = 0; j < 3; j++)
		for (i = 0; i < 2; i++)
            b[j][i]=a[i][j];//要把a数组值赋给b数组值
	for (i= 0; i < 2; i++)
	{
		printf("\n");
		for (j = 0; j < 3; j++)
		    printf("%d", b[j][i]);
	}
			
	return 0;
}

6.请排列出1到100的素数

提示:

1、要先定义一个整型数组及长度。取数组中元素是通过下标方式获取,下标从0开始,所以长度为20的数组,最大下标是19。用时请不要越界

3、素数又称质数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;

解决方法:

通过比较m和i的大小将素数排列出来(比较除数和被除数的大小)

#include 
int main()
{
	int m, i;
	printf("1,2");
	for (i = 3; i <= 100; i += 2) {
		for (m = 3; m = i) {
			printf(",%d", i);
		}
	}
	printf("\n");
	return 0;
}

毫不夸张的说,如果你把上述所有代码都编译通过,并把我之前的那片博文看完,你就已经进阶成一位初级C语言程序员了,至少应付期末考试还是没什么问题的。

指针及之后的算法知识,我会通过其他博文进行深入细致的讲解

你可能感兴趣的:(说说C的那些事,c语言,递归算法)