1.杨辉三角
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
int n;
printf("打印几行杨辉三角:");
scanf("%d",&n);
int arr[n][n];
int i,j,k;
for(i=0;i<n;i++)
{
for(k=n;k>=i;k--)
{
printf(" ");
}
for(j=0;j<=i;j++)
{
if(j==0||j==i)
arr[i][j]=1;
else if(i>1)
arr[i][j]=arr[i-1][j-1]+arr[i-1][j];
printf("%-4d",arr[i][j]);
}
printf("\n");
}
return 0;
}
结果为:
2,图形打印
A
BB
CCC
DDDD
DDDD
CCC
BB
A
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
int i,j;
char m;
printf("输入字母:");
scanf("%c",&m);
if(m<'A'||m>'z')
{
printf("输入不合法\n");
}
else if(m>='a'&&m<='z')
{
m=m-('a'-'A');
}
for(i='A';i<=m;i++)
{
for(j='A';j<=i;j++)
{
printf("%c",i);
}
printf("\n");
}
for(i=m;i>='A';i--)
{
for(j=i;j>='A';j--)
{
printf("%c",i);
}
printf("\n");
}
return 0;
}
结果为:
3,穷举算法
日本某地发生了一件谋杀案,警察通过排查确定茶人凶手必定4个中的一个 以下为4个嫌疑犯的供词 A说:罪犯是他们3人当中 B说:人不是我杀的,是C C说:A和D之间有一个是罪犯 D说:B说的是事实 已知2个人说了真话,2个人说了假话 请编程确定谁是凶手
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
char kill;
for(kill='A';kill<='D';kill++)
{
if((kill!='A')+((kill!='B')&&(kill=='C'))+((kill=='A')||(kill=='D'))+((kill=='C')&&(kill!='B')&&(kill!='D'))==2)
printf("%c\n",kill);
}
return 0;
}
结果为:D
4.判断
给定一个整数,判断它是否被3、5、7整除,并输出一下信息 1.能同时被3,5,7整除(直接输出3 5 7,每个数字之间一个空格) 2.只能内其中两个整数整除(输出两个数,小的在前,大的在后,例如3 5 或者 3 7 或者5 7,中间使用空格隔开) 3. 只能被其中一个整数整除(输出这个除数) 4.不能被任何数整除,输出小写字母n 案例如下: 输入:105 输出:3 5 7
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
int n;
printf("请输入一个数:");
scanf("%d",&n);
int arr[3]={3,5,7};
int i,t=0;
for(i=0;i<3;i++)
{
if(n%arr[i]==0)
{
printf("%d ",arr[i]);
t++;
}
}
if(t==0)
printf("%d",n);
printf("\n");
return 0;
}
结果为:
5.字符串单词逆置
”good good study“
"study good good"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
char str1[]=" df sd fsdsaf ";//"good good study";
int i=0,j=strlen(str1)-1;
char t;
while(i<j)
{
t=str1[i];
str1[i]=str1[j];
str1[j]=t;
j--;
i++;
}
int k;
i=j=0;
while(str1[i]!='\0')
{
if(str1[j]!=' '||str1[j]!='\0')
{
j++;
}
k=j-1;
while(k>i)
{
t=str1[i];str1[i]=str1[k];str1[k]=t;
i++;
k--;
}
if(str1[j]==' ')
j++;
i=j;
}
printf("%s\n",str1);
return 0;
}
结果为:
6,实现atoi函数
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
char str[]="12365321";
int i=0,sum=0;
while(str[i])
{
sum=sum*10+str[i]-'0';
i++;
}
printf("%d\n",sum);
return 0;
}
结果为:
7.输入一个字符串,删除字符串中的空格
”this is my class“
"thisismyclass"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
char str[]="this is my class";
int i=0;
int j,n=strlen(str);
while(str[i])
{
if(str[i]==' ')
{
for(j=i;j<n;j++)
{
str[j]=str[j+1];
}
}
i++;
}
printf("%s\n",str);
return 0;
}
结果为:
8.字符串长度 strlen
用自己写的函数来实现strlen,strcpy, strcat, strcmp
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *My_strcpy(char *dest,const char *src);
int My_strlen(char *s);
char *My_strcat(char *dest, const char *src);
int My_strcmp(const char *s1,const char *s2);
int main(int argc, const char *argv[])
{
char str1[100]="abcdef";
char str2[]="abcdef";
//printf("%s\n",My_strcpy(str1,str2));
//printf("%d\n",My_strlen(str1));
//printf("%s\n",My_strcat(str1,str2));
printf("%d\n",My_strcmp(str1,str2));
return 0;
}
char *My_strcpy(char *dest,const char *src)
{
char *p=dest;
while(*src!='\0')
{
*dest=*src;
src++;
dest++;
}
*dest=*src;
return p;
}
int My_strlen(char *s)
{
char *p=s;
while(*p!='\0')
{
p++;
}
return p-s;
}
char *My_strcat(char *dest,const char *src)
{
char *p=dest;
while(*dest!='\0')
dest++;
while(*src!='\0')
{
*dest++=*src++;
}
*dest='\0';
return p;
}
int My_strcmp(const char *s1,const char *s2)
{
while(*s1==*s2&&*s1=='\0'&&*s2=='\0')
{
s1++;
s2++;
}
return *s1-*s2;
}
4)二维数组的地址
二位数组的地址是连续的,二维数组看似是二维,实则在计算机中的存储形式是一维。
二维数组数组名是常量,所以不可以进行自增或自减。
int main(int argc, const char *argv[])
{
int arr[2][3]={11,22,33,44,55,66};
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
{
printf("arr[%d][%d]=%p\n",i,j,&arr[i][j]);
}
}
arr++;//报错,常量不可以进行自增
1.3 一维字符数组
字符数组:存储多个字符的容器,属于线性结构
字符串:由0个或多个字符组成的整体,成为字符串
【多用双引号括起来,字符串的标志\0,当字符串使用双引号括起来时,计算机会自动添加\0,所有汉字都是字符串】
""空串 "a" "abcd" "+234" "1" " " "你好" 字符串
'1' 不是字符串
1) 字符数组的定义格式
数据类型:char 数组名:满足命名规范 常量表达式:定义是不为0,不为空,不为小数,初始化时不为变量
格式: 存储类型 char 数组名[常量表达式]
数据类型:char
数组名:满足命名规范
常量表达式:定义是不为0,不为空,不为小数,初始化时不为变量
2)字符数组的初始化
1> 单字符初始化
char str[4]={'a','b','c','d'};//全部初始化
char str[4]={'a','b','\0','\0'};//部分初始化,剩余元素默认\0填充
\0等价0
char str[]={'a','b','c','d'};省略数组长度,数组长度默认时实际元素的个数
2> 字符串形式初始化【常用】
char str[4]={"abc"};//全部初始化,计算机自动添加\0
char str[4]="a";//部分初始化,剩余元素以\0填充
char str[]="hello";//数组长度时6,默认实际字符的个数,同时添加\0
3> 错误初始化
char str[4]="1234";//不报错,逻辑错误
char str[4];
str="1234" //错误
3)字符数组的引用
1> 字符串整体引用,格式控制符%s
char str[4]="abc";
scanf("%s",str);//字符串输入不需要加&
printf("%s",str);
2> 字符串单个引用
char str4[6]="hello";
for(int i=0;i<6;i++)
{
printf("%c",str4[i]);
}
3> gets和puts
gets
1.头文件:#include <stdio.h>
2.格式:char *gets(char *s);
3,参数:char *s
4,返回值:char *,返回的时一个地址
5,使用格式:
char str[10];
gets(str);
特点:输入字符串可以识别空格
puts
1. 头文件:#include <stdio.h>
2,格式:int puts(const char *s);
3,参数:const char *s,表示输出的数组名
4,返回值:int 输出字符的个数
5,使用格式:puts(str);
特点:输出自带换行功能
4)字符数组长度和字符串长度
字符数组长度:计算\0 就是sizeof
字符串长度:不计算\0, strlen,实际字符的个数
字符数组长度 字符串长度
char a[10]={'a','b'}; 10 2
char b[]={'a','b'} 2 不是字符串,所以读取的长度不确定,原因找不到\0.会越界继续向下访问
char c[]="abcd" 5 4
char d[10]="abc" 10 3
char e[]="abc\0def" 8 3
字符串函数
1> 字符串长度 strlen
格式:size_t strlen(const char *s);
头文件:#include <string.h>
返回值:size_t: 表示unsigned int/unsigned long
输出长度的格式控制:%lu %ld
参数:const char *s:计算长度的数组名
使用格式:strlen(字符串)
2>计算变量的长度
char str[]="hello"
printf("strlen(str)=%ld\n",strlen(str));
3>计算字符串常量的长度
printf("strlen(”hello“)=%ld\n",strlen("hello"));
4> 非函数实现计算字符串长度
int count=0;
for(int i=0;str[i]!='\0';i++)
{
count++;
}
2> 字符串拷贝strcpy
1> 认识strcpy
头文件:#include <string.h>
格式:char *strcpy(char *dest, const char *src);
参数:两个参数,dest:目标字符串,src:源字符串
把src拷贝给dest,src不变,dest变成src的值
返回值: char * 返回dest的地址
使用格式:
1,直接使用:strcpy(str1,str2);把str2拷贝str1
2,拷贝直接输出
char str1[10]="hello",str2[5]="123"
printf("%s",strcpy(str1,str2));
2>dest只能变量,src:可以是变量或者常量
char dest[10]="hello";
char src[5]="1234";
strcpy(dest,src);
strcpy(dest,"1234");
3> 非函数实现字符串拷贝[重要]
char dest[20]="hello";
char src[]="ASD"
"ASD\0o"
0
i
"ASD"
0
i
for(int i=0;src[i]!='\0';i++)
{
dest[i]=src[i];
}
dest[i]='\0'; //dest[i]=src[i]
3>字符串连接
1> 认识字符串连接
头文件:#include <string.h>
格式:char *strcat(char *dest, const char *src);
参数:两个参数,dest:目标字符串 src:源字符串
把src连接到dest的后面,dest改变,src:没有变
返回值: char * 表示dest的地址
2>目标字符串只能是变量,src可以是变量或者常量
注意:在字符串连接时,目标字符串长度需要足够大
char dest[20]="hello",src[]="world";
strcat(dest,src);
strcat(dest,"world");
3> 非函数实现连接
char dest[20]="hello",src[]="world";
//先循环到dest的最后
int i;
for(i=0;dest[i]!='\0';i++);
//把src复制该dest
"hello\0"
i
"world"
int j;
for(j=0;src[j]!='\0';j++)
{
dest[i]=src[j];
i++;
}
dest[i]='\0';
4> 字符串比较
1> 认识字符串比较
头文件:#include <string.h>
格式:int strcmp(const char *s1, const char *s2);
参数:两个参数,拿s1比较s2
如果s1>s2,返回的结果s1-s2的ASCII, 返回>0
如果s1<s2,返回的结果s1-s2的ASCII, 返回<0
如果s1=s2,返回的结果s1-s2的ASCII, 返回=0
返回值:int 表示s1-s2的ASCII
2>字符串常见比较if格式
int main(int argc, const char *argv[])
{
char s1[]="ABDD";
char s2[]="ABDD";
int n=strcmp(s1,s2);
printf("n=%d\n",n);
if(strcmp(s1,s2)>0)//if(s1>s2)
printf("s1>s2");
else if(strcmp(s1,s2)<0)
printf("s1<s2");
else
printf("s1=s2");
return 0;
}
3> 非函数实现字符串比较
s1 "hello"
i
s2 "hello"
j
while(s1[i]==s2[j])
{
if(s1[i]=='\0')
{
break;
}
i++;j++;
}
if(s1[i]>s2[j])
printf("s1>s2");
else if(s1[i]<s2[j])
printf("s1<s2")
else
printf("s1=s2");
二维字符数组
格式:char 数组名[常量表达式1][常量表达式2]
常量表达式1:第一维,表示行数,字符串的个数
常量表达式2:第二维,表示列,每个字符串的字节大小
char a; 单字符,存储一个字符
char a[10];字符数组,存储10个字符,一个字符串
char a[3][5];3个字符串,每个字符串5个字节
1) 二维字符数组的定义以及初始化
1> 全部初始化
char a[3][5]={{"abcd"},{"defg"},{"frtg"}};
char a[2][4]={{'a','b','c','\0'},{'w','e','r','\0'}};
char a[][4]={{"abc"},{"wer"}};
2> 部分初始化
char a[3][5]={"ab","d","frt"};
char a[2][4]={{'a','\0'},{'w','e','\0'}};
char a[][4]={{"ab"},{"r"}};
3> 错误初始化
char a[3][5];
a={"abc","wer","rtyu"};
2)二维字符数组引用
1.使用行列的方式遍历二维数组
char a[3][5]={"abcd","ASDF","123"};
for(int i=0;i<3;i++)
{
for(int j=0;j<5;j++)
{
printf("%c",a[i][j]);
}
printf("\n");
}
2.常用:二维数组类似一位数组的循环方式
for(int i=0;i<3;i++)
{
printf("%s\n",a[i]);
}
3.特殊的遍历
char a[3][4]={"abcd","ASDF","123"};
a[0]: "abcdASDF123"
a[1]: "ASDF123"
a[2]: "123"
4,二维数组的循环输入和循环输出
char a[3][5];
for(int i=0;i<3;i++)
{
scanf("%s",a[i]);
}
for(int i=0;i<3;i++)
{
printf("%s ",a[i]);
}