PTA 练习7-4 练习7-8 练习7-11

练习7-4
题目要求:
给定两个整型数组,本题要求找出不是两者共有的元素。
代码如下:

#include<stdio.h>
#include<math.h>

int main(void){
   	int i,j,k=0,n1,n2,temp,flag;
   	int a3[25];
	scanf("%d",&n1);   //输入第一串 
	int a1[n1-1];
	for(i=0;i<n1;i++){
		scanf("%d",&a1[i]);
	} 
	scanf("%d",&n2);   //输入第二串 
	int a2[n2-1];
	for(i=0;i<n2;i++){
		scanf("%d",&a2[i]);
	} 
	for(i=0;i<n1;i++){ //第一个数组与第二组比对。 
		temp=a1[i];
		flag=0;        //flag=0表示未遇到相同数字,=1是遇到了。 
		for(j=0;j<n2;j++){
			if(temp==a2[j]){
				flag=1;   //遇到相同了。 
				break;
			}			
		}
		if(flag==0){      //遇到不同。 
			a3[k]=temp;
			k++;
		} 
	}
	for(i=0;i<n2;i++){  //第二组与第一组比对 
		temp=a2[i];
		flag=0;
		for(j=0;j<n1;j++){
			if(temp==a1[j]){
				flag=1;   //遇到相同了。 
				break;
			}			
		}
		if(flag==0){      //遇到不同。 
			a3[k]=temp;
			k++;
		} 
	}
	printf("%d",a3[0]);   //输出第一个不同数。 
	for(i=1;i<k;i++){
		flag=0;
		for(j=0;j<i;j++){  //只要当前数字与前边的数字没有重复,就可以输出。 
			if(a3[i]==a3[j]){
				flag=1;
				break;
			}	
		}
		if(flag==0){
			printf(" %d",a3[i]);
		}
	}
   	return 0;
}

本题思路:
1、先正常输入第一串第二串数组。再建一个数组用来接收一二组里不同的数字。
2、分别以第一组,第二组来与另一组作比对。不相同的数字,存入第三个数组。
3、第三组进行自检,思路是当前数字与前边的不重复就输出。

练习7-8
题目要求:
本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0、1、⋯、n−1列变换为第n−m、n−m+1、⋯、n−1、0、1、⋯、n−m−1列。
代码如下:

#include<stdio.h>
#include<math.h>

int main(void){
	int n,m,i,j;
	int a[6][6];
	scanf("%d %d",&m,&n);
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			scanf("%d",&a[i][j]);
		}
	}
	m%=n;
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			printf("%d ",a[i][(n-m+j)%n]);
		}
		printf("\n");
	}
    return 0;
}

本题思路:
1、必须要找到规律,首先输入时,数组输入是从0开始的。本题中也无需更改每个数字在二维数组中的位置。只需要打印的时候选择合适的打印出来。
2、m%=n很重要,循环了多次相当于这样。
3、找到(n-m+j)%n很重要,学会分析。

练习7-9
题目要求:
本题要求编写程序计算某年某月某日是该年中的第几天。
代码如下:

#include<stdio.h>
#include<math.h>

int main(void){
	int y,u,d,i,sum=0;
	int flag=0;   //flag=0非闰年,flag=1为闰年。
	scanf("%d/%d/%d",&y,&u,&d);
	if(y%4==0&&y%100!=0||y%400==0){
		flag=1;
	} 
	int m[12];
	m[0]=31;m[1]=28;m[2]=31;m[3]=30;
	m[4]=31;m[5]=30;m[6]=31;m[7]=31;
	m[8]=30;m[9]=31;m[10]=30;m[11]=31;
	m[12]=29;
	for(i=0;i<u-1;i++){
		sum=sum+m[i]; 
	}
	sum=sum+d;
	if(flag==1&&u>2){
		sum++;
	}
	printf("%d",sum);
    return 0;
}

本题思路:
1、输入月份天数的方法比较蠢。不知道有没有更简单的方法,留以后更新。
2、首先判断是否是闰年,之后sum用来加和,注意一点,比如说求4月8号的天数,只有前三个月是过满了的,4月只有8天不要忘掉。

练习7-10
题目要求:
本题要求编写程序,从给定字符串中查找某指定的字符。输入的第一行是一个待查找的字符。第二行是一个以回车结束的非空字符串(不超过80个字符)。
代码如下:

#include<stdio.h>
#include<math.h>

int main(void){
	int i=0,j;
	char ch[80];
	char temp,aim;
	int index=90;
	scanf("%c\n",&aim);
	do{
		scanf("%c",&temp);
		ch[i]=temp;	
		i++;
		if(temp=='\n')
		  break;
	}while(i<80);
    for(j=0;j<i;j++){
    	if(aim==ch[j]){
    		index=j;
    	}
    }
    if(index==90){
    	printf("Not Found");
    }
    else{
    	printf("index = %d",index);
    }
    return 0;
}

本题思路:
1、遇到的问题是:之前我的代码是这样的:

scanf("%c",&aim);
	do{
		scanf("%c",&temp);
		ch[i]=temp;	
		i++;
		if(temp=='\n')
		  break;
	}while(i<80);

这样会导致一个问题,在我输出完目标函数时,按下回车,程序会判定循环结束而无法向字符串输入数据。后边改一下第一个输入就解决了。scanf("%c\n",&aim);

2、scanf()里要加&!!!!!!

练习7-11
题目要求:
输入一个字符串,对该字符串进行逆序,输出逆序后的字符串。
代码如下:

#include<stdio.h>
#include<math.h>

int main(void){
	int i,n=0;
	char temp=0;
	char c[80];
	while((c[n]=getchar())!='\n'){
		n++;
	}
	for(i=n-1;i>=0;i--){
		printf("%c",c[i]);
	}
    return 0;
}

本题思路:
1、不必将字符串逆置,只需逆序输出就好。
2、学会使用getchar(),尤其是与while组合如本题这句话:

while((c[n]=getchar())!='\n')

意思是getchar()赋值给c[n],并且这个字符不为换行符时进行循环。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值