[关闭]
@Sakura-W 2015-12-06T11:48:44.000000Z 字数 7182 阅读 1786

C语言基础

程序设计语言


一、简单的计算

1.第一个程序

(1)输出"Hello World"

#include <stdio.h>
int main()
{
    printf("Hello World!\n")
}

(2)做简单的计算

#include <stdio.h>
int main()
{
    printf("%d,12+13");
}

2.变量

变量定义的一半模式:<变量类型> <变量名称>;
变量赋值与初始化
C语言是一种有类型的语言,定义变量时必须声明变量的类型,而且不可更改

#include <stdio.h>
int main()
{
    int price = 0;
    printf("请输入金额:");
    scanf("%d",&price);
    int change = 100 - price;
    printf("%d",change);
    return 0;
}

定义一个常量:

const int AMOUNT = 100;

输入多个变量:

scanf("%d %d",&price,&amout);

3.计算

(1)浮点数:带小数点的数,小数点可变动
(2)double:双精度型浮点数,输入的时候用"%lf"而不用"%d"。输出的时候用"%f"
(3)float:单精度型浮点数

二、判断

1.if...else

if(a > b){
        if(a > c){
            printf("三个数中最大的是%d",a);
        }else{
            printf("三个数中最大的是%d",c);
        }
    }else{
        if(b > c){
            printf("三个数中最大的是%d",b);
        }else{
            printf("三个数中最大的是%d",c);
        }
    }

2.switch...case(多路分支)

    int a;
    scanf("%d",&a);
    switch(a){
        case 1:
            printf("你好\n");
            break;
        case 2:
            printf("早上好\n");
            break;
        case 3:
            printf("晚上好\n");
        default:
            printf("再见\n");
    }

三、循环语句

1.用while语句判断数的位数

    int main(){
        int input;
        int n = 0;
        scanf("%d",&input);

        input /= 10;
        n++;
        while(input > 0){
            n++;
            input /= 10;
        }
        printf("这是个%d位数",n);
    }

2.复合赋值

a += 1;a -= 1;a *= 1;a /= 1;
a++;a--;++a;--a;

3.do...while..

do{
    <循环体>
}while(<判断条件>);

先做一起循环体,然后再进行判断

4.计算平均数

    int main(){
        int number;
        int sum = 0;
        int n = 0;

        scanf("%d",&number);

        while(number != -1){
            sum += number;
            n ++;
            scanf("%d",&number);
        }
        printf("%f",1.0*sum/n);
        return 0;
    }

5.猜数游戏

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

int main(){

    srand(time(0));
    int a = rand()%100;
    int number;
    int count;

    printf("我已经想好了一个数,来猜吧\n");

    do{
        scanf("%d",&number);
        count ++;
        if( number < a){
            printf("猜小了\n");
        }else if( number > a){
            printf("猜大了\n");
        }       
    }while(number != a);

    printf("你只用了%d次就猜中了\n",count);
    return 0;
}

6.判断输入的数字中奇数和偶数的个数

int number,k;
    int odd = 0;
    int even = 0;

    scanf("%d",&number);

    while(number != -1){    
        k = number % 2;//判断奇数和偶数 
        if( k == 1){//一定不能写成k = 1!! 
            odd ++;
        }else{
            even++;
        }
        scanf("%d",&number);
    }

    printf("这串数字中奇数的个数是%d,偶数的个数是%d",odd,even);
    return 0;

7.数字特征值

#include <stdio.h>
#include<math.h>

int main(){
    int number,digit;
    int ret = 0;
    int wei = 1;

    scanf("%d",&number);

    do{
        digit = number % 10;
        if((digit + wei) % 2 == 0){//判断是否通奇同偶 
            ret = ret + pow(2, wei-1); 
        }
        number /= 10;
        wei ++;
    }while(digit > 0);

    printf("%d",ret);
    return 0;
}

四、循环控制

1.逻辑运算符

