c语言入门(2)

287 阅读6分钟
Say goodbye to the depravation of yesterday. 告别昨日的颓废。

------------------------------------------------------------------------------------------

8. 控制语句

条件语句: If     switch

if语句:

if(条件表达式) 程序块

if(条件表达式) 程序块 else 程序块

if(条件表达式1)程序块elseif(条件表达式2)程序块 …else程序块

#if 1
int main () 
{    
/* if条件语句 */
    float score;
    scanf("%f",&score);
    if(score>=60)
    { 
       printf("你的分数是:%4.1f\n",score);
        printf("你通过了测试");
    }   
    else 
   {
        printf("你的分数是:%4.1f\n",score);
        printf("你没有通过测试");
    } 
   return 0;
}
#endif

switch语句:

switch(表达式)

case 常量表达式1: 程序块1 break;

case 常量表达式2: 程序块2 break;

default: 默认程序块 break;

循环语句:while for(根据某个条件是否成立决定是否重复执行程序)

int main (){
    /* switch条件语句  计算器*/
    float a,b;
    char operate;
    scanf("%f %c %f",&a,&operate,&b);
    switch (operate){ 
       case '+': printf("%f %c %f 的结果是:%f \n",a,operate,b,a+b); break;
        case '-': printf("%f %c %f 的结果是:%f \n",a,operate,b,a-b); break;
        case '*': printf("%f %c %f 的结果是:%f \n",a,operate,b,a*b); break;
        case '/': printf("%f %c %f 的结果是:%f \n",a,operate,b,a/b); break;
        default: printf("输入运算符错误:\n"); break;
    }
           return 0;
}

While语句

while(表达式) 程序块 while条件成立 一直执行if只执行一次

do程序块while(表达式) do先执行一次再判断是否成立,再决定是否执行下一次

#if 1
int main (){
    /* while循环 1到100的和*/ 
   int sum = 0, i = 0;
   while(i<=100){
    sum += i;  /*sum = sum + i */
    i++;
   }
    printf("1到100只和是:%d\n",sum);
    i = 0;
    sum = 0;
    do{
      sum += i;  /*sum = sum + i */
      i++;
   }while(i<=100);
    printf("1到100的和是:%d\n",sum);
    return 0;
}
#elif 1
int main (){
    /* 语句嵌套 */ 
  float money,earn = 0,debt = 0;
   while(1){
       printf("请输入金额:\n");
       scanf("%f",&money);
       if(money>0){
           earn+=money;
       }else if(money<0){
           debt+=money;
       }else{   /*等于0 退出*/
           break;
       } 
  }
   printf("earn: %f , debt: %f ./n",earn,debt);
    return 0;
}
#endif

for语句

for(初始表达式,条件表达式,后处理表达式) 程序块

#if 0
int main (){ 
   /* for循环 1到100的和*/
    int sum = 0; 
   for(int i=1;i<=100;i++)
    {
       sum+=i;
    } 
   printf("1到100的和是:%d\n",sum);
    return 0;
}
#elif 1
int main (){ 
   /* for循环 判断一个数是否是质数*/
   int a;   scanf("%d",&a);
   /* demo1  */
   /*   
   for(int i = 2; i<a ; i++){
       if(a%i==0){ 
          printf("%d不是质数",a);
           return 0;
       }
    }
   printf("%d是质数",a);
   */
   /* demo2 */  
  int flag = 0;
   for(int i = 2; i<a ; i++){
       if(a%i==0){
           flag = 1;
           break;
       }
    }
   if(flag == 1){
       printf("%d不是质数",a);
   }
   else{
       printf("%d是质数",a);
   }
   return 0;
}
#endif

9. 数组

数组是在内存中连续存储的具有相同类型的一组数据的集合。

通过下标访问数组数据的值。

定义数组:int arr[5]; int brr[5]={3,4,5,8};

int crr[]={3,4,5,8};

#if 1
int main (){
    /* 键盘输入学生成绩 计算平均数*/
    float scoreArr[100], score, sum;
    int n = 0;
    while(1){
        scanf("%f",&score);
        if(score<0){
            break;
        }
        scoreArr[n] = score;
        sum+=score;
        n++;
    }
    for(int i=0;i<n;i++){
        printf("%f\t",scoreArr[i]);
    }
    printf("\n");
    printf("平均分数是:%5.2f",sum/n);
    return 0;
}
#endif

10.函数

一个命名的程序块,执行专门的任务。

返回类型 函数名 (参数){函数体}。void表示函数无返回类型

递归函数:调用自身的函数。

