Loading...

C语言博客作业04--数组

0.展示PTA总分


1.本章学习总结

数组中如何查找数据,有哪些做法

  • 顺序查找(遍历查找)
    从一个给定数组中查找一个数字
 #include <stdio.h>
int main(){
    int nums[10] = {1, 10, 6, 296, 177, 23, 0, 100, 34, 999};
    int i, num, thisindex = -1;
   
    printf("Input an integer: ");
    scanf("%d", &num);
    for(i=0; i<10; i++){
        if(nums[i] == num){
            thisindex = i;
            break;
        }
    }
    if(thisindex < 0){
        printf("%d isn't  in the array.\n", num);
    }else{
        printf("%d is  in the array, it's index is %d.\n", num, thisindex);
    }
    return 0;
}
  • 二分查找
 #include <stdio.h>
 #include <stdlib.h>
 #define N 100
int Found(int a[N],int key);
int main()
{
	int a[N] = { 1,2,3,4,5,6,7,8,9,10 };
	int i;
	int key;
	int loc;

	scanf("%d", &key);
	loc = Found(a,key);
	if (loc == -1)
	{
		printf("not found");
	}
	else
	{
		printf("weizhi:%d",loc);
	}

}
int Found(int a[N],int key)
{
	int left;
	int right;
	int mid;

	left = 0;
	right = 9;
	while (left <= right)
	{
		mid = (left + right) / 2;/*从最中间的那个数开始查找,并将mid作为保留下标*/
		if (key == a[mid])return mid;
		else if (key < a[mid])right = mid - 1;/*由于数组按顺序排列,比较大小之后便可以判断左加还是右加*/
		else left = mid + 1;

	}
	return -1;
}

数组中如何插入数据,怎么做,可以写个伪代码或动态图展示方法

#include<stdio.h>
int main()
{
	int a[10];**定义一个数组用来存放被插入的数组**
	int num;**要插入的数字**
	int n;**输入数字的个数**
	int X;**需要插入的数组**
	int min;
	int temp;数组之间的交换所需的变量
	int m;
	int loc;


	scanf("%d", &n);
	for (历遍数组)
		**输入需要插入的数字**
	**输入需要插入的数字**
	for (历遍数组)
	{
		if (需要插入的数字大于数组中的元素)
			**执行下一次循环**

		else
		若需要插入的数字小于数组中的元素
                将x的值与数组中的值进行交换
		跳出循环
	}
	if (对最后一个数与x相比较)
	{
		用loc保存下标
	}
	a[loc] = X;
	for (历遍数组)
	{
		**输出重置后的数组**
	}
	return 0;
}

数组中如何删除数据,这个有多种做法,请一一展示。

  • 平移数组
 #include<stdio.h>
 #define N 10
void main( )
{
int a[N] , num ,i , *p , n=N;
int j;
/*输入N个数到数组a中;*/
for(i=0;i<n;i++)
{
scanf(“%d”,&num);
a[i]=num;
}
/*在数组a中删除指定的数num;*/
for(i=0;i<n;i++)
{
if(a[i] == num)
{
for(j=i;j<n-1;j++)
a[j]=a[j+1];
n--;
}
}
/*输出删除了num后的数组a;*/
for(i=0;i<n;i++)
printf("%d ",a[i]);
getchar();
}
  • 重置数组
    类似于pta中的重复字符的删除
#include<stdio.h>
int main()
{
	char a[80];/*原数组*/
	char b[80];/*重置所需要的新数组*/
	char min;
	int i;
	int j;
	int k=0;
	int cnt = 0;
	int n=0;
	while ((a[n] = getchar()) != '\n')
	{
		n++;/*统计元素个数*/
	}
	for (i = 0; i < n; i++)
	{
		for (j = i+1; j < n; j++)
		{
			if (a[i] == a[j])break;/*判断是否有重复*/
		}
		if (j == n)
		{
			b[k] = a[i];/*若无重复,将值赋给重置数组*/
			k++;
		}
	}
	for (i = 0; i < k; i++)/*对重置数组进行按照字符ASCII码顺序从小到大排序后输出*/
	{
		for (j = i + 1; j < k; j++)
		{
			if (b[i] > b[j])
			{
				min = b[j];
				b[j] = b[i];
				b[i] = min;

			}
		}
	}
	for (i = 0; i < k; i++)
	{
		printf("%c", b[i]);
	}
	return 0;
}

数组中目前学到排序方法

  • 选择法
for (i = 1; i < n; i++)
	for (j = i+1; j < n ; j++)
		if (条件)
			交换
  • 冒泡排序法
   for(i=1;i<n;i++)
	for(j=0;j<n-i;j++)
		if(条件)
			交换

