首先和大家介绍一下:
从这个阶段开始,大家有几条路可以走
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;
}
其实我在这个阶段的时候,真的不清楚递归是什么,后来看了很多篇博客,在老师的点拨之下才明白:
其实就是依次递推。。。。。(真的没有想的这么难)
练习:用递推法求斐波那契数列的前十项
#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语言程序员了,至少应付期末考试还是没什么问题的。
指针及之后的算法知识,我会通过其他博文进行深入细致的讲解