Linux下的C编程入门

@icorvoh

大纲

  • C语言简介
  • 一些适用的C开发工具
  • Linux操作系统简介
  • 虚拟机与镜像
  • Linux基础命令
  • 逻辑算法题
  • Linux下C的编程

C语言简介

C语言的定义

        C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。由于C标准的存在,使得几乎同样的C代码可用于多种操作系统,也适用于多种机型。

C语言的发展

        C语言是1972年由美国贝尔实验室(AT&TBell)的D.M.Ritchie研制成功的。它不是为了初学者设计的,而是为计算机专业人员设计的。最初它是作为写UNIX操作系统的一种工具,在贝尔实验室内部使用。后来C语言不断改进,人们发现它功能丰富、表达能力强、使用灵活方便、应用面广、目标程序效率高、可移植性好,既具有高级语言的优点,又具有低级语言的许多优点,特别适合于写系统软件,因此C语言从实验室走向美国,从美国走向世界。到20世纪70年代,它已风靡全世界。无论是在中国还是在外国,C语言都成为了计算机开发人员的基本功。

一个简单的C程序

#include <stdio.h>

int main(void){
    int a,b,c;
    printf("Please enter two numbers for their quotient:\n");
    scanf("%d%d",&a,&b);
    c = a / b;
    printf("%d\n",c);
    return 0;
}

一个简单的C程序

预包含一个头文件 stdio.h

给函数一个返回值:0

声明一个main函数

换行符

源码解析

#include <stdio.h>

int main(void){
    int a,b,c;
    printf("Please enter two numbers for their quotient:\n");
    scanf("%d%d",&a,&b);
    c = a / b;
    printf("%d\n",c);
    return 0;
}

打印一段话

获取输入的值

#include

        #include文件的目的就是把多个编译单元(也就是c或者cpp文件)公用的内容,单独放在一个文件里减少整体代码尺寸;或者提供跨工程公共代码。

        stdio 就是指 “standard input & output"(标准输入输出)所以,源代码中如用到标准输入输出函数时,就要包含这个头文件!例如c语言中的 printf("%d",i); scanf("%d",&i);等函数。

printf()

​        printf()函数是式样化输出函数, 一般用于向准则输出设备按规定式样输出消息。正在编写步骤时经常会用到此函数。printf()函数的挪用式样为: printf("<式样化字符串>",<参量表>);

        其中式样化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出;另一部分是式样化规定字符, 以"%"开端, 后跟一个或几个规定字符, 用来确定输出内容式样。 参量表是需求输出的一系列参数, 其个数务必与式样化字符串所阐明的输出参数个数一样多, 各参数之间用","分开, 且顺序逐一对应, 不然将会出现意想不到的过失。

scanf()

​        与printf函数一样,都被定义在头文件stdio.h里,因此在使用scanf函数时要加上#include <stdio.h>。它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。

        其调用形式为: scanf("<格式说明字符串>",<变量地址>);变量地址要求有效,并且与格式说明的次序一致。&a,&b,&c中的&是地址运算符,&a指a在内存中的地址。scanf的作用是:按照a,b,c的内存地址将输入的数据存到a,b,c中去。变量a,b,c的地址是在编译连续阶段分配的(存储顺序由编译器决定)。

数据类型与格式说明符

        short、int、long、char、float、double 这六个关键字代表C 语言里的六种基本数据类型。

        格式说明由“%”和格式字符组成,如%d%f等。它的作用是将输出的数据转换为指定的格式输出。格式说明总是由“%”字符开始的。不同类型的数据用不同的格式字符。格式字符有d,o,x,u,c,s,f,e,g等。

%d整型输出,%ld长整型输出,

%o以八进制数形式输出整数,

%x以十六进制数形式输出整数,

%u以十进制数输出unsigned型数据(无符号数)。

%c用来输出一个字符,

%s用来输出一个字符串,

%f用来输出实数,以小数形式输出,

%e以指数形式输出实数,

%g根据大小自动选f格式或e格式,且不输出无意义的零。

return

​        在main()函数中return 0表示程序正常结束,这是返回给控制台,交由操作系统识别的,与程序本身并无关系。这是C标准对编译器的一项建议,不是必须的,但某些编译器会强制要求函数有返回值。

