一. c语言学习
c语言学习连接:
c语言学习代码
// 判断闰年平年
#include <stdio.h>
int main()
{
int year;
printf("请输入需要判断的年份:\n");
scanf("%d",&year);
// 能被4除尽,前提不是整百年;整百年被400除尽
if(!(year%4)&&(year%100)||!(year%400)&&!(year%100))
{printf("%d年是闰年\n",year);}
else
{printf("%d年不是闰年\n",year);}
return 0;
}
// 倒序输出五位数
#include <stdio.h>
int main()
{
int a,i;
printf("请输入需要倒序输出的五位数\n");
scanf("%d",&a);//通过&a获得存放这个数据的内存地址的值
printf("输出倒序后的五位数:\n");
for(i = 0;i<5;i++)//循环5次
{
printf("%d",a%10);
a /= 10;
}
printf("\n");
return 0;
}
// 赋值运算
// 括号最大 > ! > 算数运算符 > 关系运算符 > 逻辑与或 > ß赋值运算符
#include <stdio.h>
int main()
{
int a,b,c;
//普通赋值:
a = 2,b= 6,c = 26;
a *= b = c = 3; //a = 6,b=3,c=3;
printf("a = %d,b = %d,c = %d\n",a,b,c);
a += b +=c; //a = 12,b=6,c =3
printf("a = %d,b = %d,c = %d\n",a,b,c);
a = b == c + 5; //a = 0,b = 6,c = 3
printf("a = %d,b = %d,c = %d\n",a,b,c);
return 0;
}
//用条件表达式求三个数的最大值
#include <stdio.h>
int main()
{
int a,b,c;
int max;
printf("请输入三个数:\n");
scanf("%d%d%d",&a,&b,&c);
a > b ? (max = a):(max = b);
max > c ? (max = max):(max = c);
printf("输出最大值:%d\n",max);
return 0;
}
// 逗号表达式的值
#include <stdio.h>
int main()
{
int a,b,c;
a = b = c = 1;
// 逗号表达式遵从从左到右,赋值取最右边的值
c = (a = 10,b = 10,2 * a + 5,a + a * b + c);
//输出结果:10,10,111;
printf("a = %d,b = %d,c = %d\n",a,b,c);
return 0;
}
// sizeof:通常用来测试某个数据类型所占的内存空间大小
// 测试的是int,float,char类型在本机所占的字节数
#include <stdio.h>
int main()
{
int a = 1;
float b = 1.1;
char c = 'cv';
printf("%d,%d,%d\n",sizeof(a),sizeof(b),sizeof(c));
return 0;
}
//单个字符的输入getchar(),输出putchar()
// getchar用法
#include <stdio.h>
int main()
{
char a,b;
a = getchar();
b = getchar();
printf("输出存储的字符\n%c%c\n",a,b);
return 0;
}
输出结果
为什么只输出第一个字符和一个回车,第二个字符还没输入就结束了?
答:这是因为getchar()可以获取一个换行符,更改代码如下:
#include <stdio.h>
int main()
{
char a,b;
a = getchar();
getchar();
b = getchar();
printf("输出存储的字符\n%c\n%c\n",a,b);
return 0;
}
修改后输出:
//scanf和printf语句
#include <stdio.h>
int main()
{
int a,b,c;
//1.正常的scanf的用法
scanf("%d%d%d",&a,&b,&c);
printf("a = %d b = %d c = %d\n",a,b,c);
//2.使用*抑制符跳过输入的某个值
scanf("%3d%*2d%2d%3d",&a,&b,&c);
printf("a = %d b = %d c = %d\n",a,b,c);
//3.最好不要在scanf里面写逗号和空格之类的,不然输入
//输入的时候必须把这些都写上
scanf("%d,%d,%d",&a,&b,&c);
printf("a = %d b = %d c = %d\n",a,b,c);
return 0;
}
//判断结构中的双分支结构-if else语句
//取钱时判断是否为100的倍数
#include <stdio.h>
int main()
{
int money;
printf("请输入你要取款的金额\n");
scanf("%d",&money);
if (money%100)
printf("输入金额错误,请重新输入100的倍数\n");
else
printf("出钞%d\n",money);
return 0;
}
// 选择排序
// 找到初始的无序数组中最小的数,将其放在数组的头部。
#include <stdio.h>
int main()
{
int i,j,t,a[4]; //输入n个数字,n=4
printf("please enter 4 integer\n");
for(i=0;i<=3;i++) //输入数值
scanf("%d",&a[i]);
for(i=0;i<=2;i++) //从第一个数开始,执行n-1次
for (j=i+1;j<=3;j++) //从第i+1开始比较
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
printf("\n");
for(i=0;i<=3;i++)
printf("%5d", a[i]);
printf("\n");
return 0;
}
// 冒泡排序法
//原理:用冒泡排序法的升序排列对任意输入的 10 个数按照从小到大的顺序进行排序。从最左边开始,比较相邻的两位数字,将大的那个放在右边,依次类推,第一轮结束后最大值就是最右边的数字。
#include <stdio.h>
int main()
{
int i,j,t,a[5];
printf("input 4 integer\n");
for(i=1;i<5;i++)
scanf("%d",&a[i]);
for(i=1;i<4;i++) //变量i代表比较的趟数(趟数=数字个数-1)
for(j=1;j<5-i;j++) //变最j代表每趟两两比较的次数
if(a[j]>a[j+1])
{
t=a[j]; //利用中间变童实现两值互换
a[j]=a[j+1];
a[j+1]=t;
}
printf("排序后的顺序是:\n");
for(i=1;i<=4;i++)
printf("%5d",a[i]); //将冒泡排序后的顺序输出
printf("\n");
return 0;
}
// 矩阵转置
#include <stdio.h>
int main()
{
int i,j;
int a[3][4],b[4][3];
printf("please enter an aray element of a:\n");
// aray a
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
scanf("%d",&a[i][j]);
}
// transpose of a matrix
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
b[j][i]=a[i][j];
}
// output aray b
printf("output aray b\n");
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
printf("%d",b[i][j]);
printf("\n");
}
return 0;
}
// strcpy()复制
#include <stdio.h>
#include<string.h>
int main()
{
char c1[]="hello\0",c2[15];
strcpy(c2,c1);
puts(c2);
printf("输出字符数组c1的长度:%d\n",sizeof(c1)) ;
return 0;
}
// strcat()拼接
#include <stdio.h>
#include<string.h>
int main()
{
char c1[]="hello world",c2[10];
//除了字符串,这里还可以连接字符数组
strcpy(c2,c1);
strcat(c1,"pig"); //直接在c1后面拼接
strcpy(c2,"pig"); // 后面的字符数组复制到c2中,c2原来的数组清零,但是c2长度不变
puts(c1);
puts(c2);
return 0;
结果:
// 求字符串和字符数组的长度
#include <stdio.h>
int main()
{
int i=0,n=0;
char c[]="abcd\0-";
while(c[i++]!='\0')
{
n++;
}
printf("输出字符串的长度:%d\n",n);//字符串的结束标志为/0,之后的字符不属于该字符串了
n = sizeof(c)/sizeof(char);//字符数组长度=sizeof(数组名)/sizeof(数组原始类型)
printf("output the length of c:%d\n",sizeof(c));//sizeof(数组名)
printf("output the length of c:%d\n",sizeof(char));//字符数组一定有个空字符串/0作为字符串的结束标志
printf("输出字符数组的长度:%d\n",n);
for(i=0;i<7;i++)
{
printf("%c",c[i]);
}
return 0;
}
// 分别用两种方法演示字符串的输入输出
// puts和pringf区别:puts能自动在末尾输入一个换行符
// scanf和gets区别:scanf不支持空格、制表符输入
#include <stdio.h>
int main()
{
char c1[10],c2[10];
scanf("%s",c1);
printf("%s\n",c1);
/*
printf("接着输入第二组字符串\n");
gets(c2);
puts(c2);*/
return 0;
}
// strlen()长度
#include <stdio.h>
#include<string.h>
int main()
{
char c[10]="hello";
int n;
n = strlen(c);//求字符串的长度,不含字符串结束标志'\0'
printf("c长度为:%d\n",n);//n=5
printf("c长度为:%d\n",sizeof(c));//值为10
printf("c长度为:%d\n",sizeof(char));//值为1。char 型数据占 1 字节
return 0;
}
// strcmp()比较
#include <stdio.h>
#include <string.h>
/*strcmp(a,b):将a,b两个字符串从左到右对每个字符,按照ASCII码的值进行比较,
知道出现不同的或者’\0’,终止比较,如果内容一样,返回0;大于返回正整数,小于
则返回负整数;*/
int main()
{
// strcmp()函数:从左到右根据ASCII码值比较
// 每个字母的大小,直接遇到不同或结束标志时为止
char a[5]="abc", b[5]="abc";
int flag;
//1. 直接用等号比较的话
//比较的是地址是否一样
if(a==b) printf("a==b\n");
else if (a!=b) printf("a!=b\n");
//2. 用strcmp()比较
flag = strcmp(a,b);
if(flag== 0) printf("a与b内容相同\n");
else if (flag>0) printf("a>b\n");
else if (flag<0) printf("a<b\n");
return 0;
}
**要点小结:**
1.数组是用来 存储数据类型相同 的变量的 有序集合,可以 通过下标访问 数组中的 元素;
2.一维数组 的定义,初始化与引用;
3.二位数组 用于存储表格数据,定义,初始化与引用;
4.区分字符串与字符数组的区别:字符串是要用字符数组存储,最后要加上一个‘\0’;
5.字符数组的长度至少比字符串多1;
6.使用sizeof(数组名)/sizeof(数组元素的数据类型) = 字符数组长度
7.字符数组直接 == 比较的是 地址
8.使用string.h提供的字符串操作函数:
strcpy(a,b):将b的字符串复制到a中,会覆盖
strcat(a,b):将字符串b的内容拼接到a的后面
strcmp(a,b):将a,b两个字符串从左到右对每个字符,按照ASCII码的值进行比较,
知道出现不同的或者’\0’,终止比较,如果内容一样,返回0;大于返回正整数,小于
则返回负整数;
strlen(a):返回字符串的长度,不包括字符串结束的标记’\0’
指针
- 指针:是一个地址
- 指针变量:用来存放另一变量的地址
- *:表示“指向
- 如果定义变量 i 为指针变量,那么 *i 就表示指针变量i里面存放的地址是所指向的存储单元里面的数据。
- int*i;*表示这个变量是一个指针变量,而int表示这个变量只能存放 int 型变量的地址。
// 指针的使用
#include <stdio.h>
int main()
{
int a=10,b;
int *p,*q;//指针变量的定义
// 取得a变量的地址赋值给p
p = &a;
b = *p+3;//通过指针变量访问变量
printf("%d\n",p);//p是一个地址:6487616
printf("%d\n",b);//b=13
// 如果p指向的内存中的数据+1,a会等于多少?
*p = *p+1;
printf("a = %d,b = %d\n",a,b);//a = 11,b = 13
// 我们把p的地址赋给q,然后对q+1,观察a的变化
q = p;
*q = *q+1;
printf("a = %d,b = %d\n",a,b);//a = 12,b = 13
return 0;
}
// 指针与一维数组
#include <stdio.h>
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int *p=a,*q=&a[9],*c=&a[3];
int i,num;
// 数组名本身就是一个指针(地址),它代表了数组的首地址,数组在内存中连续存放
printf("%p %p %p %p\n",a,p,&a[0],q); //%p 打印地址,三者地址相同
printf("*p=%d,*q=%d,*c=%d\n",*p,*q,*c); //*p=1,*q=10,*c=4
// 循环的目的是实现数组的倒序排列
while(p<=q)
{
num = *q;
*q = *p;
*p = num;
// 将指针p后移一个单位
// 将阵阵q后移一个单位
p++;q--;
}
printf("*p=%d *q=%d\n",*p,*q) ;// *p=5 *q=6
printf("输出交换后的数组:\n");
for(i=0;i<10;i++)
{
printf("%d",a[i]);
}
printf("\n"); //输出结果:10987654321
return 0;
}
// 指针与字符串
// 双引号表示字符串,单引号表示字符
#include <stdio.h>
int main()
{
int num = 0;
//定义方式一:
char str1[]= "How do you do!";
printf("%s\n",str1);// How do you do!
printf("%p\n",str1);// str1指向了字符串的第一个字符的地址
//定义方式二:
char *str = "How do you do!";
printf("%s\n",str); // How do you do!
printf("%d\n",*str); // 指用字符指针向了字符串的第一个字符H,值为十进制的72
for(;*str;str++)
// 第一个分号前面没有写循环初始状态,表明无条件开始循环。
// *str意思是*str!=0执行,*str==0停止循环
// 执行一次循环体后, 执行步长运算部分: p++
{
if(*str == 'o') num++;
}
printf("*str = %d\n",*str);// *str=0
printf("字符串中o出现了%d次\n",num);
return 0;
}
// 指针与二维数组
#include <stdio.h>
int main()
{
int a[2][2] = {{1,2},{3,4}};
int *p,i,j;
p = a;
//p = a[0]或&a[0][0]或*(a+0)或a也可以
printf("输出p指针指向的元素:\n");
printf("%4d\n",*p);//1
printf("输出数组中所有的元素:\n");
for(i = 0;i < 2; i++)
{
for(j = 0;j < 2;j++)
{
printf("%4d",*p);
p++;
}
printf("\n");
}
return 0;
}
// 指向数组
#include <stdio.h>
int main()
{
int i,j;
int a[4][9];
//定义一个行指针,并指向数组的首地址
int (*p)[4];// 该语句是定义一个数组指针,指向含4个元素的一维数组
// int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,
// 也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度
p = &a[0];
printf("请输入二维数组中的数组元素:\n");
for(i = 0;i < 4;i++)
{
for(j = 0;j < 4;j++)
{
scanf("%d",p[i]+j);
}
}
printf("输出二维数组中的数据:\n");
for(i = 0;i < 4;i++)
{
for(j = 0;j < 4;j++)
{
printf("%4d",*(p[i]+j));
}
printf("\n");
}
return 0;
}