删除数组中的奇数(C语言)

编程软件VS2019,用文件读取的方式读入数组的元素,数组大小没有确定

目录

1.创建一个新项目,控制台应用

2.将多余代码删除

知识点1:

3.在项目文件里创建一个文本文档,里面写数组最大长度和一组数据,以便后续读取

4.加上头文件,以只读的方式打开读取的文件

知识点2:

知识点3:

5.从文件里读取数组的最大长度MAXSIZE,这里我们定义的是100 

知识点4:    

6.动态分配数组空间,初始化数组

知识点5:

 知识点6:

7.将数据读入数组中 

8.编写自定义函数打印删除前的数组

9.删除奇数

10.再次调用自定义函数,打印删除后的数组

源代码


 1.创建一个新项目,控制台应用

2.将多余代码删除

知识点1:

为防止出现图片上的错误,在第一行加上#define _CRT_SECURE_NO_WARNINGS

3.在项目文件里创建一个文本文档,里面写数组最大长度和一组数据,以便后续读取

这里数组最大大小为100,文件里实际只有9个数据,后续会处理这个问题

将文件另存为ANSI格式

4.加上头文件,以只读的方式打开读取的文件

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	FILE* fp;	//创建一个文件指针,在打开文件时必须先定义一个文件指针
	fp = fopen("in.txt", "r");    //以只读的方式打开in.txt文件
    
    fclose(fp);    //释放文件指针
}

知识点2:

注意fopen和fclose是成对出现的,成对出现的还有new和delete、malloc和free等

知识点3:

(1)打开文件的函数fopen()形式参数有两个,第一个是文件路径,第二个是打开文件的方式 

(2)如果成功地打开一个文件, fopen()函数返回文件指针,   否则返回空指针 (NULL)。

由此可判断文件打开是否成功

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main()
{
	FILE* fp;	//创建一个文件指针,在打开文件时必须先定义一个文件指针
	fp = fopen("in.txt", "r");    //以只读的方式打开in.txt文件
    if(fp == NULL)    //文件打开失败
    {
        printf("打开文件失败");
        exit(0);    //退出程序,需加上<stdlib.h>头文件
    }

    fclose(fp);
}

5.从文件里读取数组的最大长度MAXSIZE,这里我们定义的是100 

#include <stdio.h>
#include <stdlib.h>


int main()
{
	FILE* fp;	//创建一个文件指针,在打开文件时必须先定义一个文件指针
	fp = fopen("in.txt", "r");    //以只读的方式打开in.txt文件
	if (fp == NULL)		//文件打开失败
	{
		printf("文件打开失败");
		exit(0);	//退出程序,需加上<stdlib.h>头文件
	}

	int size;
	fscanf(fp, "MAXSIZE=%d", &size);	//scanf格式化输入,fscanf从文件进行格式化输入

	fclose(fp);		//释放文件指针
}

知识点4:    

文件读入函数fscanf(),第一个参数是文件指针,后两个参数使用与scanf类似。函数作用就是从文件指针stream指向的文件中,按format中对应的控制格式读取数据,并存储在agars对应的变量中

int fscanf(FILE*stream, constchar*format, [argument...]);

6.动态分配数组空间,初始化数组

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main()
{
	FILE* fp;	//创建一个文件指针,在打开文件时必须先定义一个文件指针
	fp = fopen("in.txt", "r");    //以只读的方式打开in.txt文件
	if (fp == NULL)		//文件打开失败
	{
		printf("文件打开失败");
		exit(0);	//退出程序
	}

	int size;
	fscanf(fp, "MAXSIZE=%d", &size);	//scanf格式化输入,fscanf从文件进行格式化输入
	
	int* pa = (int*)malloc(sizeof(int) * size);		//用malloc动态分配内存,记得free释放
	memset(pa, -1, size);	//初始化数组,将数组元素全部赋值为-1,
    
    free(pa);    //释放指针
	fclose(fp);		//释放文件指针
}

知识点5:

(1)静态数组,只能用常量定义数组大小

#define SIZE 10
int a[SIZE];

(2)动态数组,可以用变量size定义数组大小。用malloc在堆里分配内存空间,malloc返回void*类型,用强制类型转换为int*

int size = 10;
int* pa = (int*)malloc(sizeof(int) * size)
//c++的方式:int* pa = new int[size];

*(pa + 5) = 100;    //用指针来操作动态数组
pa[5] = 100;    //用下标来操作动态数组

free(pa);
//c++的方式:delete[] pa; 

 知识点6:

用malloc分配的内存一般用memset()初始化。memset函数用于对一段内存空间全部设置为某个字符,第一个参数是内存地址,第二个是赋的值,第三个是内存的长度