#if 0
/*函数定义 */
void fun (int n){  /* 形式参数 */ 
   for(int i = 0;i<n;i++){ 
       printf("hello\n");
        printf("第%d次\n",i);
    }
}
int main(){
    fun(5);   /* 函数调用 实际参数 */ 
   return 0;
}
#elif 0
/* n的阶乘 */
int fun (int n){ 
     int result = 1;
    for(int i = 1;i<=n;i++){
       result*=i;
       printf("%d\n",result);
    }
    return result;
}
int main(){
    printf("%d\n",fun(5));
    return 0;
}#elif 1
/*递归函数 n的阶乘   n=1 n!=1 n>1 n!=n(n-1)! */
int fun (int n){ 
     if(n == 1){ 
       return 1;
    }else{
        return n*fun(n-1);
    }
}
int fic(int n){
    if(n<=2){
        return 1;
    }else{ 
       return fic(n-1)+fic(n-2);
    }
}
/*递归函数 斐波那契数列   F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*) */
int main(){
    int n = 5;
    printf("%d的阶乘计算\n",n);
    printf("%d\n",fun(n));
    printf("%d的斐波那契数列计算\n",n);
    for(int i = 1;i<=n;i++){
        printf("%d\n",fic(i));
    }
    return 0;
}
#endif

11指针

定义:变量的地址,可以通过取地址运算符&得到变量的地址

指针变量:用来存储“指针(地址)”的变量

设type是一个数据类型,则type*也是一个类型,叫做type指针类型,type*类型的变量是存储type类型变量的地址。

Eg:int a = 3; int *p=&a;

可以通过“解引用运算符”* 得到一个指针变量指向的变量;

Eg:int a=4,b=5; int *p=&a;

*p = 6; /* 此时a=6*/

b=*p /* 此时b=6*/

#if 1
/*指针  变量*/
int main(){ 
   /*指针指向变量 */
    int a=1,b=2; 
    int *p=&a; 
    printf("a:%d,b:%d\n",a,b);
    printf("a的地址是:%p\n",&a);
    printf("p的取值是:%p\n",p);
    printf("a的变量值是:%d\n",a);
    printf("p的指向值是:%d\n",*p);
    b=*p;    /* *p解引用指向对应变量的值 */
    printf("a:%d,b:%d\n",a,b);
    return 0;
}
#endif

可以用指针变量指向数组某个元素


#if 1
/*指针  数组*/
int main(){ 
   /*指针指向数组地址即数组第一个元素的地址 */
    int arr[5]={3,5,7,1,10}, b;
    int *q=arr;  /* 等价于int *q=arr[0];  */ 
    printf("arr的地址为:%p\n",arr);
    printf("arr[0]的地址为:%p\n",&arr[0]);
    printf("q的取值为:%p\n",q);
    /*  
      *q解引用指向对应变量的 则 *q==arr[0]  则 *[q+2] = arr[2]
          arr[i] == *(arr+i) = *(q+i) = q[i]
    */
    printf("arr[2]的值为:%d\n",arr[2]);
    printf("q[2]的取值为:%d\n",q[2]);   /* q[2]==*(q+2)   */
    b=arr[1];
    for(int *p=arr;p<arr+5;p++){ 
       printf("%d\t",*p);
    } 
   return 0;
}
#endif

指针作为函数的参数

#if 1
/*指针做参数 两个变量交换 */
void swap1 (int a, int b){
    int temp = a;
    a=b;
    b=temp;
}
void swap2 (int *a, int *b){
    int temp = *a;
    *a=*b;
    *b=temp;
}
int main(){
    int x=3,y=4;
    printf("x=%d,y=%d\n",x,y);
    printf("……执行交换函数swap1……\n");
    swap1(x,y);
    printf("x=%d,y=%d\n",x,y);
    printf("……执行交换函数swap2……\n");
    swap2(&x,&y);
    printf("x=%d,y=%d\n",x,y);
    return 0;
}
#endif

数组作为函数的参数:数组名就是数组第一个元素的地址,因此传递的实际是指针。

Eg:void print(char arr,int n)=== void print(char *a,int n)

#if 1
/*数组名作为函数的参数
    数组名就是数组第一个元素的地址,因此传递的实际是指针。
  void print(char arr,int n)=== void print(char *a,int n)*/
void print(char arr[],int n){
    for(int i=0;i<n;i++){
        printf("%c\n",arr[i]);
    }
}
int main(){
    char crr[]={'h','e','l','l','o'};
    print(crr,5);
    return 0;
}
#endif

字符串

结尾带有”结束字符”,即“\0”的字符数组

Eg:char str[]={‘h’,‘e’,‘l’,‘l’,‘o’,‘\0’}


C语言字符处理函数头文件string.h

strlen(char* s) 返回字符串的长度

strcpy(char* s,’srt’)字符串拷贝

#if 1
#include <string.h>
int main (){
    char arr[] = {'h','e','l','l','o'};
    char str[] = {'h','e','l','l','o','\0'};
    char* p="hello";
    printf("str的长度为:%d,p的长度为:%d\n",strlen(str),strlen(p));
    strcpy(str,"wang");
    printf("%s\n",str);
    printf("%s\n",p);
    return 0;
}
/*实现自己的 strlen */
int strlen(char *s){
    char *p=s;
    while(*p!='\0'){
        p++; 
   }
    return p-s;
}
#endif

(未完待续)

--------------------------------------------------------------------------------------------

看完点个赞吧,给别人点赞,会让自己觉得自己是一个善良的人。

关注一下,让自己觉得自己是一个友善的人,开放包容的人,人生会不经意间美妙一点点。

我的收获期待与你分享,希望一同成长!