• 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.
    ", 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.阅读代码




  • 相关阅读:
    dgango
    django
    pymysql 增删改 查 索引
    mysql 单表,多表,符合条件,子查询
    mysql 数据的增删改
    mysql foreignkey
    mysql基础知识之数据类型与约束
    MySol序
    MySql
    Python Selenium 常用方法总结
  • 原文地址:https://www.cnblogs.com/lmh123/p/11878712.html
Copyright © 2020-2023  润新知