一些适用的C开发工具

Microsoft Visual C++ 6.0

        Microsoft Visual C++ 6.0,简称VC6.0,是微软推出的一款C++编译器,将“高级语言”翻译为“机器语言(低级语言)”的程序。Visual C++是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进行软件开发的首选工具。Visual C++6.0不仅是一个C++ 编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrated development environment,IDE)。Visual C++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。 这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境。

Microsoft Visual C++ 6.0

Dev-C++

        Dev-C++是一个Windows环境下C/C++的集成开发环境(IDE),它是一款自由软件,遵守GPL许可协议分发源代码。它集合了MinGW等众多自由软件,并且可以取得最新版本的各种工具支持,而这一切工作都是来自全球的狂热者所做的工作。Dev-C++是NOI、NOIP等比赛的指定工具,缺点是Debug功能弱。由于原开发公司在开发完4.9.9.2后停止开发,所以现在正由其它公司更新开发,但都基于4.9.9.2.Dev-C++ 最新版本:5.11。

Dev-C++

Eclipse

        Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

        尽管 Eclipse 是使用Java语言开发的,但它的用途并不限于 Java 语言;例如,支持诸如C/C++、PYTHON、COBOL、PHP、Android等编程语言的插件已经可用,或预计将会推出。Eclipse 框架还可用来作为与软件开发无关的其他应用程序类型的基础,比如内容管理系统。

Eclipse

Code::Blocks

        Code::Blocks 是一个开放源码的全功能的跨平台C/C++集成开发环境。 Code::Blocks是开放源码软件。Code::Blocks由纯粹的C++语言开发完成,它使用了著名的图形界面库wxWidgets(2.6.2 unicode)版。对于追求完美的C++程序员,再也不必忍受Eclipse的缓慢,再也不必忍受VS.NET的庞大和高昂的价格。

Code::Blocks

P.S 注意事项

  • 请在官网下载工具
  • 先新建项目工作区
  • 选好项目位置
  • 项目下新建.c文件
  • 流程:编辑-编译-运行

Linux简介

Linux

        Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

  • 基本思想:一切皆文件,每个软件都有确定的用途。
  • 完全免费
  • 完全兼容POSIX1.0标准
  • 多用户、多任务
  • 良好的界面
  • 支持多种平台

流行的Linux发行版

        发行版为许多不同的目的而制作, 包括对不同计算机结构的支持, 对一个具体区域或语言的本地化,实时应用,和嵌入式系统,甚至许多版本故意地只加入免费软件。一个典型的Linux发行版包括:Linux内核,一些GNU程序库和工具,命令行shell,图形界面的X Window系统和相应的桌面环境,如KDE或GNOME,并包含数千种从办公套件,编译器,文本编辑器到科学工具的应用软件。

  • Ubuntu

  • Red Hat

  • centos

  • 红旗Linux​

Linux目录树

​Linux目录树

  • bin:该目录存放最常用的基本命令。
  • boot:该目录包含了系统启动需要的配置文件、内核(vmliuxz)和系统镜像 (initrd.img)等。
  • dev:该目录下存放的是Linux中使用或未使用的外部设备文件(fd代表软盘,hd代表硬盘等),使用这些设备文件可以用操作文件的方式来操作设备。
  • etc:该目录下包含了所有系统服务和系统管理使用的配置文件。
  • home:该目录下包含了除系统管理员外的所有用户的主目录,用户主目录一般以用户登陆帐号命名。
  • lib:该目录下包含了系统使用的动态连接库(*.so)和内核模块(在modules下)。
  • lost+found:该目录包含了磁盘扫描检测到的文件碎片。

​Linux目录树

  • mnt:该目录下包含用户动态挂载的文件系统。    
  • proc :该目录属于内存映射的一个虚拟目录,其中包含了许多系统现场数据。
  • sbin:该目录下包含系统管理员使用的系统管理命令。
  • tmp:该目录下包含一些临时文件。
  • usr:该目录下一般来说包含系统发布时自带的程序(但具体放什么东西,并没有明确的要求)。其中最值得说明的有三个子目录。
  • /usr/src :Linux内核源代码就存在这个目录。
  • /usr/man :Linux中命令的帮助文件。
  • /usr/local :新安装的应用软件一般默认在该目录下。
  • var:该目录中存放着在不断扩充着的信息。

