分享我的#C语言学习之路

笔记4:

define--一种指令,不是关键字
int* p=&a;//*--解引用操作服/间接访问操作符,是为了告诉我们p是个指针变量

//名字+身高+年龄+身份号码+.....
//书名+作者+出版号+定价+书号+.....
结构体--自己创造出来的一种类型(复杂对象)

创建一个结构体类型
struct Book//book-类型名
{
    char name [20];//C语言程序设计
    short price;//
};//;不可缺少,用来结束类型定义;
//{}里面描述书的相关属性
//上面是创建书的类型,下面要创造一本书
利用结构体类型创建一个该类型的结构体变量
int main()
{
    struct Book b1={"C语言程序设计",55}//由于b1里面有名字和价格等参数,所以用{}包括所有内容;
//第一个是书名,第二个是价格;
    printf("书名:%s\n",b1.name);//书名:C语言程序设计
    printf("价格:%d元\n",b1.price);//价格:55元
    b1.price=15;
    printf("修改后的价格:%d\n",b1.price);
    return 0;
}

int main()
{
    struct Book b1={"C语言程序设计",55}
    struct Book* p=&b1//说明变量p的指针类型是struct Book;
    利用p打印出书名和价格
    printf("%s\n",(*p).name);
    printf("%d\n",(*p).price);
    return 0;
}
用更简单的方法打印:
printf("%s\n",p->name);//p是指针,p所指向的对象的name;
printf("%d\n",p->price);//同理

//.   结构体变量.成员
//->  结构体指针->成员
数组名本质上是个地址,所以想要改变上述的书名
不能是 b1.name="C++";
而是为
strcpy(b1.name,"C++");//strcpy-string copy---字符串拷贝;strcpy-库函数,所以就要引用头文件string.h
//strcpy--两个参数,说明要把你想改的书名放到哪

学习语言(C/C++/Java)
学习算法、数据结构(DS)
学习系统和网络(Linux+系统编程+网络基础+网络编程+)//提高技能

生活中有三种结构:顺序结构,选择结构,循环结构

选择结构:
1.分支语句
if语句
eg:
int main()
{int i=1;
 int j=2;
 if(i>j)
     printf("%d\n",i);
 else
     printf("%d\n",j);
 return 0;
}//;(分号)--结束一条语句的标志

//如果一个if语句控制多个语句,那么应该用{}(代码块)括起来 eg:
int main()
{int age=18;
 if(age<18)
 {printf("未成年\n");
  printf("不能谈恋爱\n");}
 else if(age>=18 && age<50)
     printf("已成年,能谈恋爱\n");
 else 
     printf("您老啦,该养身啦\n");
 return 0;
}//if和它最近的未匹配的else匹配


switch语句--适合多分支的情况//switch()括号里面的参数必须是整型变量
eg:
int main()
{
    int day=0;//不能定义成float day=0等等。
    scanf("%d",&day);//当你输入值时,要把输入的值赋给变量,所以要知道这个变量的地址(取地址)
    switch(day)//switch()作为case语句的一个判断入口;
    {
    case 1:
        printf("星期1\n");
        break;
    case 2:
        printf("星期2\n");
        break;
    case 3:
        printf("星期3\n");
        break;
    case 4:
        printf("星期4\n");
        break;
    case 5:
        printf("星期5\n");
        break;
    case 6:
        printf("星期6\n");
        break;
    case 7:
        printf("星期天\n");
        break;
    default:
        printf("输入错误\n");
    }//假设输入3,那么进入switch语句之后,直接跳到case 3,并输出星期3;此时如果不在case语句后面加break,则会相应的执行后面的case语句,那么还会输出星期4、5、6、7;所以为了只得到我们想要的结果,必须在每个case语句后面加上break;
    //break--跳出我们执行后的switch语句
    return 0;
}//case决定入口,break决定出口
case 后面的表达式的结果只能时整型并且只能是常量表达式
switch-case语句中可以出现if语句,但是不要出现continue,对我们没什么意义,也不知道会跳到哪里去;

如果输入的switch(day)里面的day的值有多个,但是它们最后输出的结果一样时,我们可以这样写
switch(day)
{case 1:
 case 2:
 case 3:
 case 4:
 case 5:
    printf("工作日\n");
    break;
 case 6:
 case 7:
    printf("休息日\n");
    break;
 default:
     printf("输入错误\n");
}//此处default的作用是:当你输入的值不是case中的值时,程序默认提示你输入错误

练习:
#include <stdio.h>
int main()
{
int n=1;
int m=2;
switch(n)
{case 1:m++;//进出switch语句后,执行m++;有在此处m=3,n=1;由于没有break语句,所以继续往下执行
 case 2: n++;//此处m=3,n=2;
 case 3:
     switch(n)//switch允许嵌套使用; 由于n=2,m=3;跳到case 2执行
     {    case 1:n++;
     case 2:m++;n++;break;}//此处m=4,n=3;此时见到break语句,跳出这个switch语句,往下执行;
 case 4:m++;//此处n=3,m=5;
     break;
 default:
     break;
}
printf("m = %d,n = %d\n",m,n);//所以最终的结果是m=5,n=3;
return 0;}