逻辑非:,逻辑与:&&,逻辑或:||的优先级远远大于&&||

2.判断素数

int main(){

    int i,n;
    int pre = 1;

    scanf("%d",&i);
    for(n = 2; n < i; n++){
        if(i % n == 0){
            pre = 0;
        }
        break;
    }
    if(pre == 1){
        printf("%d是素数",i);
    }else{
        printf("%d不是素数",i);
    }
    return 0;
}

3.多重循环输出素数

int main(){

    int n;
    int count = 0;
    int x = 2;

    while(count < 50){ 
        int pre = 1;
        for(n = 2; n < x; n++){
            if(x % n == 0){
                pre = 0;
                break;
            }   
        }
        if(pre == 1){
            printf("%d\n",x);
            count++;
        } 
        x++;
    }
    return 0;
}

4.跳出多重循环

(1)goto 方法

int main(){
    int one,two,five;
    int x = 2;
    for(one = 1; one < x*10; one++){
        for(two = 1; two < x*5; two++){
            for(five = 1; five < x*4; five++){
                if(one*1 + two*2 + five*5 == x*10){
                    printf("%d个一角,%d个两角,%d个五角能组成两元\n",one,two,five);
                    goto out;
                }
            }
        }
    }
    out:
        return 0;
}

(2)接力break方法

int main(){
    int one,two,five;
    int exit = 0;
    int x = 2;
    for(one = 1; one < x*10; one++){
        for(two = 1; two < x*5; two++){
            for(five = 1; five < x*4; five++){
                if(one*1 + two*2 + five*5 == x*10){
                    printf("%d个一角,%d个两角,%d个五角能组成两元\n",one,two,five);
                    exit = 1;
                    break;
                }
            }
            if(exit) break;
        }
        if(exit) break;
    }
}

5.求和

int main(){

    int n,i;
    double sum = 0.0;
    double sign = 1.0;

    scanf("%d",&n);

    for (i = 1; i < n; i++){
        sum += sign/i;
        sign = -sign;
    }
    printf("f(%d)=%f\n",n,sum);

}

6.最大公约数

(1)枚举法

int main(){
    int a,b,i,ret;
    scanf("%d %d",&a,&b);
    for (i = 1;i < a && i < b;i++){
        if(a % i == 0 && b % i == 0){
            ret = i;
        }
    }
    printf("%d和%d的最大公约数是%d",a,b,ret);
    return 0;
}

(2)辗转相除法

int a,b,t;
    scanf("%d %d",&a,&b);
    while (b != 0){
        t = a % b;
        a = b;
        b = t;
    }
    printf("%d",a);
    return 0;

7. 0到200之间第m个素数和第n个素数之和

int main(){
    int x,i,isPre,m,n;
    int ret = 0;
    int count = 0;

    scanf("%d %d",&m,&n);

    for(x = 2; x < 200; x++){//这个循环判断素数 
        isPre = 1;  
        for(i = 2; i < x; i++){         
            if(x % i ==0){
                isPre = 0;
                break;
            }
        }
        if(isPre == 1){//这个条件用于素数相加 
            count++;
            if(count >= m && count <= n){
                ret = ret + x;
            }
        }   
    }
    printf("0到200之间第%d个素数到第%d个素数之和为%d",m,n,ret);

    return 0;
}

8.念整数

int main(){

    int x,i,t;
    int count = 0;
    int mask = 1;

    scanf("%d",&x);
    if (x < 0){//处理x为负数的情况 
        printf("fu ");
        x = -x;
    }
        t = x;  
        while(t > 9){//确定输入数x的位数,确定mask的值 
            t /= 10;
            mask *= 10;
        }

        do{
            i = x / mask;
            x %= mask;
            mask /= 10; 

            switch(i){
                case 0:
                    printf("ling");
                    break;
                case 1:
                    printf("yi");
                    break;
                case 2:
                    printf("er");
                    break;
                case 3:
                    printf("san");
                    break;
                case 4:
                    printf("si");
                    break;
                case 5:
                    printf("wu");
                    break;
                case 6:
                    printf("liu");
                    break;
                case 7:
                    printf("qi");
                    break;
                case 8:
                    printf("ba");
                    break;
                case 9:
                    printf("jiu");
                    break;
            }

            if(mask > 0){
                printf(" ");
            }
        }while( mask > 0);


        return 0;
}

