笔记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的数;