循环语句
1.while(表达式)
 {循环语句}
//如果while()里面的表达式为真,那么就执行{}内的循环语句,否则就跳出循环
eg:
int main()
{int i=1;
 while(i<=10)
 {printf("%d ",i);
  i++;}
 return 0;
}//打印1到10;

看看 break 在while循环中的作用
int main()
{
int i=1;
while(i<=10)
{if(i==5)
 break;
printf("%d ",i);
i++;}    
return 0;
}//打印结果为1 2 3 4 ;当i==5时,执行break语句,跳出while循环;
//如果把break改为contine
//那么最终打印的结果也为 1 2 3 4 .(此处的点表示未结束循环)
//意思是当i=5时,执行if语句,然后判断i==5后,执行continue,不执行后面的语句,而是又进入到了while(),去判断i<=10,继续直到continue,然后又到while(),进入了死循环;
//所以,continue 的作用当我们有机会执行continue时,continue后面的代码不再继续执行,而是进入判断下次循环要不要继续,第二次循环如果要继续的话,就继续,如果没有遇到continue,那么就继续往下执行
eg:
int main()
{int i=0;
  while(i<=10)
  { i++;
    if(i==5)
     continue;
    printf("%d ",i);
   }
  return 0;
}//打印的结果为 1 2 3 4 6 7 8 9 10
//continue的作用:终止循环中本次循环continue后面的代码,直接跳转到循环while开头的部分,判断要不要进行下次循环


getchar()--接受键盘输入的一个字符
eg:
int main()
{
  int ch=0;
  while((ch=getchar())!= EOF)//接受键盘输入的一个字符,并放到ch里面去
  {putchar(ch);//输出ch;putchar打印值的时候和printf是一样的
  printf("%c\n",ch);}
  return 0;
}//当按键盘上Ctrl+z时会结束循环
EOF----end of file(文件结束标志)--值为-1

eg:
int main()

    int ret=0;
    char password[20]={0};
    printf("请输入密码: >");
    scanf("%s",password);//输入密码,并把密码放入password数组中;
    printf("请确认(Y/N):>");//然后按了Enter键(\n),输出这行的 '请确认(Y\N)'
    ret= getchar();刚刚按下的Enter键(\n)被getchar()读取,所以ret被赋值10(因为'\n'的10进制大小(ASCII码值)为10)
    if(ret=='Y')
        printf("确认成功\n");
    else
        printf("放弃确认\n");
    return 0;}
//缓冲区---在scanf和getchar之间的区域
所以要实现这个程序的话,必须将'\n'提前读取;
在scanf的下一行 写上getchar();//等待键盘输入,把'\n'给读走了
//注意:getchar()只会读走连续的东西
eg:如果上面输入的password为 123456 abcd
   那么第1个getchar() 只会读取123456
   然后下个getchar() 就只读了一个空格
所以我们现在让第1个getchar()只读'\n';
   将scanf下面输入 
    while((ch=getchar())!='\n')
    { };//让getchar只有读到'\n'时,才跳到下一步;

综上所述,完整的代码应该是
#include <stdio.h>
int main()

    int ret=0;
    int ch=0;
    char password[20]={0};
    printf("请输入密码: >");
    scanf("%s",password);//输入密码,并把密码放入password数组中;
    while((ch=getchar())!='\n')
    { ;}//等待键盘输入,把'\n'给读走了
    printf("请确认(Y/N):>");//然后按了Enter键(\n),输出这行的 '请确认(Y\N)'
    ret= getchar();//刚刚按下的Enter键(\n)被getchar()读取,所以ret被赋值10(因为'\n'的10进制大小(ASCII码值)为10)
    if(ret=='Y')
        printf("确认成功\n");
    else
        printf("放弃确认\n");
    return 0;
}

输出数字字符,不会输出非数字字符
#include <stdio.h>
int main()
{
    char ch=0;
   while((ch=getchar())!=EOF)
   {if(ch<'0'||ch>'9')
      continue;
    putchar(ch);
   }
   return 0;
}


2.for(表达式1;表达式2;表达式3)
int main()
{
  int i=0;//定义变量
  for(i=0;i<=10;i++)//初始化,判断,调整
   printf("%d ",i);
return 0;
}//打印0-10;

//不可在for循环体内需修改循环变量,防止for循环失去控制;
eg:
int main()
{int i=0;
 for(i=0;i<10;1++)
   { if(i=5)//此处就是改变i的值
      printf("哈哈\n");//导致最后的结果进入死循环,无限的打印 "哈哈";
 printf("hehe");}
 return 0;
 }

