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

| 这个作业属于哪个班级 | C语言--网络2011/2012 |
| ---- | ---- | ---- |
| 这个作业的地址 | C博客作业04--数组 |
| 这个作业的目标 | 学习数组相关内容 |
| 姓名 | 曹卉潼 |

0.展示PTA总分(0----2)


1.本章学习总结(3分)

1.1 学习内容总结

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

  • 1.遍历法
    从数组中的第一个数一直检索到数组的最后一个数,如果找到用户想要的那个数据就提前退出。
int num[6]={1,2,3,4,5,6};  //数组num;
int x;//用户想要找的数据;
输入用户想要找的数据x
for i=0 to 5
   if x的值和num[i]的值相等
        输出该数字在数组中的下标i的值
        break
   end if
end for
if i>=6 //没有找到用户需要的数字;
   输出"not find"
end if
  • 2.二分查找法
    适用于已经按照大小顺序排列好的一组数据。其做法为:找出左边界和右边界,并找出中间元素与所找数据进行比较,如果相等则找出,若不相等,则根据大小判断其中一个边界换为中间元素的上一个元素或下一个元素,继续查找,直到找出或最终也没找到。
int a[10]={10,9,8,7,6,5,4,3,2,1};//有序数组;
int x ;//用户输入的数;
int m ;//找到的数所在的下标;

输入用户想要寻找的数;

int low = 0//数组第一位开始,左界下标;
int high = n-1//从数组的最后一位开始,右界下标;
int mid; //中间位置;

while(low<=high)
    mid = (low+high)/2;
    if  x==a[mid]
       说明找到x的位置,break跳出循环;
    else if x小于a[mid]
       改变查找范围:low=mid+1;
    else  x大于a[mid]
       改变查找范围:high=mid-1;
    end if
end while
if low<=high //表示找到x的位置;
    输出该值下标   
else //表示没有找到x的位置
    输出"not found"
end if

数组中如何插入数据

按照一定大小顺序寻找所要插入所给数据的位置,插入后将其后数据均向右移动一个位置,插入后的数组元素也是该顺序。

int num[N] ;
int n;//插入数据的个数;
int data;//插入的数据

输入数据个数n;
for i=1 to n
   输入数据,赋给num[i];
end for
输入插入的数据data;
for i=0 to n
    if data<=num[i]
       for j=n to i   //插入后,将后面的元素往右移一位;
           num[j]=num[j-1]
       end for
       break;//退出循环;
    end if
end for
插入数据data,num[i]=data;
输出数组

数组中如何删除数据

1.从要删除的数开始到数组末尾,让数组前一位等于后一位,即数组左移,直接覆盖要删除的数字,还要考虑数组下标的特别情况

例如:删除数字字符

2.重新定义一个数组,重新存放除要删除的数据之外的所有数据

例如:A-B

数组中目前学到排序方法

  • 选择排序(从大到小排序)
    在未排序的n个元素中找到最大值,将它与a[0]交换;在剩下的n-1个元素中找到最大值,将它与a[1]交换;......在剩下未排序的2个元素中找到最大值,将它与a[a-2]交换。
#include<stdio.h>
int main()
{
	int n, i, j, t;
	int a[11];
	scanf("%d", &n);
	
	for(i = 0;i < n;i++)
		scanf("%d",&a[i]);
		
	for(i = 1;i < n;i++)
	{
		for(j = 0;j < n - i;j++)
		{
			if(a[j] < a[j + 1])
			{
				t = a[j];
				a[j] = a[j + 1];
				a[j + 1] = t;
			}
		}
	}
	for(i = 0;i < n;i++)
	{
		if(i < n - 1)
			printf("%d ", a[i]);
		else
			printf("%d\n", a[n - 1]);
	}
	return 0;
}
  • 冒泡排序
    从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素。然后用同样的方法对前N−1个元素进行第二遍扫描。依此类推,最后只需处理两个元素,就完成了对N个数的排序。

    例如:

数组做枚举用法

  • 1.调查节目受欢迎程度
  • 2.寻找重复数据

哈希数组用法(有重复数据)

以空间换时间,设计辅助数组hash[],其下标为数组元素,数组初值为0;输入一个数n,判断hash[n]是否为1,若为1,则重复

int static hash[]={0};
for i=1 to n;
    输入一个数data;
    if hash[data]==1
       有重复数据
       return 0;
    else
       hash[data]=1;
    end if
end for
return 1;

