原ide用的VScode,但是在个别函数的使用如scanf使用时只能用VScode特定的c++兼容c语言的scanf的特殊写法,不太喜欢,暂时换成了VC++6.0
后来将ide换成了notepad++ ,配合cmd指令使用,新建文件再使用printf时发现打印中文为乱码,解决方案如下,新建文件编码改为ANSI码
1.数据类型
整型 | 实型 | 字符型 | 数组类型 | 共用体类型 | 空类型 |
int | float | char | [ ] | unvoid | void |
short | double | 枚举类型 | 结构体类型 | 指针类型 | |
long | enum | struct | * |
2.占位符 %+
d | 十进制整数 |
c | 单个字符 |
s | 多个字符 |
f | 小数,指定位数,&-m.nf |
x | 16进制输出 |
p | 内存地址16进制输出,运算符& |
示例代码
#include <stdio.h>
int main()
{
char a = '#';
printf("a的内存地址是%p\n",&a);//012FFABB
return 0;
}
3.运算和强转
int aa = 10;
int bb = 3;
float result = (float)aa / bb;
printf("%f\n", result);
printf("%f\n", (float)21 / 20);
4.其它输入输出方式
除了printf和scanf两种函数,还有put和get方法
puts跟printf的区别
1.自动加入换行符
2.仅能输出字符串
char c;
puts("请输入一个字符");
c = getchar();
puts("你输入的字符是");
putchar(c);
5.已经有了基础的知识了,那么直接上实战
一 大小写字母转换
首先可以知道,每个字符对应ANSI码,如 a=97,b=98,A=65,B=66 ,大小写相差32:
char a = 'a';
char b = 'b';
char A = 'A';
char B = 'B';
printf("a=%d,b=%d,A=%d,B=%d\n",a,b,A,B);
//a=97,b=98,A=65,B=66 ANSI码
所以可以写一个简易的大小写转化程序:
char c;
char d;
printf("请输入一个小写字母\n");
scanf("%c",&c);
d = c - 32;
printf("你输入的小写字母是%c\n",c);
printf("对应大写字母是%c\n",d);
学习了 putchar() 和 getchar() ,发现有更简单的实现方法:
putchar(getchar() - 32);
以此延伸,把上述两种方法结合,分别小写改大写,大写改小写:
char c;
char d;
puts("请输入一个小写字母\n");
scanf("%c",&c);
d = c - 32;
printf("你输入的小写字母是%c\n",c);
printf("对应大写字母是%c\n",d);
puts("请输入一个大写字母,将为您改为小写\n");
putchar(getchar() + 32);
运行发现问题 ,首先puts不需要额外加换行符,其次getchar根本没给我输入机会,直接生成了字符,可能是getchar直接吸收了上面打完scanf后的回车导致的,这里采用加一个getchar()来吸收回车的方式:
char c;
char d;
puts("请输入一个小写字母");
scanf("%c",&c);
d = c - 32;
printf("你输入的小写字母是%c\n",c);
printf("对应大写字母是%c\n",d);
puts("请输入一个大写字母,将为您改为小写");
getchar();
putchar(getchar() + 32);
二 求最小公倍数
#include<stdio.h>
int main()
{
int a;
int b;
int c;
puts("分别输入两个数");
scanf("%d%d",&a,&b);
printf("你输入的数为%d和%d\n",a,b);
if(a>b){
c = a;
}
else{
c = b;
}
while(c%a != c%b)
{
c++;
}
printf("%d",c);
return 0;
}
三 制作一个简易的计算器
scanf函数连续使用%c被跳过:用” %f%c%f “时%c会直接被读为回车,所以输入完一个data1后不需要按回车,直接输入想输入的字符即可。
#include<stdio.h>
int main()
{
int data1;
int data2;
char character;
int result1;
char continue_y_or_n = 'y';
while(continue_y_or_n == 'y')
{
//请输入算式
printf("请输入算式\n");
scanf("%d%c%d",&data1,&character,&data2);
printf("你输入的算式为%d%c%d\n",data1,character,data2);
switch (character)
{
case '+':
result1 = data1 + data2;
break;
case '-':
result1 = data1 - data2;
break;
case '*':
result1 = data1 * data2;
break;
case '/':
result1 = data1 / data2;
break;
default:
printf("请输入正确的运算符\n");
continue;
}
printf("结果为%d\n",result1);
getchar();//吸取输入算式后输入的enter键
puts("是否继续,是请输入y,否则输入其它");
scanf("%c",&continue_y_or_n);
}
return 0;
}
6.数组
一维数组:
简明:
格式:int a[10] = {1,2,3,4,5,6};
第七到十的值都默认是 0
创建一个长度为10的数组,自动使得每个值比对应的下标大100,输出所有元素及其地址
#include<stdio.h>
int main(){
int a[10];
int index;
for(index = 0;index < 10;index++){
a[index] = index + 100;
}
for(index = 0;index < 10;index++){
printf("a[%d] = %d , address: %p\n",index,a[index],&a[index]);
}
return 0;
}
结果
a[0] = 100 , address: 000000000061FDF0
a[1] = 101 , address: 000000000061FDF4
a[2] = 102 , address: 000000000061FDF8
a[3] = 103 , address: 000000000061FDFC
a[4] = 104 , address: 000000000061FE00
a[5] = 105 , address: 000000000061FE04
a[6] = 106 , address: 000000000061FE08
a[7] = 107 , address: 000000000061FE0C
a[8] = 108 , address: 000000000061FE10
a[9] = 109 , address: 000000000061FE14
或者另一种定义方式
int arr[] = {5,8,2,3,9,1,0};
int size;
size = sizeof(arr)/sizeof(arr[0]);
printf("arr的长度为:%d",size);
实战:斐波那契数列(Fibonacci sequence)
a[n] = a[n-1] + a[n-2]
0,1,1,2,3,5,8,13,..........
其中0,1手动填入
#include<stdio.h>
int main(){
int fb[30] = {0,1};
int i,arr_size;
arr_size = sizeof(fb)/sizeof(fb[0]);
printf("%d\n",fb[0]);
printf("%d\n",fb[1]);
for(i = 2;i < arr_size;i++){
fb[i] = fb[i-1] + fb[i-2];
printf("%d\n",fb[i]);
}
return 0;
}
二维数组:
#include<stdio.h>
int main(){
int arr[2][3] = {{2,3,4},{3,4,5}};
int i,j;
for(i = 0;i<2;i++){
for(j = 0;j<3;j++){
printf("此二维数组的第%d行%d列的数值为%d\n",i+1,j+1,arr[i][j]);
}
}
return 0;
}
其它定义方式:可以不写行,但是必须定义列,可以自动生成行数
\t :制表符
int arr1[3][4] = {1,2,3};
int arr2[3][4] = {{1},{2},{3}};
int arr3[3][4] = {{1},{5,6}};
int arr4[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int i,j,arr_size;
arr_size = sizeof(arr4)/sizeof(arr4[0]);
for(i = 0;i<arr_size;i++){
for(j = 0;j<4;j++){
printf("%d\t",arr4[i][j]);
}
putchar('\n');
}
数组 | arr1 | arr2 | arr3 | arr4 |
结果 | 1 2 3 0 0 0 0 0 0 0 0 0 | 1 0 0 0 2 0 0 0 3 0 0 0 | 1 0 0 0 5 6 0 0 0 0 0 0 | 1 2 3 4 5 6 7 8 9 10 11 12 |