C语言程序设计 练习7-1~7-4

本文分析了去掉break语句后,7-3程序的输出变化,指出在找到匹配元素后不再退出循环的影响,并给出了练习7-2求最大值和下标的正确代码。同时讨论了例7-3数组逆序和例7-4找出不同元素的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

练习7-1 原题:将7-3程序中的break语句去掉,输出结果会有变化吗?假设输入数据不变,输出什么?

我们先来看例7-3中的源码

#include<stdio.h>
int main()
{
	int i,flag,x;
	int a[5];
	printf("Enter 5 integers: ");
	for(i=0;i<5;i++)
	  scanf("%d",&a[i]);
	printf("Enter x: ");
	scanf("%d",&x);
	
	flag=0;
	for(i=0;i<5;i++)
	 if(a[i]==x)
	 {
	 	printf("Index is %d \n",i);
	 	flag=1;
	 	break;
	 }
	if(flag==0)
	 printf("Not Found\n");
	return 0;
}

测试数据:2 9 8 1 9 9
运行结果:1
如果去掉break,说明即使找到了x的下标,程序还是会继续查找,所以输出的结果应该是x的所有下标,注意输出的格式是什么样的就好了。

练习7-2原题:求最大值及其下标。输入一个正整数n(1<n<=10),再输入n个整数,输出最大值及其对应的最小下标,下标从0开始。

代码如下,有误请指出,谢谢!

#include<stdio.h>
int main()
{
	int n,i;
	scanf("%d",&n);//输入一个正整数 
	int a[10];
	for(i=0;i<n;i++)
	scanf("%d",&a[i]);//输入n个整数 
	int max,m;
	max=a[0];m=0;//假设最大值为首项 
	
	for(i=1;i<n;i++)
	{
	   if(a[i]>max)//只要你不放等号就不会改变找到的最大值的下标 
		 {
		   max=a[i];
		   m=i;
	     }
	}
	printf("%d %d\n",max,m);
	return 0;
}

例7-3原题:将数组中的数逆序存放。输入一个正整数n(1<n<=10),再输入n个整数,存入数组a中,先将数组a中的这n个数逆序存放,再按顺序输出数组a中的n个元素。

代码如下,有误请指出,谢谢!

#include<stdio.h>
int main()
{
	int n,i;
	scanf("%d",&n);//输入一个正整数 
	int a[10];
	for(i=0;i<n;i++)
	  scanf("%d",&a[i]);//输入n个整数 
	
	int k,index,temp;//选择排序法 
	for(k=0;k<n-1;k++)
	{
		index=k;
		for(i=k+1;i<n;i++)
		  if(a[i]>a[index])
		    index=i;//找出最大的数的下标,不能在这里改变数组里的元素 
		temp=a[index];
		a[index]=a[k];
		a[k]=temp;
	}
	for(i=0;i<n;i++)
	printf("%d ",a[i]);
	printf("\n");
	return 0;
}

例7-4原题:找出不是两个数组共有的元素。输入一个正整数n(1<n<=10),再输入n个整数,存入第一个数组中;然后输入一个正整数m(1<m<=10),再输入m个整数,存入第二个数组中,找出所有不是这两个数组共有的元素。

从 inooll 博主摘来的代码加上我的一些解释:

#include <stdio.h>
int main()
{
    int str1[20], str2[20], str3[40];//第一行,第二行,要输出的
    int len1, len2, len3;//长度
    int i, j;
    int temp = 0, num = 0;
    scanf("%d", &len1);//输入第一行,len1=n 
    for (i = 0; i < len1; i++)
        scanf("%d", &str1[i]);
    scanf("%d", &len2);//输入第二行,len2=m 
    for (i = 0; i < len2; i++)
        scanf("%d", &str2[i]);
    
    for (i = 0; i < len1; i++)//找出第一行与第二行不同的数字
    {
        for (j = 0; j < len2; j++)
            if (str1[i] == str2[j])
                break;
        //若第一行有和第二行相同的数字,循环结束 
        if (j == len2)//说明第一行的数字在第二行里没找到 
        {
            str3[temp] = str1[i];//把这个数存入第三个数组中 
            temp++;
        }
    }
    
    for (i = 0; i < len2; i++) //找出第二行与第一行不同的数字
	{
		for (j = 0; j < len1; j++)
			if (str2[i] == str1[j])
			    break;

		if (j == len1) 
		{
			str3[temp] = str2[i];
			temp++;
		}
	}
	
    for (i = 0; i < temp; i++)//第三个数组里 
    {
        for (j = 0; j < i; j++)//有可能一行中有相同的数字 且另一行不存在垓数字,注意不能重复输出
			if (str3[i] == str3[j])
			    break;//如果第三个数组里的某个元素 和前面的元素相同,则跳到某个元素的下一个元素 
        if (i == j)//如果不相同,则输出这个元素 
        {
            if (num != 0)
			  printf(" ");//控制空格的输出(不是第一项就加个空格) 
			printf("%d", str3[i]);
			num++;//第三个数组的项数 
        }
    }
    return 0;
}

7-4学到了学到了

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值