7.将数据读入数组中 

	//前面代码已经省略

    int* pa = (int*)malloc(sizeof(int) * size);		//用malloc动态分配内存
	memset(pa, -1, size);	//初始化数组,将数组元素全部赋值为-1

	for (int i = 0; i < size; i++)
	{
		if (fscanf(fp, "%d", pa + i) == EOF)	//将文件里的数字存入数组,pa+i还可以写为&pa[i]。EOF的值为-1
		{
			size = i;	//10个元素,size为9,size为下标
			break;
		}
	}
	
    free(pa);
	fclose(fp);		//释放文件指针
}

8.编写自定义函数打印删除前的数组

void PrintArray(int arr[], int size)
{
	for (int i = 0; i < size; i++)
	{
		if (arr[i] == -1)	//-1表示此数组已经到头
			break;
		printf("%d ", arr[i]);
	}
}

 调用函数

	//前面的代码省略
    for (int i = 0; i < size; i++)
	{
		if (fscanf(fp, "%d", pa + i) == EOF)
		{
			size = i;	//10个元素,size为9,size为下标
			break;
		}
	}

	//打印删除前的数组
	PrintArray(pa, size);

    free(pa);
	fclose(fp);		//释放文件指针
}

9.删除奇数,打印删除后的数组

	//前面代码已省略

    //打印删除前的数组
	PrintArray(pa, size);

	//删除奇数(拷贝偶数)
	int j = 0;
	for (int i = 0; i < size; i++)
	{
		if (pa[i] % 2 == 0)
		{
			pa[j] = pa[i];    //可以将a[j]看作另一个数组,将偶数放入另一个数组
			j++;    //放一个偶数,下标才+1
		}
	}

	free(pa);
	fclose(fp);		//释放文件指针
}

打印删除后的数组

	//前面代码已省略

    //打印删除前的数组
	PrintArray(pa, size);

	//删除奇数(拷贝偶数)
	int j = 0;
	for (int i = 0; i < size; i++)
	{
		if (pa[i] % 2 == 0)
		{
			pa[j] = pa[i];    //可以将a[j]看作另一个数组,将偶数放入另一个数组
			j++;    //放一个偶数,下标才+1
		}
	}

    //打印删除后的数组
	PrintArray(pa, size);

	free(pa);
	fclose(fp);		//释放文件指针
}

此时运行代码,发现后面的元素不对,我们得将后面的元素赋值为-1,使它们不被打印出来

//将后面的元素赋值为-1
	for (; j < size; j++)    //进入循环时j为偶数的个数
	{
		pa[j] = -1;
	}

10.再次调用自定义函数,打印删除后的数组

	//将后面的元素赋值为-1
	for (; j < size; j++)
	{
		pa[j] = -1;
	}

	//打印删除后的数组
	PrintArray(pa, size);

	free(pa);
	fclose(fp);		//释放文件指针
}

 源代码

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void PrintArray(int arr[], int size);

int main()
{
	FILE* fp;	//创建一个文件指针,在打开文件时必须先定义一个文件指针
	fp = fopen("in.txt", "r");    //以只读的方式打开in.txt文件
	if (fp == NULL)		//文件打开失败
	{
		printf("文件打开失败");
		exit(0);	//退出程序,需加上<stdlib.h>头文件
	}

	int size;
	fscanf(fp, "MAXSIZE=%d", &size);	//scanf格式化输入,fscanf从文件进行格式化输入
	
	int* pa = (int*)malloc(sizeof(int) * size);		//用malloc动态分配内存
	memset(pa, -1, size);	//初始化数组,将数组元素全部赋值为-1

	for (int i = 0; i < size; i++)
	{
		if (fscanf(fp, "%d", pa + i) == EOF)	//将文件里的数字存入数组,pa+i还可以写为&pa[i]。EOF的值为-1
		{
			size = i;	//10个元素,size为9,size为下标
			break;
		}
	}

	//打印删除前的数组
	PrintArray(pa, size);

	//删除奇数(拷贝偶数)
	int j = 0;
	for (int i = 0; i < size; i++)
	{
		if (pa[i] % 2 == 0)
		{
			pa[j] = pa[i];	//可以将a[j]看作另一个数组,将偶数放入另一个数组
			j++;	//放一个偶数,下标才+1
		}
	}

	//将后面的元素赋值为-1
	for (; j < size; j++)
	{
		pa[j] = -1;
	}

	//打印删除后的数组
	PrintArray(pa, size);

	free(pa);
	fclose(fp);		//释放文件指针
}

void PrintArray(int arr[], int size)
{
	for (int i = 0; i < size; i++)
	{
		if (arr[i] == -1)	//-1表示此数组已经到头
			break;
		printf("%d ", arr[i]);
	}
	printf("\n");
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值