P165
练习7-1的第一问:有,结果只能输出一个下标,但输入数据中可能会有两个需查找的值
#include<stdio.h>//例7-3
#define N 10
int main(void)
{
int i,n,x,flag;//flag 的作用是为了方便输出找不到的情况,需要放到循环外面
int a[N];
printf("Enter n(1<=n<=10),x:");
scanf("%d%d",&n,&x);
printf("输入%d个整数:",n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
flag=0;//是否有下标的判断标准,默认没有,有则改变,不等于0即可
for(i=0;i<n;i++)
{
if(x==a[i]){
printf("下标为:%d\n",i);
flag=1;//有,则不需要输出Not,改变flag
// break; //这里不能加break;否则 只能查找到一个下标,但输入数据中可能有两个或多个满足条件的元素
}
}
if(flag==0){
printf("Not Found!\n");
}
return 0;
}
练习7-2到7-4
#include<stdio.h>
int main(void)
{
/*求最大值及其下标(练习7-2)*/{
int n,a[10],i,max;
printf("Enter n:");
scanf("%d",&n);
printf("Enter %d numbers:",n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
max=0;
for(i=0;i<n;i++)
{
if(a[i]>a[max]){
max=i;
}
}
printf("max=%d,min_index=%d\n\n",a[max],max);}
/*将数组中的数逆序存放(练习7-3)*/{
int n,i,t,j;
int a[10];
printf("Enter n:");
scanf("%d",&n);
printf("Enter %d numbers:",n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);//存放
}
i=0;
j=n-1;
while(i<j){//逆序
t=a[j];
a[j]=a[i];
a[i]=t;
i++;
j--;
}
for(i=0;i<n;i++)
{
printf("%4d",a[i]);
}
printf("\n\n");}
/*找出不是两个数组共有的元素(练习7-4)*/
int i,j,k,m,n;
int a[10],b[10],c[20];
printf("Enter n:");
scanf("%d",&n);
printf("Enter %d numbers:",n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
printf("Enter m:");
scanf("%d",&m);
printf("Enter %d numbers:",m);
for(j=0;j<m;j++)
{
scanf("%d",&b[j]);
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)//用a的元素分别与b的元素比较,共n*m次
{
if(a[i]==b[j]){//如果a中的元素与b中的元素相等,就跳出内循环
break;
}
}
if(j>=m){//正常比较了m次,但没有相等的,就把a中这个的元素 放到数组c中存起来
c[k]=a[i];
k++;//记录有几个不相等的
}
}
for(i=0;i<m;i++)//外循环为m,内循环为n
{
for(j=0;j<n;j++)//用b中的元素去和a中的比较
{
if(b[i]==a[j]){//如果相等就跳出内循环
break;
}
}
if(j>=n){//如果b中第一个元素与a中每个元素都比较了,但没有找到相等的就把这个b中的元素存到数组c中
c[k]=b[i];
k++;//累计不相等的
}
}
printf("两个数组的非共有元素:\n");
for(i=0;i<k;i++)
{
printf("%4d",c[i]);//此输出满足非共有元素输出
}
return 0;
}
P172
练习7-5:原本3行2列,改后输出2行3列。
练习7-6(1):将for的外循环改为列循环,内循环改为行循环,即外j内i。
(2):相比较与遍历上/下三角,把判断条件if去掉,直接实现交换,再将输出改为先列后行。
练习7-7正确,练习7-8只可参考,不完全正确
#include<stdio.h>
#define K 13
int main(void)
{
/*矩阵运算(练习7-7)*/
/* int n,i,j,sum=0;
int a[6][6];
printf("Enter n:");
scanf("%d",&n);
printf("Enter %d numbers:\n",n*n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
sum+=a[i][j];//求矩阵中所以数的和
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==n-1)//减去最后一行
{
sum-=a[i][j];
}
else if(j==n-1){//减去最后一列
sum-=a[i][j];
}
else if(i+j==n-1){//减去副对角线
sum-=a[i][j];
}
}
}
printf("sum=%d\n\n",sum);
/*方阵循环右移(练习7-8)*///暂时保留,此程序m的值无论为多少,最后的结果都是一样的
int m,n,i,j,t,k;//按照课本上的公式推,m=2,得到3 1 2,其他人的参考过程需要得到2 3 1,为三角形循环转动两次得到
int a[6][6],b[6][6]={0};//按照课本上的公式推,m=1,得到 2 3 1,三角形循环得到 3 1 2
printf("Enter n,m:");
scanf("%d%d",&n,&m);
printf("Enter %d numbers:\n",n*n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
m=m%n;//防止出现m=n或m>n的情况。若m=n,则是一个完整的循环,输出数列位置不变;若m>n,则移动位数为m%n,即余。
for(i=0;i<n;i++)//用循环解答,三阶就用三角形,四阶就用正方形,按一定顺序,从小到大转
{
for(j=1;j<=m;j++)
{
t=a[i][n-1];//n=3,m=2时,第一遍 3,第二遍2,第三遍为第二行最后一个6,然后是5,接着是第三行9,最后是8
for(k=n-2;k>=0;k--)
{
a[i][k+1]=a[i][k];//后一项被前一项覆盖,到倒数第二项 第一遍2覆盖3,1覆盖2,行列式第一行为3 1 2,
}// 第二遍1覆盖2,3覆盖1,行列式第一行为2 3 1,为所求行列式第一行
a[i][0]=t; //t的作用就是把每次最后的那个值保留,然后存到最前面
}
}
/* for(i=0;i<n;i++)//此部分程序不正确,不管m的值为多少,输出结果都是一个,2 3 1或2 3 4 1
{
if(j==0){//如果是第一列,就和最后一列交换 ,用三阶方阵举例,m=1,第一行输入1 2 3
t=a[i][j];
a[i][j]=a[i][n-1];//此处将1和3交换,行列式第一行改变为:3 2 1
a[i][n-1]=t;
}//第一列和最后一列交换后,最后一列变为第一列
for(j=0;j<n-1;j++)//再从第一列开始,到倒数第二列 ,依次与右边相邻的列交换
{
t=a[i][j];
a[i][j]=a[i][j+1];//此处将3和2交换,行列式第一行改变为:2 3 1,为最终所要得到的排列
a[i][j+1]=t;
}
}*/
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%4d",a[i][j]);
}
printf("\n");
}
return 0;
}
练习7-9
#include<stdio.h>//例7-10,练习7-9
#define K 13
int day_of_year(int year,int month,int day)
{
int i,leap,k;//tab[leap][k],leap=0 非闰年
int tab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};//k的值为13,因为有12个月,所以tab[2][0]=0;
leap=((year%4==0&&year%100!=0)||year%400==0);//计算leap=0还是=1
for(k=1;k<month;k++)//k本来是从0开始的,但为了更方便计算,从1月份开始到是12月份
{
day=day+tab[leap][k];//第month个月的几天+前几个月每个月的天数
}
return day;//得到一年中第几天
}
int main(void)
{
int year,month,day;
printf("Enter year,month,day:");
scanf("%d%d%d",&year,&month,&day);
printf("上述时间是%d年第%d天",year,day_of_year(year,month,day));
return 0;
}
P180、181
练习7-10
#include<stdio.h> //练习7-10 查找特定字符
int main(void)
{
char str[80],ch;
int i,index=0;
printf("输入一串字符:\n");
gets(str);
printf("输入需查找的字符:\n");
ch=getchar();
for(i=0;str[i]!='\0';i++)
{
if(ch==str[i]){
index=i;
}
}
printf("ch=%c,index=%d",str[index],index);
return 0;
}
练习7-11
#include<stdio.h>//练习7-11 字符串逆序
#include<string.h>
int main(void)
{
char str1[80],str2[80];
int i,j,t,len=0;
gets(str1);
/*用while循环求字符串长度,两个数组实现逆序*/
i=0;
while(str1[i]!='\0'){
i++;
}
j=0;
i=i-1;
for(i=i;i>=0;i--){
str2[j]=str1[i];
j++;
}
str2[j]='\0';
puts(str2);
/*调用函数求字符串长度,单个数组内部交换实现逆序*/{
i=strlen(str1);
j=0;
i=i-1;
while(i>j){
t=str1[i];
str1[i]=str1[j];
str1[j]=t;
j++;
i--;
}
puts(str1);}
return 0;
}