初步认识C语言

一、什么是程序

  • 程序(program)是一个精确说明如何进行计算的指令(instruction)序列。

  • 人和计算机交换信息所用的语言,称为计算机语言。

    程序 = 算法 + 数据结构

#include<stdio.h>

int main( )
{
    char p[] = "Hello world!";
    printf("%s\n",p);
  
    return 0;
}

1.自然语言和形式语言

  • 什么是自然语言?

  • 什么是形式语言?

两者区别和联系:

​         歧义性

​         冗余性

        与字面意思的一致性

2.软件的形成

  • 软件的形成

    • 程序员(programmer)编写程序源代码(Source Code)

    • 编译器(Compiler)把源代码转化为可被计算机理解的机器代码(Machine Code)

    • 并把计算机代码以可以执行文件(Executable File)的形式保存在磁盘上

      程序 = 文档 = 软件

1)求1~100的和
#include<stdio.h>

int main( )
{
    int total = 0;
    int i;
    
    for(i = 1; i <= 100; i++)
    {
        total = total + 1;
    }
    
    printf("%d\n",total);
    return 0;
}
2)加法计算
#include<stdio.h>
int main( )
{
    int a = 3;
    int b = 5;
    
    a = a + b;
    
    printf("%d %d\n", a, b,);
    
    return 0;
}

3.指令的分类

  • 输入:从键盘、文件或者其他设备获取数据。

  • 输出:把数据显示到屏幕,或者存入一个文件,或者发送到其他设备。

  • 基本运算:执行最基本的数学运算(加减乘除)和数据存取。

  • 测试和分支:测试某个条件,然后根据不同的测试结果执行不同的后续指令。

  • 循环:重复执行一系列操作。

scanf("%d %d", &a, &b);

printf("%d %d\n", a, b);
1)交换函数
  • 加一个媒介temp

#include<stdio.h>

int main( )
{
    int a = 3;
    int b = 5;
    int temp;
    
    printf("%d %d\n", a, b);
    
    temp = a;
    a = b;
    b = temp;
    
    printf("%d %d\n", a, b);
    
    return 0;
}
  • 加法交换

#include<stddio.h>

int main()
{
    int a = 3;
    int b = 5;
    
    printf("%d %d\n", a, b);
    
    a = a + b;
    b = a - b;
    a = a - b;
    
    printf("%d %d\n", a, b);
    
    return 0;
}
2)两数比较大小
  • if语句

#include<stdio.h>

int main( )
{
    int a = 3;
    int b = 5;
    
    printf("%d %d\n", a,b);
    
    if(a > b)
        printf("a 比 b 大\n");
    else if(a == b)
        printf("a 等于 b \n");
    else
        printf("a 比 b 小\n");
    
    return 0;
}

4.计算机基本工作过程

  • 编程的本质是把复杂的任务分解成子任务,把子任务在分解成跟简单的任务,层层分解,直到最后简单得可以用以上所述指令来完成。

练习目录

1. 123 各位之和
2. 请通过程序统计 1~100 中数字 9 的个数
3. 编程求 100 以内的素数,并打印
4. 计算 π 的值:
根据下面的公式计算 π 的值
请打印出一个表格来显示:用公式中的 1 项、 2 项、 3 计算出来的 π 的近似值。
5. 求完数
一个数如果恰好等于它的因子之和 , 这个数被称为 完数 ”, 例如 :6=1+2+3. 请编程找出 1000 以内的完数
6. 打印所有的水仙花数
水仙花数是指一个 3 位数 ,它的每个位上的数字的 3 次幂之和等于它本身(例如:
7. 神秘的三位数。
有这样一个 3 位数,组成它的 3 个数字阶乘之和正好等于它本身。即: abc = a! + b! +c!
找出所有的这样的三位数
 1)求一个三位数各位数和
  • 分别取余后求和

#include<stdio.h>
#include<stdlib.h>

int main()
{
    int a = 123;
    int total;
    
    total = a % 10 + a / 10 % 10 + a /100 % 10;
    
    printf("%d\n", total);
    
    return 0;
}
  • 循环 迭代

#include<stdio.h>
#include<stdlib.h>

int main()
{
    int a = 12345;
    int total = 0;

    while(a > 0)
    {
        total = total + a % 10;
        a = a / 10;
    }
    
    printf("%d\n", total);
    
    return 0;
}
#include<stdio.h>

int my_atoi(char *str)
{
    int total = 0;
    int i = 0;
    
    //迭代
    while(str[i] !='\0')
    {
        total = total * 10 + (str[i] - '0');
        i++;
    }
    
    return total;
}

int main()
{
    char str[5] = "123";
    int total = 0;
    //total = (str[0] - '0') * 100 + (str [1] - '0') * 10 + (str[2] - '0') * 1;
    total = my_atoi(str);
    printf("%d\n",total);
    
    return 0;
}
1)求1~100的和
#include<stdio.h>

int main( )
{
    int total = 0;
    int i;
    
    for(i = 1; i <= 100; i++)
    {
        total = total + 1;
    }
    
    printf("%d\n",total);
    return 0;
}
2)统计1~100中数字9的个数
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int count_one(int n)  
{
    int total = 0;
    
    while(n > 0)
    {
       if (n % 10 == 9)
       {
           total++;   //++total;
       }
        n = n / 10;
    }
    
    return total;
}

int count_9(int start,int end)
{
    int i; 
    int total = 0;
    
    for(i = start; i <= end; i++)
    {
        total += count_one(i);
    }
    
    return total;
}

int main()
{	
   int a =12345;
   int total = count_9(1, 100);
    
   printf("%d\n",total);
    
   return 0;
}
3)求100以内的素数
#include<stdio.h>

