小建议:
重构代码,随着知识面的完善,逐渐完善自己从前的代码,提升自己。
编译过程
预处理 编译 汇编 链接
正常程序员编程时:
在编程时要考虑异常情况,会加上异常处理函数
gcc
选项 | 含义 | 后缀转换过程 |
---|---|---|
-E | gcc预处理c文件 | helloworld.c -> helloworld.i |
-S | gcc编译c文件 | helloworld.i -> helloworld.s |
-c | gcc编译汇编 | helloworld.s -> helloworld.o |
-l | gcc链接可重定位文件 | \ |
-Wall | all warning 将编译过程中的隐藏警告打印出来 | \ |
深入了解 推荐:《编译原理》《链接器原理》
gcc预处理c文件
sudo gcc -E helloworld.c -o helloworld.i -v
gcc编译c文件
sudo gcc -S helloworld.i -o helloworld.s -v
gcc编译汇编
sudo gcc -C helloworld.s -o helloworld.o -v
gcc链接可重定位文件
ld连接器
循环结构
while循环语句
**作用:**满足循环条件,执行循环语句
语法:while(循环条件){ 循环语句 }
解释:只要循环条件的结果为真,就执行循环语句
示例:
int main()
{
int i , sum = 0;
while(i <= 100) //注意:while循环后不加分号;
{
sum = sum + i;
i = i+1
}
printf("i = %d\n",i);
printf("sum = %d\n",sum);
return 0;
}
do…while循环语句
作用: 满足循环条件,执行循环语句
语法: do{ 循环语句 } while(循环条件);
**注意:**与while的区别在于do…while会先执行一次循环语句,再判断循环条件
示例:
int main()
{
int i , sum = 0;
do
{
sum = sum + i;
i = i+1
}while(i <= 100); //do while 循环后要加分号;
printf("i = %d\n",i);
printf("sum = %d\n",sum);
return 0;
}
小结
while 循环体最少执行0次
do while 循环体最少执行1次
for 循环体最少执行0次
do while 与while 循环区别在于,do…while先执行一次循环语句,再判断循环条件
注意:
while循环后不加分号;
do while 循环后要加分号;
练习
练习一
读入数据,直到终端输入为0为止,计算输入的偶数(even)个数及平均值,以及奇数(odd)的个数及奇数的平均值
我的代码
#include <stdio.h>
int main()
{
int n = 1; //定义提示输入变量
int e = 0; //定义偶数
int o = 0; //定义奇数
int ret; //定义需要输入的变量
float esum=0; //定义偶数求和
float osum=0; //定义技术求和
float eaver=0; //定义偶数平均值
float oaver=0; //定义奇数平均值
do
{
printf("请输第%d个数(输入0退出输入):\n",n);
n++;
if(scanf("%d",&ret) != 1)
return 1;
if(ret%2 == 0)
{
e++; //计数
esum=esum+ret; //求和
eaver=esum/e; //求平均值
}
else
{
o++; //计数
osum=osum+ret; //求和
oaver=osum/o; //求平均值
}
}while(ret != 0);
printf("偶数的个数为:%d平均值为:%.2f\n",e,eaver);
printf("奇数的个数为:%d平均值为:%.2f\n",o,oaver);
return 0;
}
演示
老师的代码
#include <stdio.h>
int main()
{
int num,ct_odd = 0,ct_even = 0;
float sum_odd = 0,sum_even = 0;
while(1)
{
if(scanf("%d",&num) != 1)
return 1;
if(num == 0)
break;
if(num % 2 == 1)
{
ct_odd = ct_odd + 1;
sum_odd = sum_odd + num;
}
if(num % 2 == 0)
{
ct_even = ct_even + 1;
sum_even = sum_even + num;
}
}
printf("ODD:%d\tAVE:%f\n",ct_odd,sum_odd/ct_odd);
printf("EVEN:%d\tAVE:%f\n",ct_even,sum_even/ct_even);
}
演示
练习二
投资问题:D1以10%的单利息投资了100美元(也就是说,每年投资赢的利息等于原始投资的10%)。D2则以每年5%的复合利息投资了100美元(也就是说,利息是当前结余的5%,其中包括以前的利息)。编写一个程序,计算需要多少年D2的投资额才会超过D1,并且显示出到那时两个人的投资额
我的代码
#include <stdio.h>
int main()
{
float D1 = 100;
float D2 = 100;
int year=0;
while(D1>=D2)
{
D1 = D1+10;
D2 = D2*0.05+D2;
year++;
}
printf("需要%d年D2的投资额才会超过D1\n",year);
printf("D1投资额:%.2f\n",D1);
printf("D2投资额:%.2f\n",D2);
return 0;
}
演示
老师的代码
#include <stdio.h>
#define BASE 100
#define SIMP 0.1
#define COMP 0.05
int main()
{
float d1 = BASE , d2 = BASE;
int year = 0;
while(d1 >= d2)
{
d1 = d1 + BASE*SIMP;
d2 = d2 + d2 * COMP;
year = year + 1;
}
printf("year = %d\n",year);
printf("d1 = %f\nd2 = %f\n",d1,d2);
return 0;
}
演示
练习三
从终端输入10个整数,以0作为结束,求其中正数的个数及平均值
#include <stdio.h>
int main()
{
int num;
int count = 1;
int ct_num = 0;
int ct_sum = 0;
int n = 1;
do
{
printf("请输第%d个数:\n",count);
count++;
if(scanf("%d",&num) != 1)
return 1;
if(num > 0)
{
ct_num++;
ct_sum = ct_sum + num;
}
while(count > 10)
{
printf("请输入0以结束\n");
if(scanf("%d",&num) != 1)
return 1;
if(num == 0)
{
break;
}
}
}while(num != 0);
printf("正数的个数为:%d\tAVE:%d\n",ct_num,ct_sum/ct_num);
return 0;
}
演示
练习四
从终端输入一个正整数,求该数是否为质数(素数:能整除这个数的因子除了1,只有它本身,比如2 3 5 7 11 13 17 19.……)
#include <stdio.h>
int main()
{
int num;
int i,n;
printf("请输一个数:\t");
if(scanf("%d",&num) != 1)
return 1;
if(num > 0)
{
for(i=2;i<num;i++)
{
if(num % i == 0) //判断是否能被除自己本身以外的数整除
{
printf("不是质数\n");
n = 1; //如果能被除自己外的数整除,就不是质数返回n=1;
break;
}
}
if(n != 1) //当满足 n!=1 (是质数)时
{
printf("是质数\n");
}
}
return 0;
}
演示