目录
作业
- 求a的值。
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { int a = 0, b = 0; for ( a = 1,b=1; a <=100; a++) { if(b>=20) break; if (b % 3 == 1) { b += 3; continue; } b = b - 5; } printf("%d\n", a);//8 return 0; }
- 1-100中出现多少个包含9的数字。
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main()//1-100之间有多少个9 { int count = 0; for (size_t i = 1; i < 101; i++) { if (i % 10 == 9) { count++; } if (i / 10 == 9) { count++; } } printf("%d\n", count);//20 return 0; } ----------------------------------------------------------------------------------------- #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { int count = 0; for (int i =1; i < 101; i++) { if ((i % 10 == 9) || (i / 10 == 9)) { count++; } } printf("%d\n", count);//19 return 0; }
- 计算1/1-1/2+1/3-1/4+......+1/99-1/100的值,打印结果。
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main()//计算1+1/2+....1/100 { double sum = 0.0; for (int i = 1; i <= 100; i++) { printf("%lf\n", (1.0 / i)); sum += (1.0 / i); } printf("%lf\n",sum); return 0; } ----------------------------------------------------------------------------------------- #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { double sum = 0.0; double jian = 0.0; double jia = 0.0; for (int i = 1; i <= 100; i++) { if (i % 2 == 0) { jian += (1.0 / i); } else { jia += (1.0 / i); } sum = jia - jian; } printf("%lf\n",sum); return 0; } ----------------------------------------------------------------------------------------- #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { double sum = 0; int flag = 1; for (size_t i = 1; i < 101; i++) { sum += flag*(1.0 / i); flag = -flag; } printf("%lf\n", sum); return 0; }
- 求十个整数最大值。
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { int arr[] = { 1,2,3,4,5,6,27,8,9,19 };//全为正数时候 int max = 0; for (int i = 0; i < 10; i++) { if (arr[i] > max) { max = arr[i]; } } printf("%d\n", max);//27 return 0; } ------------------------------------------------------------------------------------------- #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() {//不同符号数都可以判断 int arr[] = { -1,-6,-8,9,77,-55,9,0,56,-7 }; int max = arr[0]; for (size_t i = 1; i <=9; i++) { if (arr[i] > max) { max = arr[i]; } } printf("%d", max);//77 return 0; }
- 打印乘法口诀表。
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { for (size_t i = 1; i < 10; i++) { for (size_t j = 1; j <=i; j++) { printf("%d*%d=%-2d ", i, j, i * j); } printf("\n"); } return 0; }
- 二分查找有序数组一个数。
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int k = 7; for (size_t i = 0; i <10; i++) { if (arr[i] == k) { printf("找到了,下标是%d", i); break; } } return 0; } ------------------------------------------------------------------------------------------- #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int k = 7; int left = 0; int right = sizeof(arr) / sizeof(arr[0]); while (left<=right) { int mid = (left + right) / 2; if (arr[mid]<k) { left += 1; }else if (arr[mid] > k) { right -= 1; } else { printf("找到了,下标是%d", mid); break; } } if (left > right) { printf("找不到了"); } return 0; }
- 猜数字游戏。
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> void menu() { printf("-----------------------------\n"); printf("-----------1.play------------\n"); printf("-----------0.exit -----------\n"); printf("-----------------------------\n"); } void game(int x) { int suiji=rand()%100+1; //printf("%d",suiji); while (1) { printf("请输入您猜测的数字(0-100):"); scanf("%d", &x); if (suiji < x) { printf("猜大了\n"); } else if (suiji > x) { printf("猜小了\n"); } else { printf("猜中了\n"); break; } } } int main() { srand((unsigned int)time(NULL)); menu(); int n = 0; int a = 0; printf("请输入:"); scanf("%d", &n); switch (n) { case 0: printf("退出游戏\n"); break; case 1: printf("开始游戏\n"); /*printf("请输入您猜测的数字(0-100):"); scanf("%d", &a);*/ game(a); break; } return 0; }
- 函数return只能返回一个数。
- 数组传参(虽然形式是传递数组这种写法是可以的,但是本质是传递地址,所以也可以写成地址形式)
- 函数设计尽量高内聚低耦合(高内聚:函数尽量相对独立;低耦合:元素之间联系相对较少,依赖较少);尽可能少使用全局变量。高内聚:指的是模块内部各个元素的关系。模块的内聚反映模块内部元素联系的紧密程度。主要是指一个模块内部是由相关性很强的代码组成,该模块只负责一个任务,即常说的单一职责原则。 例如系统中存在A、B两个模块进行交互,如果修改了A模块,不影响B模块的工作,反之,修改了B模块也不影响A模块工作,即A、B模块都各司其职,那么我们就认为A模块有足够的内聚。低耦合:指的是模块间的关系。A模块与B模块存在依赖关系,当A模块发生改变时,B模块仍然可以正常工作,那么就认为A与B是低耦合的。
- main()函数位置可以任意放置,在库函数后面也可以。
int main() { printf("abcdefg"); return 0; } #include <stdio.h>
-
在不同函数里可以使用相同名字的变量。函数中形参在栈中保存。栈区存储临时变量(局部变量,函数的形参);堆区存储动态内存分配的;静态区存储的是静态变量,全局变量。
-
复合语句:函数中的中的{}就是复合语句。
-
写一个函数实现九九乘法表。
数组
- 数组部分学习内容:
- 数组是一种相同类型的集合。一维数组创建方式:
- c99标准之前不支持变长数组,c99中增加了变长数组。msvc编译器不支持变长数组,gcc编译器支持变长数组。变长数组不支持初始化。
- 数组创建同时给一些初始值叫初始化(完全初始化(数组元素等于数组长度,绝对不可以大于),不完全初始化(数组元素小于数组长度,剩余元素默认初始化为0))int arr[10]={0}//表示数组内部只有10个元素
- 数组可以初始化时候不写数组长度,数组内部元素个数就是最初初始化元素个数。int arr[]={0}//表示数组内部只有一个元素
char arr1[] = { 'a','b','c' }; char arr2[] = "abc"; printf("%d\n", sizeof(arr1));//3 printf("%d\n", sizeof(arr2));//4 printf("%d\n", strlen(arr1));//未知 printf("%d\n", strlen(arr2));//3 //sizeof考虑\0,但是strlen不考虑\0
- 数组不初始化时候内部存放的是随机值。
- 一维数组的使用:[],就是下标引用操作符操作符,它就是数组访问的操作符。数组的下标从0开始,依次往后+1。
- 打印数组里所有的元素:
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数公式 for (size_t i = 0; i < sz; i++) { printf("%d\n", arr[i]); } ------------------------------------------------------------------------------------------- int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数公式 for (size_t i = 0; i < sz; i++) { int* parr = &arr[i]; printf("%p\n", parr); } ------------------------------------------------------------------------------------------- int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数公式 for (size_t i = 0; i < sz; i++) { int* parr = &arr[i]; scanf("%d", parr); printf("%d\n", *parr); }
- 一维数组在内存中的存储。每个地址之间差4 (小地址就是低地址,大地址就是高地址) 一个地址代表一个字节
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int len = sizeof(arr) / sizeof(arr[0]); for (size_t i = 0; i < len; i++) { printf("%p\n", &arr[i]); }
- 整型指针加一跳过一个跳过一个整型(4字节),整型指针解引用是一个整型。字符指针加一跳过一个跳过一个字符型(1字节),解引用是一个字符型。
- 二维数组的创建:(前面的[]里是行,后面的[]里是列)
- 二维数组的初始化:(完全初始化,不完全初始化)
- 二维数组的访问:
int arr1[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 }; for (size_t i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { printf("%d ", arr1[i][j]); } printf("\n"); }
- 二维数组在内存中存储:(地址是连续的)
- 数组越界
int arr[10] = { 0 }; for (size_t i = 0; i <10; i++) { arr[i] = i; } for (size_t j = 0; j < 10; j++) { printf("%d\n", arr[j]);//0 1 2 3 4 5 6 7 8 9 } -------------------------------------------------------------------------------------------
- 数组传参:传递的不是整个数组而是数组首元素的地址。数组传参的元素个数必须在外部求好以后再传入,函数内部求不到元素个数。根据数组首元素地址在函数内部获取到整个数组。
- 冒泡排序:两两相邻元素进行比较,如果有可能,则有可能交换。 (此处sizeof(arr)求出的是指针的大小;此处sizeof(arr[0])求出的是数组第一个元素的大小)
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> //升序 void sort(int arr[],int len) { for (size_t i = 0; i < len-1; i++) { for (size_t j = 0; j < len-1-i; j++) { if (arr[j]>arr[j+1]) { int tmp = 0; tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } } } int main() { int arr[10] = { 3,5,2,9,8,11,1,4,88,99 }; int sz = sizeof(arr) / sizeof(arr[0]); sort(arr,sz); int i = 0; for (size_t i = 0; i < 10; i++) { printf("%d\n", arr[i]); } return 0; }
- 数组名是什么?数组名是首元素地址但是有两种特殊情况。 &arr是数组的地址,arr是数组首元素地址;两者是不同的。&arr+1跳过整个数组地址,arr+1跳过一个类型地址。