C语言学习 杂记(一)
说明:仅仅是个人学习时遇到的问题总结学习记录,如有错误,烦请指出,定当虚心接受!!!请大家多多指点。
(1)三目运算
int main() {
int num;
printf("输入一个数字:");
scanf("%d", &num);
(num % 2 == 0) ? printf("偶数") : printf("奇数");
}
(2)随机函数
int main() {
int a;
srand((unsigned)time(NULL));//重新播种,如果不加这行,数不会变
a = rand();
printf("%d\n", a);
}
(3)输出格式化(对齐)
int main()
{
int a1 = 20, a2 = 345, a3 = 700, a4 = 22;
int b1 = 56720, b2 = 9999, b3 = 20098, b4 = 2;
int c1 = 233, c2 = 205, c3 = 1, c4 = 6666;
int d1 = 34, d2 = 0, d3 = 23, d4 = 23006783;
printf("%-9d %-9d %-9d %-9d\n", a1, a2, a3, a4); //-为向左对齐
printf("%-9d %-9d %-9d %-9d\n", b1, b2, b3, b4);
printf("%-9d %-9d %-9d %-9d\n", c1, c2, c3, c4);
printf("%-9d %-9d %-9d %-9d\n", d1, d2, d3, d4);
return 0;
}
(4)输出格式化
int main() {
int m = 192, n = -943;
float f = 84.342;
printf("m=%10d, m=%-10d\n", m, m); //演示 - 的用法: - 表示左对齐
printf("m=%+d, n=%+d\n", m, n); //演示 + 的用法: + 用于整数或者小数,表示输出的正负号
printf("m=% d, n=% d\n", m, n); //演示空格的用法:输出值为正冠以空格,为负冠以负号
printf("f=%.0f, f=%#.0f\n", f, f); //演示#的用法:# 表示在输出时添加前缀
return 0;
}
(5)关于getche()
int main() {
char c = _getche();//没有缓冲区,输入一个字符立即显示,不用回车控制
printf("\nc:%c\n", c);
char b = getchar();
printf("b:%c\n", b);
}
(5)字符数组
初始化
char str[] = "abdjjaoodhiohiohao"; //字符数组表示字符串
printf("%s\n", string); //通过字符串名字输出字符串
char*str = "abd";
注意:
1、字符数组只能一次性定义,后面想要更改只能逐个添加
2、第二种方式,如果报错,需要改动 项目==> 属性==> C++/C语言 ==> 符合模式,改为否
3、第二种方式的含义是:先新建一个字符串,内容为abd,然后str是一个头指针,指向这个串,但是这个新建串是作为const存在的,不是一个可改的变量,一旦更改其中的值,程序会挂掉
(6)宏定义
使用尖括号< >和双引号" “的区别在于头文件的搜索路径不同:
使用尖括号< >,编译器会到系统路径下查找头文件;
而使用双引号” ",编译器首先在当前目录下查找头文件,如果没有找到,再到系统路径下查找。
#define PI 3.1415926
宏定义是简单的字符串替换,在预编译进行处理
#undef PI //终止作用域,也即是PI的使用在此之上,之下不可用
(7)sizeof 和 strlen
int main() {
int a = 0;
printf("%d", a);
char ch[] = { "abcdefg" };//用sizeof长度为8,因为字符串以\0结束;用strlen长度为7,因为\0作为判断依据,
//strlen一般只能是char* 作为参数
char ch2[] = { 'a','b','c','d','e','f' };//字符串没有\0结束
int num1 = sizeof(ch);
int num2 = sizeof(ch2);
printf("len(num1);%d\t len(num2):%d\t", num1, num2);
printf("\nlen(num1);%d\t len(num2):%d\t", strlen(ch), strlen(ch2));
printf("%d\n", sizeof(int));
}
(8)指针数组
int main() {
int a = 10, b = 900, c = 190;
int* arr[3] = { &a,&b,&c };
int** parr = arr;
printf("%d\t%d\t%d\t", *arr[0], *arr[1], *arr[2]); // 10 900 190
printf("%d\t%d\t%d\t", **parr, **(parr + 1), **(parr + 2)); // 10 900 190
指针数组:一个数组中的所有元素保存的都是指针
(9)结构体
struct stu {
int age;
char* name;
int num;
char group;
float score;
}stu1,stu2;
int main() {
stu1.name = "LiHua";
stu1.age = 18;
stu1.group = 'A';
stu1.num = 8000;
stu1.score = 90;
printf(" %s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", stu1.name,stu1.num, stu1.age, stu1.group, stu1.score);
}
结构体数组
struct{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
}class[] = { //class[5];
{"Li ping", 5, 18, 'C', 145.0},
{"Zhang ping", 4, 19, 'A', 130.5},
{"He fang", 1, 18, 'A', 148.5},
{"Cheng ling", 2, 17, 'F', 139.0},
{"Wang ming", 3, 17, 'B', 144.5}
};
int main(){
int i, num_140 = 0;
float sum = 0;
for(i=0; i<5; i++){
sum += class[i].score;
if(class[i].score < 140) num_140++;
}
printf("sum=%.2f\naverage=%.2f\nnum_140=%d\n", sum, sum/5, num_140);
return 0;
}
结构体指针
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
} stu1 = { "Tom", 12, 18, 'A', 136.5 };
//结构体指针
struct stu *pstu = &stu1;
int main(){
printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", (*pstu).name, (*pstu).num, (*pstu).age, (*pstu).group, (*pstu).score);
printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", pstu->name, pstu->num, pstu->age, pstu->group, pstu->score);
}
>获取结构体成员的两种方式
>1. (*p).memberName
>2. p->memberName
> 结构体指针作为函数参数
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
}stus[] = {
{"Li ping", 5, 18, 'C', 145.0},
{"Zhang ping", 4, 19, 'A', 130.5},
{"He fang", 1, 18, 'A', 148.5},
{"Cheng ling", 2, 17, 'F', 139.0},
{"Wang ming", 3, 17, 'B', 144.5}
};
void average(struct stu *ps, int len);
int main(){
int len = sizeof(stus) / sizeof(struct stu);
average(stus, len);
return 0;
}
void average(struct stu *ps, int len){
int i, num_140 = 0;
float average, sum = 0;
for(i=0; i<len; i++){
sum += (ps + i) -> score;
if((ps + i)->score < 140) num_140++;
}
printf("sum=%.2f\naverage=%.2f\nnum_140=%d\n", sum, sum/5, num_140);
}
(10)枚举
默认从0开始,往后递增1
enum week{ Mon, Tues, Wed, Thurs, Fri, Sat, Sun };
也可以指定值
enum week{ Mon = 1, Tues = 2, Wed = 3, Thurs = 4, Fri = 5, Sat = 6, Sun = 7 };
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };
定义枚举变量
enum week{
Mon = 1,
Tues,
Wed,
Thurs,
Fri,
Sat,
Sun } a, b, c;
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a = Mon, b = Wed, c = Sat;
同一个程序中不能定义同名的枚举类型,不同的枚举类型也不能存在同盟的命名变量
枚举类型的变量赋值
#include<stdio.h>
/* 定义枚举类型 */
enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };
void main()
{
/* 使用基本数据类型声明变量,然后对变量赋值 */
int x, y, z;
x = 10;
y = 20;
z = 30;
/* 使用枚举类型声明变量,再对枚举型变量赋值 */
enum DAY yesterday, today, tomorrow;
yesterday = MON;
today = TUE;
tomorrow = WED;
printf("%d %d %d \n", yesterday, today, tomorrow);
}
(10) typedef
typedef struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} Book;
int main( )
{
Book book;
strcpy( book.title, "C 教程");
strcpy( book.author, "Runoob");
strcpy( book.subject, "编程语言");
book.book_id = 12345;
printf( "书标题 : %s\n", book.title);
printf( "书作者 : %s\n", book.author);
printf( "书类目 : %s\n", book.subject);
printf( "书 ID : %d\n", book.book_id);
return 0;
}