哈希数组用法

  • 有重复的数据I
#include<stdio.h>
#define N 10
void Move(int a[], int m,int n);
int main()
{
	int a[100001];
	int b[100001]={0};
	int n;
	int i;
	int j;

	scanf("%d", &n);
	for (i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
        

	}
	
	for (i = 0; i < n; i++)
	{
		b[a[i]]++;
		if (b[a[i]] > 1)
		{
			printf("YES");
			return 0;
		}
	}
	printf("NO");
	return 0;
}

1.2 本章学习体会

我感觉对于现在来说和我们刚刚学习C语言的时候有很大不同,现在学习的知识点越来越对,结合的也越来越紧密,而且题目的代码量也越来越多,因此,我要开始慢慢改变自己的思路,在写出题目的同时,多阅读分析别人与自己不同的代码,拓宽自己的思路。这就要求我们对每个知识点的理解都要到位,这样才能打好基础,为以后的C语言学习奠定基础,当然最重要的还是不停的练习。

2.PTA实验作业

2.1求整数序列中出现次数最多的数

最终正确的做法是这样的

#include<stdio.h>
#define N 1000
int main()
{
	int n;
	int i;
	int j;
	int max;存储最大值
	int m;
	static int b[N];辅助数组
	int a[N];
	scanf("%d", &n);
	for 历遍数组
	输入数组a[i]
	for 嵌套循环
	       if并历遍数组找出是否有相同的数
			
		b[i]++;若有在另一个数组中加一
			
		
	
	 先将b[0]赋给最大值
	for (历遍数组)
	{
		if (数组b[i]是否大于max)
		{
			若是,记录最大值和下标
		}
	}
	输出
	
}


一开始出现答案错误就是方法不正确,其实是辅助数组越界了,但是答案能够出来,但是运行到最后就显示数组越界
代码是这样的

#include<stdio.h>
#define N 10000
int main()
{
	int n;
	int i;
	int j;
	int max;
	int m;
	int b[N] = { 0 };
	int a[N];
	scanf("%d", &n);
	for (i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
	}
	for (i = 0; i < n; i++)
	{
		b[a[i]]++;
	}
	max = b[0];
	for (j = 0; j < n-1; j++)
	{
		if (b[j] < b[j + 1])
		{
			max = b[j + 1];
			m = j + 1;
		}
	}
	printf("%d %d", m,max);
}

这个代码相当于是用了老师上课讲过的一个方法,就是找出现最多数字的方法,数字出现一次,就在另一个数组中的那个数字的下标位置加一,但是这题需要考虑的数字存在负数,这就导致了辅助数组越界,报错。

输入数据 输出数据 说明
5 1 2 2 3 4 2 2
5 1 3 3 3 2 3 3

2.2出生年

int judgeA(int y, int n);定义函数用来判断年份数字是否相同
int main()
{
	
	用一个变量先存放年份的值
	while (进入循环)
	{
		if (判断函数返回值)
		{
			若为整数,输出年份差和年份
			跳出循环
		}
		else 年份递增
	}
	return 0;
}
int judgeA(int y, int n)
{
	存放在数组中
    if (判断年份是否是四位数)若不是,直接令a[0]++
	do
	{
		令年份所在的各位数字对印的下标数组++
		移除各位数字
	} while (年份不等于零);
	for (历遍数组)
	{
		if (若a[i]>0)即出现过这个数字
		{
			count++;
		}
	}
	if (若count的数字等于n)即所有数字都不一样
	{
		返回 1;
	}
	else return 0;
}

代码截图


输入数据 输出数据 说明
3000 4 12 3012
2019 3 67 0300
1988 4 25 2013
错误原因一开始由于惯性思维直接按顺序写代码,直接写出一个怕判断年份数字是否相同的代码就写不下去了,但是在判断的基础上还需要构造年份的递增,还要进行输出的判断,其实想了很久,才想到要用函数的方法,并利用返回值来作为判断的依据,若返回值不为正数,直接 对年份进行连加

2.3判断上三角矩阵

伪代码

#include<stdio.h>
#define N 10
int isTriangle(int a[][N],int m);
     嵌套循环
读入数组
		
		if(函数返回值不为0)printf("YES\n");
		若否 printf("NO\n");

int isTriangle(int a[][N], int m)
{
           历遍每个数组
			判断所需要的位置是否为0;
	
	return 1;
}

代码截图

3.阅读代码




posted @ 2019-11-17 22:18  孤海  阅读(297)  评论(0编辑  收藏  举报