gdpu c语言程序与设计 实验7

Tips:代码不一定最优解,但一般能懂(可能吧),用的是VS2022

1.数组指定位置插入和删除

代码

#include <stdio.h>
int main()
{
	int a[11] = { 1,2,3,4,5,6,7,8,9,0 };
	int x1, n1, n2;
	scanf("%d %d", &x1, &n1);
	scanf("%d", &n2);
	//打印原数组
	int sz = sizeof(a) / sizeof(a[0]);
	for (int i = 0; i < sz; i++)
	{
		printf("%5d", a[i]);
		if (a[i] == 0)
		{
			break;
		}
	}
	printf("\n");
	//打印插入数组
	if (n1 < 11)
	{
		for (int i = sz; i >= n1; i--)
		{
			a[i + 1] = a[i];
		}
		a[n1] = x1;
	}
	else
	{
		a[10] = x1;
    }
	 sz = sizeof(a) / sizeof(a[0]);
	for (int i = 0; i < sz; i++)
	{
		printf("%5d", a[i]);
		
	}
	printf("\n");
	//打印删除数组
	if (n2 < 11)
	{
		for (int i = n2; i <sz; i++)
		{
			a[i] = a[i+1];
			
		}	
	}
	else
	{
		for (int i = 0; i < sz-1; i++)
		{
			a[i] = a[i + 1];
		}
		
	} sz = sizeof(a) / sizeof(a[0]);
	for (int i = 0; i < sz-1; i++)
	{
		printf("%5d", a[i]);
		
	}
	return 0;
}

思路:分三步解决

(1)打印原数组:将数放进数组后再进行打印。

(2)打印插入了x1的数组:如果n1大于十,直接将这个数放进数组最后一位;如果n1小于十,将数组下标为n2之后的数各往后移一位,x1放入数组下标为n1的地方。

(3)打印删除了下标为n2的数组:如果n2的数不合法,将数组里所有的数往前移一位;如果n2的数合法,将该下标之后的数往前移一位。

2.数组顺序查找

s

代码

#include <stdio.h>
int main()
{
	int n = 0, cnt = 1, x = 0, a = 1, sum1 = 0, sum2 = 0;


	scanf("%d", &n);

	int arr[100] = { 0 };

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

	scanf("%d", &x);
	for (int i = n; i > 0; i--)
	{

		if (arr[i] == x&&x!=0)
		{
			cnt = 0;
			printf("%d\n", i);
			break;
		}
		else
		{
			cnt = 1;	
		}
	}
		if (cnt == 1)
		{
			printf("-1\n");
		}
	
		for (int i = 0; i < n; i++)
		{
			if (arr[i] > x)
			{
				sum1++;
			}
			else if (arr[i] < x)
			{
				sum2++;
			}
		}
		printf("%d\n", sum1);
		printf("%d", sum2);
		return 0;
}

思路:首先先遍历一遍数组,看看输入的x在不在数组里,然后再和数组每一个数进行比较,统计大于或小于x的个数。

3.数组元素修改

代码

#include <stdio.h>
int main()
{
	int a[20] = { 81,55,102,84,204,105,56,85,58,202,101,83,104,103,82,201,59,203,57,205 };
	int cnt = 0;
	for (int i = 0; i < 20; i++)
	{
		if (a[i] <= 59)
		{
			a[i] = -1;
		}
		else if (a[i] > 100 && a[i] <=200)
		{
			a[i] = -2;

		}
		else if (a[i] > 200)
		{
			a[i] = -3;
		}

	}
	
	for (int j = 0; j < 20; j++)
	{
		printf("%5d", a[j]);
		cnt += 1;
		if (cnt == 5)
		{
			printf("\n");
			cnt = 0;
		}
	}
	return 0;

}

思路:比前两题简单,只要让每个数对比大小就行,唯一注意就是每五个数换一行。

4.字符个数统计

代码

