作业解析以及数组

文章展示了C语言中数组的使用,包括一维和二维数组的创建、初始化、遍历以及在内存中的存储。还涵盖了循环控制、函数参数传递、指针操作、计数及求和等基本编程概念。此外,文章还讨论了冒泡排序和二分查找等基础算法的应用。
摘要由CSDN通过智能技术生成

目录

作业 

数组


作业 

  1. 求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;
    }
  2. 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;
    }
                                             
  3. 计算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;
    }
  4. 求十个整数最大值。     
    #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;
    }

  5. 打印乘法口诀表。
    #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;
    }

  6.  二分查找有序数组一个数。   
    #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;
    }

  7. 猜数字游戏。 
    #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;
    }
          
  8. 函数return只能返回一个数。
  9. 数组传参(虽然形式是传递数组这种写法是可以的,但是本质是传递地址,所以也可以写成地址形式)
  10. 函数设计尽量高内聚低耦合(高内聚:函数尽量相对独立;低耦合:元素之间联系相对较少,依赖较少);尽可能少使用全局变量。高内聚:指的是模块内部各个元素的关系。模块的内聚反映模块内部元素联系的紧密程度。主要是指一个模块内部是由相关性很强的代码组成,该模块只负责一个任务,即常说的单一职责原则。 例如系统中存在A、B两个模块进行交互,如果修改了A模块,不影响B模块的工作,反之,修改了B模块也不影响A模块工作,即A、B模块都各司其职,那么我们就认为A模块有足够的内聚。低耦合:指的是模块间的关系。A模块与B模块存在依赖关系,当A模块发生改变时,B模块仍然可以正常工作,那么就认为A与B是低耦合的。
  11. main()函数位置可以任意放置,在库函数后面也可以。
    int main() {
    	printf("abcdefg");
    	return 0;
    }
    #include <stdio.h>

  12. 在不同函数里可以使用相同名字的变量。函数中形参在栈中保存。栈区存储临时变量(局部变量,函数的形参);堆区存储动态内存分配的;静态区存储的是静态变量,全局变量。

  13. 复合语句:函数中的中的{}就是复合语句。

  14. 写一个函数实现九九乘法表。

数组

  1. 数组部分学习内容:                                                                             
  2. 数组是一种相同类型的集合。一维数组创建方式:   
  3. c99标准之前不支持变长数组,c99中增加了变长数组。msvc编译器不支持变长数组,gcc编译器支持变长数组。变长数组不支持初始化。 
  4. 数组创建同时给一些初始值叫初始化(完全初始化(数组元素等于数组长度,绝对不可以大于),不完全初始化(数组元素小于数组长度,剩余元素默认初始化为0))int arr[10]={0}//表示数组内部只有10个元素       
  5. 数组可以初始化时候不写数组长度,数组内部元素个数就是最初初始化元素个数。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

  6. 数组不初始化时候内部存放的是随机值。  
  7. 一维数组的使用:[],就是下标引用操作符操作符,它就是数组访问的操作符。数组的下标从0开始,依次往后+1。                                      
  8.  打印数组里所有的元素:                                                                    
    	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);
    	}
  9. 一维数组在内存中的存储。每个地址之间差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]);
    	}
  10.  整型指针加一跳过一个跳过一个整型(4字节),整型指针解引用是一个整型。字符指针加一跳过一个跳过一个字符型(1字节),解引用是一个字符型。   
  11. 二维数组的创建:(前面的[]里是行,后面的[]里是列) 
  12. 二维数组的初始化:(完全初始化,不完全初始化)
  13.   二维数组的访问:                           
    	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");
    	}

  14.  二维数组在内存中存储:(地址是连续的)                                                
  15.   数组越界                      
        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
    	}
    -------------------------------------------------------------------------------------------
    
  16. 数组传参:传递的不是整个数组而是数组首元素的地址。数组传参的元素个数必须在外部求好以后再传入,函数内部求不到元素个数。根据数组首元素地址在函数内部获取到整个数组。      
  17. 冒泡排序:两两相邻元素进行比较,如果有可能,则有可能交换。 (此处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;
    }

  18.   数组名是什么?数组名是首元素地址但是有两种特殊情况。                                                                                                                             &arr是数组的地址,arr是数组首元素地址;两者是不同的。&arr+1跳过整个数组地址,arr+1跳过一个类型地址。        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值