绝对路径

      在Linux中,绝对路径是从/(也被称为根目录)开始的,比如/usr、/etc/X11。如果一个路径是从/开始的,它一定是绝对路径,这样就好理解了;

相对路径

        以 . 或 .. 开始的,.表示用户当前操作所处的位置,而.. 表示上级目录;在路径中,.表示用户当前所处的目录,而..上级目录,要把.和..当做目录来看。

Linux文件属性

Linux文件属性

drwxr-xr-x.  6 root       root            4096 Oct 15 03:06 xycontact

文件权限

连接数

文件所有者

文件所属用户组

文件大小

文件名

文件最后被修改的时间

虚拟机与镜像

镜像

        镜像是一种文件存储形式,可以把许多文件做成一个镜像文件,与GHOST等程序放在一个盘里用GHOST等软件打开后,又恢复成许多文件,RAID 1和RAID 10使用的就是镜像。常见的镜像文件格式有ISO、BIN、IMG、TAO、DAO、CIF、FCD。

        所谓镜像文件其实和ZIP压缩包类似,它将特定的一系列文件按照一定的格式制作成单一的文件,以方便用户下载和使用,例如一个测试版的操作系统、游戏等。镜像文件不仅具有ZIP压缩包的“合成”功能,它最重要的特点是可以被特定的软件识别并可直接刻录到光盘上。其实通常意义上的镜像文件可以再扩展一下,在镜像文件中可以包含更多的信息。比如说系统文件、引导文件、分区表信息等,这样镜像文件就可以包含一个分区甚至是一块硬盘的所有信息。

虚拟机

        虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。

        进入虚拟系统后,所有操作都是在这个全新的独立的虚拟系统里面进行,可以独立安装运行软件,保存数据,拥有自己的独立桌面,不会对真正的系统产生任何影响 ,而且具有能够在现有系统与虚拟镜像之间灵活切换的一类操作系统。

VMware Workstation

        VMware Workstation是一款功能强大的桌面虚拟计算机软件,提供用户可在单一的桌面上同时运行不同的操作系统,和进行开发、测试 、部署新的应用程序的最佳解决方案。VMware Workstation可在一部实体机器上模拟完整的网络环境,以及可便于携带的虚拟机器,其更好的灵活性与先进的技术胜过了市面上其他的虚拟计算机软件。对于企业的 IT开发人员和系统管理员而言, VMware在虚拟网路,实时快照,拖曳共享文件夹,支持 PXE 等方面的特点使它成为必不可少的工具。

VMWare Workstation

Linux基础命令

Linux基础命令

        Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作、文件存取、目录操作、进程管理、文件权限设定等。所以,在Linux系统上工作离不开使用系统提

供的命令。要想真正理解Linux系统,就必须从Linux命令学起,通过基础的命令学习可以进一步理解Linux系统。

Linux基础命令

  • 安装和登录命令:loginshutdown、halt、reboot、install、mount、umount、chsh、exit、last;
  • 文件处理命令:file、mkdir、grep、dd、find、mvls、diff、cat、ln;
  • 系统管理相关命令:df、top、free、quota、at、lp、adduser、groupadd、kill、crontab;
  • 网络操作命令:ifconfig、ip、ping、netstat、telnet、ftp、route、rlogin、rcp、finger、mail、 nslookup;
  • 系统安全相关命令:passwd、su、umask、chgrp、chmodchown、chattr、sudo ps、who
  • 其它命令:tar、unzip、gunzip、unarj、mtools、man、unendcode、uudecode、vim

Vim

        Vim是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用,和Emacs并列成为类Unix系统用户最喜欢的文本编辑器。VIM是纯粹的自由软件。

  • 高效率移动
  • 高效的输入
  • 高效读代码

Vim编辑器入门

  • vim filename    打开vim并创建名为filename的文件
  • vim file1 file2 file3 ...    同时打开多个文件
  • :open file    在vim窗口中打开一个新文件
  • i 在当前位置生前插入
  • u 撤销(Undo)
  • yy    拷贝当前行
  • shift+p    在当前行前粘贴
  • ndd    剪切当前行之后的n行。利用p命令可以对剪切的内容进行粘贴
  • ddp    交换当前行和其下一行
  • ZZ    保存并退出
  • :wq!    保存并退出
  • :q!    强制退出并忽略所有更改

