Linux学习笔记 day4

小建议:

重构代码,随着知识面的完善,逐渐完善自己从前的代码,提升自己。

编译过程

预处理 编译 汇编 链接

正常程序员编程时:

在编程时要考虑异常情况,会加上异常处理函数

gcc

选项含义后缀转换过程
-Egcc预处理c文件helloworld.c -> helloworld.i
-Sgcc编译c文件helloworld.i -> helloworld.s
-cgcc编译汇编helloworld.s -> helloworld.o
-lgcc链接可重定位文件\
-Wallall 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;
}

演示

在这里插入图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值