//建议for语句的循环控制变量的取值采用"前闭后开区间"写法
eg:
int main()
{
int i=0;
int arr[10]={1,2,3,4,5,6,7,8,9,10};
for(i=0;i<10;i++)//此处的10 可以理解为10个元素,10次循环,10次打印(比较具有意义,所以建议前闭后开区)
    printf("%d ",arr[i]);
return 0;
}
//for循环中的初始化,调整,判断都可以省略;for(;;)
//但是:如果for循环的判断部分被省略,那么判断条件就是恒为真,进入死循环


#include <stdio.h>
int main()
{int i=0;
int j=0;
for(;i<10;i++)
  {for(;j<10;j++)
  printf("hh ");}
return 0;}
//i=0,j=0,进入循环,打印10次 hh 后j=10,跳出这个j的循环后 i=1,进入循环,由于此时j=10,没有被初始化,所以最终总共打印10次 hh,循环结束

#include <stdio.h>
int main()
{int i=0;
int j=0;
for(;i<10;i++)
  {for(j=0;j<10;j++)//j每次被初始化;
  printf("hh ");}
return 0;}
//打印100次 hh;

int main()
{
int i=0;
int k=0;
for(i=0,k=0;k=0;i++,k++)
    k++;
return 0;
}//1次都不循环,因为只有判断条件恒为真才进入循环
//如果判断条件处改为k=1;那么就会进入死循环

3.do....while循环
int main()
{
  int i=1;
  do
  {printf("%d ",i);
   i++;}
  while(i<=10);//while()后面一定记得加;
  return 0;
}

计算n!
#include <stdio.h>
int main()
{
  int i=1,sum=1;
      for(i=1;i<=6;i++)
      {sum=sum*i;}
  printf("sum= %d\n",sum);
  return 0;
}

计算1!+2!+3!+....+10!
法1:#include <stdio.h>
int main()
{
  int i=0,t=0;
  int sum=1;
  int j=0;
  int s=0;
  for(j=1;j<=4;j++)
      {      sum=1;//防止sum由于保留上次结果而出现累乘的现象
          for(i=1;i<=j;i++)
      { 
          sum = sum * i;
          
      }//n的阶乘
  s=s+sum;
  }
  printf("s= %d\n",s);
  return 0;
}

法2:
#include <stdio.h>
int main()
{
 int i=1;
int sum=0;
int s=1;
int n=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
    {s=s*i;
sum=sum+s;}
printf("sum= %d\n",sum);
return 0;}


在数组中查找具体的某个数
int main()
{
  int arr[]={0,1,2,3,4,6,7,8,9};
  int k=5;//要找的数
 int left=0;
 int right=0;
 int sz=(sizeof(arr)/sizeof(arr[0]))-1;//计算数组的元素个数
 int right=sz-1
 int mid=0;
 while(left<=right)
 {
  mid=(left+right)/2;
 if(arr[mid]>k)//说明所要找的数在中间数的左边,那么右下标变为中间这个数下标左移一个
 {  right=mid-1;}
 else if(arr[mid]<k)
 {left = mid+1;}//说明所要找的数在中间数的右边,那么左下标变为中间数下标右移一个
 else 
  {printf("找到了哈,下标是: %d\n",mid);
 break;}//找到了,跳出循环
 }
 if(left>right)
     printf("抱歉,找不到了\n");
return 0;
}//对半查找的方式


编写代码,演示多个字符从两端移动,向中间汇聚
#include <stdio.h>
#include <string.h>//使用strlen函数时;
#include <windows.h>//当你使用sleep函数休息时
#include <stdlib.h>//当你使用system函数进行清屏时
int main()
{
    char ch1[]="welcome to home!!!!";
    char ch2[]="###################";
    int sz=sizeof(ch2)/sizeof(ch2[0]);
    int left=0;
    int right=sz-2;//也可以写成right=strlen(ch2)-1;//所求的长度里面不包括'\0';
//对于字符串来说
//char arr[]="abcd"; 
//实际上里面有四个字符,分别是:a b c d \0
//而如果你想求d对应的下标(3)的话,应该是5(\0的下标)-2;
    while(left<=right)
    {ch2[left]=ch1[left],ch2[right]=ch1[right];
    printf("%s\n",ch2);
    Sleep(1000);//打印1次休息1000ms=1s;
    system("cls");//执行系统命令的一个函数-- cls-清空屏幕
    left++,right--;}
    printf("%s\n",ch2);
return 0;}//运行下就知道是啥

编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序)
int main()
{
    int n=1;
    char ch[20]={0};
    while(n<=3)
    {printf("请输入密码=> ");
     scanf("%s",ch);
    if(strcmp(ch,"213229")==0)//判断字符串相等,不能用==,应该使用库函数-strcmp;
        {printf("登录成功\n");
    break;}
    else 
        {printf("密码错误\n");
    n++;}}
    if(n==4)
        printf("三次密码均错误,退出程序\n");
return 0;}
//strcmp--比较两个字符串的大小,如果前面字符串大于后面字符串,返回大于0的数;
//如果前面字符串等于后面字符串,那么就会返回0;
//否则返回一个小于0的数;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fighting787

一起加油,一起成功!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值