#include <stdio.h>
void bubble_sort(char arr[], int sz)
{
	for (int i = 0; i < sz-1; i++)
	{
		char tmp = 0;
		for (int j = 0; j < sz-i- i; j++)
		{
			if (arr[j + 1] <= 122 && arr[j + 1] >= 97||arr[j+1]<=57&&arr[j+1]>=48)
			{
				if (arr[j] > arr[j + 1])
				{
					tmp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = tmp;
				}
			}
		}
	}
}
int main()
{
	char arr[80] = { 0 };
	
	char ch = 0, tmp=0;
	int cnt = 0,a=0,i=0,j;
	do 
	{
		ch = getchar();
		arr[cnt++] = ch;
	} while (ch != '\n');
	for (int i = 0; i < cnt; i++)//大写变小写
	{
		a = 0;
		if (arr[i] <= 90 && arr[i] >= 65)
		{
			arr[i] = arr[i] + 32;
		}
	}
	//排序
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);
	
	for(int i=0;i<cnt;i++)
	{
		if ( arr[i] <= 122 && arr[i] >= 97)
	    {
		a = 1;
		for (int j = 0; j < cnt; j++)
		{
			if (arr[j] == arr[i]&&j>i)
			{
				a++;
				arr[j] = '0';

			}
		}

		for (int j = 0; j < cnt; j++)
		{
			if (j == i && arr[j] == arr[i])
			{
				printf("%c is %d\n", arr[j], a);

			}
		}
		}
	}
	return 0;
}

思路:首先将字符串排序,然后将大写改成小写,这样就能abcd这样按顺序统计个数。

5.数组元素共享

代码

while (i < j) {
    while (i < j && !IsPrimer(a[i]))//从左往右找,找到第一个 素数 的下标i
        i++;
    while (i < j && IsPrimer(a[j]))//从右往左找,找到第一个 和数 的下标j
        j--;

    if (i < j)//交换
    {
        a[i] ^= a[j];
        a[j] ^= a[i];
        a[i] ^= a[j];
    }
   
}

思路:额没有(

6.找两个数组中共同元素值问题

z
 代码

#include <stdio.h>
int main()
{
    int n, i, j, s1[10] = { 10,21,34,12,15,8,17,20,23,30 }, s2[10];

    scanf("%d", &n);

    for (i = 0; i < n; i++)

        scanf("%d", &s2[i]);
    for (i = 0; i < 10; i++)
    {
        for (j = 0; j < n; j++)
        {
            if (s1[i] == s2[j])
            {
                printf("%5d", s1[i]);
                s1[i] = 0;
            }
        }
    }
	return 0;

思路:两个数组之间分别比较是否相同。

7.数组循环右移k个位置

代码

#include <stdio.h>
int main()
{
    int a[100], n, k, i, j;

    int tmp;

    scanf("%d", &k);

    scanf("%d", &n);

    for (i = 0; i < n; i++)

        scanf("%d", &a[i]);
    for (i = k; i > 0; i--)
    { tmp = a[n-1];
        for (j = n-1; j > 0; j--)
        {
            a[j] = a[j-1];
        } 
        a[0] = tmp;
    }
        for (i = 0; i < n; i++)

            printf("%3d", a[i]);
    return 0;
}

思路:将数组最后一个存起来,再将每个数后移一位,最后将最后的那个数放到第一个位置上。

8.数组逆序保存

代码

#include <stdio.h>

int main() {

    int a[100], n, i, tmp;

    scanf("%d", &n);

    for (i = 0; i < n; i++)

        a[i] = 2 * i + 1;

    for (i = 0; i < n; i++)

        printf("%3d", a[i]);

    printf("\n");

    for (i = 0; i < n-1; i++)
    { for(int j=0;j<n-i-1;j++)
        if (a[j]<a[j+1])
        {
            tmp = a[j+1];
            a[j + 1] = a[j];
            a[j] = tmp;
        }
    }

        for (i = 0; i < n; i++)

            printf("%3d", a[i]);

    return 0;

}

思路:冒泡排序。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值