字符数组、字符串特点及编程注意事项

| 字符串的输入 | 注意点 |
| ---- | ---- | ---- |
| scanf("%s",数组名) | 该输入方式不能输入空格 |
| (str[i]=getchar()) !='\n' | 需要加上结束标志str[i]='\0' |
| fgets(数组名,数组长度,,stdin) | 可输入任何字符 |

| 字符串的输出 |
| ---- | ---- |
| putchar(str[i]) |
| printf("%s",数组名) |
| puts(数组名) |

2.PTA实验作业

2.1 数组循环左移

2.1.1 伪代码

用代码渲染符号```渲染伪代码。注意:伪代码不是翻译代码,必须是代码+中文文字描述。
数据处理可以用C语言符号介绍。具体参考看课件!!!

void  ArrayShift(int a[], int n, int m);//将循环左移功能分装成函数实现
int main()
{
    int n, m;//n为数组长度,m为移动次数
    int i,a[MAX];//i为数组下标
    数组元素输入;
    调用循环左移函数ArrayShift(a, n, m);
    左移后数组元素输出;
}
void ArrayShift(int a[], int n, int m);
{
  for k=1 to m
    for i=1 to n-1
        数组左移一个位置
        第一个数放在最后一个位置
    end for
end for
}

2.1.2 代码截图

贴图展示代码,不要复制。

2.1.3 找一份同学代码(尽量找思路和自己差距较大同学代码)比较,说明各自代码特点。

#include <stdio.h>
int main()
{
    int n, m, a[110];
    int i;
    scanf("%d %d", &n, &m);
    for(i=0; i<n; i++)
        scanf("%d", &a[i]);
    //8 3
    //1 2 3 4 5 6 7 8
    //4 5 6 7 8 1 2 3
    m %= n;
    if(n == m)
    {
        for(i=0; i<n; i++)
        {
            if(i == 0)
            printf("%d", a[i]);
            else
            printf(" %d", a[i]);
        }
    }
    else
    {
        for(i=m; i<n; i++)
        {
        if(i == m)
            printf("%d", a[i]);
        else
            printf(" %d", a[i]);
        }
        for(i=0; i<m; i++)
        printf(" %d", a[i]);
    }
}

2.2 找鞍点

2.2.1 伪代码

for i=0 to n 
   for j=0 to n
       输入该数组元素;
   end for
end for
   if n==1
      输出特殊情况"0 0"
   end if
for i=0 to n
   for j=1,temp=a[i][0] to n
      if temp<a[i][j]
         temp=a[i][j];//找出一行的最大值存入temp
      end if
   end for
   for j=0 to n
     if temp==a[i][j]//有可能每行有多个元素的值等于最大
        l=j;   //固定该列
	for h=0,f=0;h to n//判断该元素是否为该列最小
             if(temp>a[h][l])
                 f++;//是鞍点的标志
              end if
         end for
     end if
   end for
if !f
   是鞍点,输出
end for
   输出"NONE";       

2.2.2 代码截图



2.2.3 请说明和超星视频做法区别,各自优缺点。


超星视频中分装成函数来做,思路差不多都是想找出每行的最大元素在锁定该元素所在列找出最小值是否为该元素。老师的做法更高效,代码更简洁,可读性更高。我的看上去乱了些,循环多有些不好读懂。。

2.3 切分表达式

选择切分表达式这题介绍字符数组。

2.3.1 伪代码

定义字符型数组;
输入数组数据;	
	while ch[i]!='\0'
if ch[i]>='0'&&ch[i]<='9' //判断数字
   temp=i;
while  ((ch[i]>='0'&&ch[i]<='9')||ch[i]=='.')&&ch[i]!='\0'
    i++; 
for j=temp to i
        输出ch[j]
      end for
        输出"\n"
	i--;
end if
else if ch[i]=='-'  //判断负号 
 if(ch[i-1]>='0'&&ch[i-1]<='9'||ch[i+1]==')')
        输出- //作为运算符 
 else 
        输出-//作为负数 
end if
else if ch[i]=='+'//判断加号 
  if i==0 输出"+"
  else 输出"+\n"
end if
else 输出ch[i]
   i++;
       end while

2.3.2 代码截图


2.3.3 请说明和超星视频做法区别,各自优缺点。



超星视频中分装了函数,程序运行更高效,更简单可读性高。

posted @ 2020-12-13 22:11  SmileCHT  阅读(55)  评论(0编辑  收藏  举报