程序需要一步一步写,一个功能一个功能去实现,这个小程序的思路是:先写整数数字正序输出(先确定x的位数,然后利用一个位数变化的mask来整除x,从左到友得到x的每一位上的数字),然后写念每一个数字的代码(用switch来一一对应),然后加上x为负数的情况。

五、函数

1.函数基本定义:

(1)定义:函数是一段代码,接受零个或多个个参数,做一件事情,返回零个或一个值。

int sum(int begin,int end)//返回整数的函数
void output()//不需返回的函数

(2)调用:函数名(依次写出参数);
(3)返回:
return:后面可以加变量(如a),可以加常量(如0),可以是一条语句(如 a+b).return表示函数的结束。函数里面可以有零个或者多个return。

函数有返回值,则必须使用带值得return,如果没有返回值则可以不用return。
void函数没有返回值,不需要return,void函数也不能进行返回赋值。
(4)函数声明:函数的头加上分号。声明里面可以不写参数的名称,但要表明参数的个数和类型 。

void sum(int begin,int end)//这一句放在main()函数前面

(5)参数传递:
不考虑形参和实参,仅仅考虑参数传值
(6)本地变量:
本地变量定义在块内(函数或者语句),程序运行进入这个块之前,其中的变量不存在,离开这个块,其中的变量就消失了。
外部定义的变量在里面仍然有效,块里面定义和外面同名的变量会掩盖外面的变量。
不能在一个块里面定义同名的变量。
本地变量不会被默认初始化,参数在进入函数的时候会经过初始化。
(7)其他细节
C语言不允许函数嵌套定义,可以在一个函数内部放其他函数的声明,但不能放函数的定义
main()其实也是一个函数,return 0;也有意义,表示main()这个函数正常运行。

2.因数分解

int su(int x);

int main(){
    int x;
    scanf("%d",&x);

    if(su(x)){
        printf("%d",x);
    }else{//获取因数并一个一个打印的代码
        int i = 2;
        printf("%d=",x);
        while(i < x){
            if(x % i == 0){
                printf("%d*",i);
                x /= i;
                i = 1;  
            }
            i++;
        }
        printf("%d",x); 
    }

    return 0;
}

int su(int x){//判断素数的函数 
    int i;
    int isPre = 1; 

    for(i = 2; i < x; i++){
        if(x % i == 0){
            isPre = 0;
        }
        break;
    }
    return isPre;
}

六、数组

1.定义

(1)数组是一种容器,其中所有的元素具有相同的数据类型;一旦创建数组,就不能改变数组的大小;数组的元素在内存中是连续排列的。
(2)有效的下标范围:编译器和运行环境都不会检查数组下标是否越界。一旦运行程序出现"segmentation fault",则很有可能是数组越界引起的。

2.数组计数

int main(){

    const int number = 10;
    int x;
    int i;
    int count[number];//定义数组

    for(i = 0; i < number; i++){//初始化数组
        count[i] = 0;
    }

    scanf("%d",&x);

    while(x != -1){
        if(x >= 0 && x <=9){//数组参与计算
            count[x]++;
        }
        scanf("%d",&x);
    }


    for(i = 0; i < number; i++){
        printf("%d:%d\n",i,count[i]);//遍历出数组
    }
}

3.数组计算

(1)数组的集成初始化

int a[] = {2,3,4,5,56,6,7,8,}

(2)集成初始化时的定位

int a[10] = {[0] = 2,[2] = 3,6,};//c99 only

适合数组中数字稀疏。
(3)数组的大小
sizeof字符串能给出整个数组所占据的内容的大小,单位是字节

