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.
", num);
}else{
printf("%d is in the array, it's index is %d.
", 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++;/*统计元素个数*/
}
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
");
若否 printf("NO
");
int isTriangle(int a[][N], int m)
{
历遍每个数组
判断所需要的位置是否为0;
return 1;
}
代码截图
3.阅读代码