Linux下的C编程

逻辑算法题

算法结构

基础算法题

1.交换两个整数的值

交换两个整数的值

#include <stdio.h>

int main(void){
    int a,b,t;
    printf("a b:\n");
    scanf("%d%d",&a,&b);
    t = a + b;
    a = t - a;
    b = t - b;
    printf("a b:\n%d %d\n",a,b);
    return 0;
}
#include <stdio.h>

int main(void){
    int a,b;
    printf("a b:\n");
    scanf("%d%d",&a,&b);
    a = a + b;
    b = a - b;
    a = a - b;
    printf("a b:\n%d %d\n",a,b);
    return 0;
}

基础算法题

2.根据圆半径求其面积

根据圆半径求其面积

#include <stdio.h>
#include <math.h>
#define PI 3.14

int main(void){
    float r,s;
    printf("r:\n");
    scanf("%f",&r);
    s = pow(r,2) * PI;
    printf("s:\n%f\n",s);
    return 0;
}

基础算法题

3.根据三角形两边及其夹角算面积

根据三角形两边及其夹角算面积

#include <stdio.h>
#include <math.h>
#define PI 3.14

int main(void){
    float a,b,angle,s;
    printf("a b angle:\n");
    scanf("%f%f%f",&a,&b,&angle);
    s = 0.5 * a * b * sin(angle/180*PI);
    printf("Area:%f\n",s);
    return 0;
}

基础算法题

4.判断是否为直角三角形

判断是否为直角三角形

#include <stdio.h>

int main(void){
    double a,b,c;
    printf("a b c:\n");
    scanf("%lf%lf%lf",&a,&b,&c);
    if (a*a + b*b == c*c || a*a + c*c 
	== b*b || b*b + c*c == a*a)
    {
        printf("yes\n");
    }
    else
    {
	printf("not\n");
    }
    return 0;
}

基础算法题

5.查询一个月天数

查询一个月天数

#include <stdio.h>

int main(void){
    int a;
    printf("Which month:\n");
    scanf("%d",&a);
    switch (a)
    {
	case 1:case 3:case 5:case 7:case 8:case 10:case 12:
            printf("31\n");break;
	case 4:case 6:case 9:case 11:
	    printf("30\n");break;
	case 2:
	    printf("28 or 29\n");break;
    }
    return 0;
}

基础算法题

6​.求一个数的阶乘

求一个数的阶乘

#include <stdio.h>

int main(void){
    int n,i,p=1;
    printf("n:\n");
    scanf("%d",&n);
    for (i=1;i<=n;i++)
    {
        p*=i;
    }
    printf("%d\n",p);
    return 0;
}

基础算法题

7.一个四则运算器

一个四则运算器

#include <stdio.h>

int main(void){
    double a,b,v;
    char what;
    printf("a what b:\n");
    scanf("%lf%s%lf",&a,&what,&b);
    switch(what)
    {
	case '+':v = a + b;break;
	case '-':v = a - b;break;
	case '*':v = a * b;break;
	case '/':v = a / b;break;
    }
    printf("Equals:%lf\n",v);
    return 0;
}

基础算法题

8.输出一个数的位数并逆序排出

输出一个数的位数并逆序排出

#include <stdio.h>

int main(void)
{
    long n;
    int b;
    printf("input a number:\n");
    scanf("%ld",&n);
    for (b=0;n;b++)
    {
        printf("%ld",n%10);
        n/=10;
    }
    printf("\n");
    printf("%dbit\n",b);
    return 0;
}

基础算法题

9.打印金字塔型X

打印金字塔型X

#include <stdio.h>

int main(void)
{
    int n,i,o;
    printf("input number:\n");
    scanf("%d",&n);
    for (i=1;i<=n;i++)
    {
        for (o=0;o!=i;o++)
        {
            printf("x");
        }
        printf("\n");
    }
    return 0;
}

Q&A

Linux下的C编程入门

By hylerrix

Linux下的C编程入门

从C语言到Linux逐步解析,最终便可在Linux下进行高效的C语言开发学习~

  • 894