练习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],并且这个字符不为换行符时进行循环。