4.11
复习
递归函数:
自己调用自己调用的函数
一定要有退出条件
typedef:
对数据类型取别名
例:
typedef unsigned long u8;
指针函数:
本质是个函数,返回值类型是一个地址
函数指针:
typedef int(*p_func)(int,char)
int func(int a,char b);
int (*p)(int,char);
p(3,'a');
p_func p=func;
结构体:
存储不同类型的数据
struct stu
{
char name[20];
int id;
float grade;
long a;
}lisi,*q; //可以写在此处定义结构体变量
一共占有40个字节,按照结构体内最大的数据类型进行对齐
sizeof(struct stu)==40;
struct stu zhangsan;
struct stu *p=&zhangsan //定义一个指针要指向一个变量
struct stu wangwu={"wangwu",3,11812990230};//变量初始化
struct stu arr[10]={{"das",2,23,43},{"eqe",3,65,67}};//数组未完全初始化
zhangsan.a=4;
p->grade=92;
arr[0].a=6;
字符输入输出函数–getchar,putchar
从键盘获取一个字符,返回值为获取到的字符
例:
char a;
a=getchar();
putchar(s); 输出一个字符s。
例;
char a;
a=getchar();//获取一个字符
putchar(a);//打印字符
putchar(10);//打印出换行
标准输入输出函数–printf,scanf
printf:
printf("格式控制串",输出表);
格式控制串:%+修饰符+格式控制符
格式控制符:
%d -- 输出十进制整数
%c -- 输出字符型数据
%f -- 输出浮点型
%x -- 输出十六进制数
%o -- 输出八进制数
%e -- 输出指数形式
%s -- 输出字符串形式
%p -- 输出地址
%% -- 输出%本身
修饰符:
m -- 输出数据域宽,数据长度<m,左补空格
.n -- 对实数指定小数点后n位
对字符串指定实际输出位数为n位
- -- 输出数据在域内左对齐
+ -- 在有符号数的正数前显示+
0 -- 输出数据时指定左面不使用的空位填0
# -- 在八进制和十六进制前加0和0x
l -- 在d,o,x,u前指定输出精度为long
在e,f,g前指定为double
输出表:指定输出打印内容
普通字符原样输出
scanf:
功能:以指定的格式获取数据放入地址表中
一般形式:
scanf("格式控制串",地址表);
格式控制串:%修饰符格式控制符
格式控制符:
%d -- 输入十进制整数
%c -- 输入字符型数据
%f -- 输入浮点型
%x -- 输入十六进制数
%o -- 输入八进制数
%e -- 输入指数形式
%s -- 输入字符串形式
修饰符:
m -- 指定输入的数据长度
* -- 抑制符,接收数据后不放入地址表
结束标志:
1.空格,回车,制表符结束一次输入
2.遇非法输入
3.遇数据宽度结束
脏字符:在程序中不必要的字符
1.用抑制符%*c或空格
2.用getchar函数吸收
注意:遇到空白符(回车,空格,制表符)会跳过向后获取数据
普通字符原样输出
getchar();//可以吸收脏字符,用于循坏输入scanf当中
字符串输入输出–gets puts
gets:
功能:从键盘上获取一串字符串
一般形式:
gets(char *s);
char *s:字符串首地址
例:
char a[50];
gets(a);
puts:
功能:输出指定字符串,会自动换行
一般形式:
puts(char *s);
例:
char a[10]="asd";
puts(a);
练习:1.删除字符串中的重复字符,如aabbaddffe,删除后的结果,abdfe;
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
int i,j,k;
// int len;
char a[20];
scanf("%s",a);
//len=strlen(a);
// printf("%d",len);
for(i=0;a[i]!='\0';i++)
{
for(j=i+1;a[j]!='\0';j++)
{
if(a[i]==a[j])
{
k=j;
while(a[k]!='\0')
{
a[k]=a[k+1];
k++;
}
j--;
}
}
}
for(i=0;a[i]!='\0';i++)
printf("%c",a[i]);
puts(" ");
return 0;
}
hq
2.有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。(约瑟夫环)
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
int i=0,j=0,count=0;//i=下标,j=个数,count=计数。
int n;
scanf("%d",&n);
int a[n];
memset(a,0,sizeof(a));
while(count!=n-1)
{
if(i==n)//先循环成一个圈;
{
i=0;
}
if(a[i]==0)
{
j++;
if(j==3)
{
a[i]=1;
j=0;
count++;
}
}
i++;
}
for(i=0;i<n;i++)
{
if(a[i]==0)
printf("%d\n",i+1);
}
return 0;
}
控制语句
选择结构
if…else
一般表达式:
if(表达式1)
{
语句块1;
}
else if(表达式2)
{
语句块2;
}
…
else//除以上所有情况
{
语句块;
}
switch…case
一般形式:
switch(表达式)//不能用浮点型数据
{
case 常量表达式1:
语句块;
break;
case 常量表达式2:
语句块;
break;
…
default:
语句块;//最后一个不用添加break自动退出
}
当表达式结果和常量表达式结果相同时进入,开始执行语句块直到break。
循环结构
while
一般形式:
while (表达式)
{
循环体;
}
死循环: while(1)
do…while
一般形式:
do
{
循环体:
}while(表达式);
for
一般形式:
for(表达式1;表达式2;表达式3)
{
循环体;
}
goto
破坏程序的逻辑结构。