sizeof(a)/sizeof(a[0])//结果是数组中单位的个数

(4)数组的赋值
数组变量本身不能被赋值,如果要把一个数组中的值赋给另一个数组,只能使用遍历
(5)遍历数组
一般使用for循环,让循环变量i从0到<数组长度,这样循环体内最大的正好是数组最大的有效下标
(6)定义函数的时候,当数组作为函数参数时,必须再使用一个参数来传入数组的大小。

4.二维数组

int a[][5]{
    {0,1,2,3,4},//表示a[0][i]
    {2,3,4,5,6},//表示a[i][i]
};

列数是必须给出的,行数可以由编译器来数.如果省略就表示补零。

(1)二维数组的初始化与输出

    int x,t,m;
    int i;
    int j;

    scanf("%d",&t);
    x = t;

    int a[t][t];

    for(i = 0; i < x; i++){//采用遍历进行赋值
        for(j = 0; j < x; j++){
            scanf("%d",&m);
            a[i][j]= m;
        }
    }

    for(i = 0; i < x; i++){//采用遍历进行输出
        for(j = 0; j < x; j++){
            printf("%d ",a[i][j]);  
        }
        printf("\n");
    } 

七、指针

1.类型大小与取地址运算

(1)sizeof:
获得变量在内存中所占的大小(以字节为单位)
(2)scanf("%d",&x)中的&运算符:
获得变量的地址,它的操作数必须是变量,地址的大小是否与int相同取决于编译器。

printf("%p\n",&i)//输出一个变量的地址

2.指针

(1)指针:
保存地址的变量。

int i;
int* p = &i//p是一个指针,指向了int i;p变量里保存了i的地址。
int *p,q;
int* p,q;//不管*号靠近int还是p,都指标是p是一个指针,q不是指针

(2)*运算符:
*运算符是一个单目运算符,用来访问指针的值所表示的地址上的变量。意味着在其他函数内部可以改变全局变量的值

int *p;
*p = 26;//通过这样一个赋值就改变了p指针所表示的地址上的变量的值。

3.指针与数组

int minmax(int a[],int len)

数组作为函数参数时,传入函数的实际上只是数组的指针,而不是数组的值。所以在函数内部用sizeof得不到数组的正确大小。
数组变量是特殊的指针。数组变量是const的指针,不能被改变

4.字符类型

char是一种整数,也是一种特殊的类型:字符。在printf和scanf里用%c来输入输出字符。

char c = '1';//用单引号表示字符字面量
char d = 1;//char也可以用来表示整数

5.逃逸字符

\b 回退一个;\n 换行;\t 到一行中的下一个固定位置;\r 回车

6字符串

(1)字符串:
以0(整数0)结尾的一串字符。
0标志字符串的结束,但不是字符串的一部分。
字符串以数组的形式存在,以数组或者指针的形式访问。

#include <string.h>//字符串函数在这个函数库里面

(2)字符串常量:
"Hello"
会被编译器变成一个字符数组放在某处,这个数组的长度是6,结尾还有表示结束的0
(3)输入输出字符串:

char word[8];

scanf("%s",word);
//输入一个单词,到空格、tab或回车为止。但scanf是不安全的,因为不知道要读入内容的长度

printf("%s\n",word);

安全的输入:

char string[8];

scanf("%7s",string);//7表示最多允许读入字符的数量
(4)空字符串:

char buffer[100]="";//这是一个空字符串,buffer[0]=='\0'
char buffer[] = "";//这个数组的长度只有1;

(5)字符串函数:

strlen(const char *s)//表示字符串的长度
strcmp(const char *s1,const char *s2)//返回0时,表示两个字符串相等;等s1和s2不相等时,返回s1与s2的差值(数)
strcpy()//把第二个字符串拷到第一个字符串中,不安全,可能溢出
strcat()//把第一个字符串拷到第二个字符串,并与第二个字符串拼接,不安全,可能溢出
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注