int is_prime(int n)
{
    int i;
    if(n < 2)
    {
        return 0;
    }
    
    for(i = 2; i < n; i++;)
    {
        if (n % i == 0)
        {
            return 0;;
        }
    }
    
    return 1;
}

int main()
{
    int i;
    for(i = 1; i <= 100; i++)
    {
        if(is_prime(i) == 1)
        {
            printf("%d",i);
        }
    }
    printf("\n");
    
    return 0;
}
3)优化
#include<stdio.h>

int is_prime(int n)
{
    int i;
    
    if(n < 2)
    {
        return 0;
    }
    
    for(i = 2; i < n; i++;)
    {
        if (n % i == 0)
        {
            return 0;
        }
    }
    
    return 1;
}

int main()
{
    int i;
    for(i = 1; i <= 100; i++)
    {
        if(is_prime(i) == 1)
        {
            printf("%d",i);
        }
    }
    printf("\n");
    
    teturn 0;
}
4)计算π的值

π=4 - 4/3 + 4/5 - 4/7 + 4/9 - 4/11 + ...

#include<stdio.h>

double get_pi(int n)
{
    double total = 0.0;
    int flag = 1;
    int i;
    
    for (i = 0; i <= n; i++)
    {
        total += 1.0/(2 * i + 1) * flag;
        flag = -flag;
    }
    return total * 4;
}
int main ()
{
    int i;
    printf("%.15f\n",get_pi(100));
    printf("%.15f\n",get_pi(10000));
    printf("%.15f\n",get_pi(1000000));
    printf("%.15f\n",get_pi(100000000));
    
    return 0;
}
5)求1000以内的完数
#include<stdio.h>

//打印因子
void print_factor(int n)
{
    int i;
    for(i = 1; i < n; i++)
    {
        if(n % i == 0)
        {
            printf("%d", i);
        }
    }
    
    printf("\n");
}

int is_perfect_number(int n)
{
    int i;
    int total = 0;
    
    for(i = 1; i < n; i++)
    {
        if(n % i == 0)
        {
            total += i;
        }
    }
    
    if(total == n)
    {
        return 1;
    }else
    {
        return 0;
    }
}

int main()
{
    int i;
    printf("\n");
    for(i = 1; i <= 1000; i++)
    {
        if(is_perfect_number(i) == 1)
        {
            printf("%d", i);
            print_factor(i);
        }
    }
    printf("\n");
    
    return 0;
}
6)求水仙花数
#include<stdio.h>
#include<stdlib.h>

int is_narcissistic_flower(int n)
{
    int total = 0;
    int low;
    // n的值变了所以加一个
    int n_o = n;
    
    while(n > 0)
    {
        low = n % 10;
        total += low * low * low;
        n = n / 10;
    }
    
    if(n_o == total)
    {
        return 1;
    }else
    {
        return 0;
    }
}

int main()
{
    int i;
    
    for(i = 100; i < 1000; i++)
    {
        if(is_narcissistic_flower(i) == 1)
        {
            printf("%d\n", i);
        }
    }

    retun 0;
}
7)神秘的三位数
#include<stdio.h>
#include<stdlib.h>
    
int is_mytrious(int n)
{
    int total = 0;
    int n_o = n;
    
    while(n > 0)
    {
        total += factorial(n % 10);
        n /= 10;
    }
    
    if(total == n_o)
    {
        return 1;
    }else
    {
        return 0;
    }  
}
    
int main()
{
    int i;
    for(i = 100;i < 1000;i++)
    {
        if (is_mytrious(i) == 1)
        {
            printf("%d\n",i);
        }
    }
    
    return 0;
    
}

5.程序调试

  • 错误:

    • 编译时错误;

    • 运行时错误;1.野指针 2.内存越界 3.内存泄漏

    • 逻辑错误和语义错误;

  • 警告

警告意味着风险!

重视警告!

把每一条警告都理解,并总结出来。

问题 <?>

1.程序为什么编译后才能运行?

2.编译出来的可执行文件里面有什么?除了机器码还有什么?他们是怎么组织的?

3.#include<stdio.h>是什么意思?把stdio.h包含进来意味着什么?C语言库又是什么?如何实现的?

4.helloWorld程序是怎么运行起来的?操作系统是怎么装载它的?main函数之间发生了什么?main函数结束后又发生了什么?

5.如果没有操作系统,helloworld可以运行吗?

6.Helloworld程序运行时,它在内存中是什么样子的?

注:C语言的优缺点

优点:

  • 程序执行效率高

  • 能直接对硬件进行操作

  • 语言简练,灵活,使用方便

  • 可移植性较好

缺点:

  • 不易学习

  • 代码不容易维护

  • 过于强大灵活,以至于容易产生致命Bug

注:C语言特点

  • C语言是一个有结构化程序设计,具有变量作用域以及递归功能的过程式语言

  • 传递参数是以值传递(Pass-by-value),也可以通过指针来传递参数(Pass-by-address)。

  • 不同的变量类型可以用结构体(struct)组合在一起。

  • 只有32个保留字(reserved keywords),使变量、函数命名有更多弹性。

  • 部份的变量类型可以转换,例如整形和字符变量。

  • 通过指针(pointer),C语言可以容易的对存储器进行低级控制。

  • 编译预处理(preprocessor)让C语言的编译更具有弹性。

6.程序的结构

  • C程序总是从main函数开始执行,并且一定有且仅有一个主函数,主函数名必须是main。

  • C语言本身不带输入输出语句,必须通过调用库函数来实现输入输出。

  • 以/ ...... /之间的内容是注释,不影响程序的执行,可增加程序的可读性。

  • /* /* */ */

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值