-
C基础第二天
昨天一天将循环讲完了,今天将数组,上午做了俩节课的循环练习,发现还是基础不牢固,今天的练习就已经做不出了,自己写的运行的结果也不对。需要背代码,最起码要能够自己写出代码。
#if 0
//今年已过的天数
#include <stdio.h>
int main(int argc,char *argv[])
{
int year,month,day,i,sum = 0,count = 0;
printf("请输入年份:");
scanf("%d",&year);
printf("请输入月份:");
scanf("%d",&month);
printf("请输入日期:");
scanf("%d",&day);
int a[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
a[2] = 29;
}
for(i = 1;i < month;i++)
{
sum += a[i];
}
sum += day;
printf("今年过了%d天\n",sum);//今年过了多少天
return 0;
}
##else
//距离指定的日期已经过去的天数
#include <stdio.h>
int main(int argc,char *argv[])
{
int year,month,day,i,sum = 0,count = 0;
printf("请输入年份:");
scanf("%d",&year);
printf("请输入月份:");
scanf("%d",&month);
printf("请输入日期:");
scanf("%d",&day);
int a[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
a[2] = 29;
}
for(i = 1;i < month;i++)
{
sum += a[i];
}
sum += day;
for(i = 1990;i < year;i++)
{
if(i%4 == 0 && i % 100 != 0 || i % 400 == 0)
count++;
}
sum += 365*(year - 1990) + count;
printf("%d\n",sum);//一共过了多少天
return 0;
}
##else
//打印指定月份的日历
#include <stdio.h>
int main(int argc,char *argv[])
{
int year,month,day,i,sum = 0,count = 0;
printf("请输入年份:");
scanf("%d",&year);
printf("请输入月份:");
scanf("%d",&month);
int a[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
a[2] = 29;
}
for(i = 1;i < month;i++)
{
sum += a[i];
}
sum += day;
for(i = 1990;i < year;i++)
{
if(i%4 == 0 && i % 100 != 0 || i % 400 == 0)
count++;
}
sum += 365*(year - 1990) + count;
int week = sum%7;
printf("Mon Thu Wed Tus Fri Sat Sun\n");
for(i = 0;i < week;i++)
{
printf(" ");
}
for(i = 1;i <= a[month];i++)
{
printf("%2d ",i);
if((i + week)%7 == 0)
putchar('\n');
}
return 0;
}
//向数组中输入10个数求出最大值
#include <stdio.h>
int main(int argc,char *argv[])
{
int i,max;
int a[10];
for(i = 0;i < 10;i++)
{
scanf("%d",&a[i]);
if(max < a[i])
{
max = a[i];
}
}
printf("%d\n",max);
return 0;
}
//二维数组赋值
#include <stdio.h>
int main(int argc,char *argv[])
{
int a[3][4];
int i,j;
for(i = 0;i < 3;i++)
{
for(j = 0;j < 4;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i = 0;i < 3;i++)
{
for(j = 0;j < 4;j++)
{
printf("%-2d ",a[i][j]);
}
putchar('\n');
}
return 0;
}
//求平均值
#include <stdio.h>
int main(int argc,char *argv[])
{
int a[3][5] = {{70,75,80,85,90},{90,85,80,75,70},{90,91,92,93,94}};
int i,j,x = 0;
for(i = 0;i < 3;i++)
{
x = 0;
for(j = 0;j < 5;j++)
{
x += a[i][j];
}
printf("%d\n",x/5);
}
return 0;
}
//取100个质数放到数组中
#include <stdio.h>
int main(int argc,char *argv[])
{
int a,c,i = 0;
int arr[20];
for(a = 3;;a++)
{
for(c = 2;c <= a;c++)
{
if(a%c == 0)
break;//跳出所有循环
}
if(c >= a)
{
if(i == 20)
break;
arr[i] = a;
i++;
}
}
for(i = 0;i < 20;i++)
{
printf("arr[%d] = %d\n",i,arr[i]);
}
putchar('\n');
return 0;
}
//数组赋值
#include <stdio.h>
int main(int argc,char *argv[])
{
int i;
int a[5];
for(i = 0;i < 5;i++)
{
scanf("%d",&a[i]);
//a[i] = i;
}
for(i = 0;i < 5;i++)
{
printf("%d ",a[i]);
}
putchar('\n');
return 0;
}
//根据两个具体日期算出过了多少天
#include <stdio.h>
int main(int argc,char *argv[])
{
int year,month,day,year1,month1,day1,i;
int sum = 0;
int sum1 = 0;
int count = 0;
int yearstd = 365;
printf("请输入出生年份:");
scanf("%d",&year1);getchar();
printf("请输入出生月份:");
scanf("%d",&month1);getchar();
printf("请输入出生日期:");
scanf("%d",&day1);getchar();
printf("请输入当前年份:");
scanf("%d",&year);getchar();
printf("请输入当前月份:");
scanf("%d",&month);getchar();
printf("请输入当前日期:");
scanf("%d",&day);getchar();
int a[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
a[2] = 29;
}
for(i = 1;i < month;i++)
{
sum += a[i];
}
sum += day;
printf("%d\n",sum);//今年天数
if(year1 % 4 == 0 && year1 % 100 != 0 || year1 % 400 == 0)
{
a[2] = 29;
yearstd = 366;
}
sum1= 0;
for(i = 1;i < month1;i++)
{
sum1 += a[i];
}
sum1 += day1-1;
printf("sum1 = %d\n",sum1);
sum1 = yearstd - sum1;
printf("%d\n",sum1);
count = 0;
int year2;
for(year2 = year1;year2 < year;year2++)
{
if(year2%4==0 && year2%100!=0 || year2%400==0)
count++;
}
printf("count = %d\n",count);
int add;
add = 365*(year - year1)-yearstd+sum+sum1+count;
printf("已经出生%d天\n",add);
return 0;
}
//打印菱形
#include <stdio.h>
int main(int argc,char *argv[])
{
int n,m1,m2,i,j;
printf("please input a number of rows:");
// fflush(stdin);//提示只能输入数字,可以不加
scanf("%d",&n);
if(n%2 == 0)
{
printf("Error:the number cannot be %d\n",n);
return 0;
}
for(m1 = n/2,m2 = 1;m1;m1--,m2 += 2)
{
for(i = 0;i < m1;i++)
printf(" ");
for(j = 0;j < m2;j++)
printf("*");
printf("\n");
}
while(m2>0)
{
for(i = 0;i < m1;i++)
printf(" ");
for(j = 0;j < m2;j++)
printf("*");
printf("\n");
m1++;
m2 -= 2;
}
return 0;
}
//自幂数
#include <stdio.h>
int main(int argc,char *argv[])
{//自幂数从三位数开始
int num,i = 100,j,k,m,n,sum;
printf("请输入一个数:");
scanf("%d",&num);
while(i < num)
{
j = i;
k = 0;//求出位数
while(j > 0)
{
j /= 10;
k++;
}
j = i;
sum = 0;
while(j > 0)
{
int s = 1;
m = j%10;
n = k;
for(;n > 0;n--)
{
s *= m;
}
j = j/10;
sum += s;
}
if(sum == i)
{
printf("%d\n",i);
}
i++;
}
return 0;
}
在程序设计中,为了方便,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类元素的集合称为数组。数组属于构造类型,数组也可分解为多个数组,这些数组是由基本构造类型构成的。
数组可以分为:数值数组,字符数组,指针数组,结构体数组等。
1:一维数组的定义和引用。
怎样定义一维数组
定义一维数组的一般形式:类型说明符 数组名[常量表达式];
int a[10]; //它表示定义了一个整型数组,数组名为a,此数组有10个整型元素;
float b[10],c[20];
char ch[5];
(1)数组的类型实际上指的是数组元素的类型,数组中的每一个元素都属于同一数据类型,不能把不同类型的数据放在同一数组中;
(2)数组名不能与其他变量名相同;
int main(int argc, char const *argv[])
{
int a;
float a[10];
……
return 0;
}
(3):数组名的书写规则应符合标识符书写规则。
(4):方括号的常量表示数组元素个数
(5):不能在方括号中使用变量来表示元素个数,但是可以使用符号常量和常量表达式;(宏定义)
3.一维数组的引用
数组元素的一般形式为:数组名[下标]
其中下标只能是整型常量或整型表达式。
a[5]
a[i+j]
a[i++]
这些都是合法数组元素
例1
int main(int argc, char const *argv[])
{
int i,a[10];
for ( i = 0; i < 10; ++i)
{
a[i]=i;
}
for ( i = 9; i >= 0; i--)
{
printf("%d\n",a[i]);
}
return 0;
}
例2
int main(int argc, char const *argv[])
{
int i,a[10];
for (int i = 0; i < 10; ++i)
{
a[i]=2*i+1;
}
for (int i = 0; i <=9; ++i)
{
printf("%d\n",a[i] );
}
printf("%d,%d\n",a[5],a[5.8]);
return 0;
}
4.一维数组的初始化
数组的赋值方法除了可以用赋值语句,还可以初始化。
初始化赋值的一般形式:类型说明符 数组名[常量表达式] = {值,值,……,值};
例如:int a[10]={0,1,2,3,4,5,6,7,8,9};//相当于a[0]=0,a[1]=1……a[9]=9;
(1)可以只给部分元素赋值
int a[10]={0,1,2,3,4};
表示只给a[0]~a[5]赋值,其他值默认为0;
(2)只能逐个赋值,不能给数组整体赋值
例:需要给数组中10个元素全部赋1
int a[10]={1,1,1,1,1,1,1,1,1,1};
不能写成 int a[10]=1;
(3)也可以不给出元素的个数,直接给所有元素赋值
例:int a[5]={1,2,3,4,5};
可写成 int a[]={1,2,3,4,5};
注:a[5]={1,2,3,4,5,6};//这是错误的写法,元素个数不能大于下标最大值;
一维数组程序举例:求输入的十个数中的最大值
int main(int argc, char const *argv[])
{
int i,max,a[10];
printf("请输入10个数\n");
for (i = 0; i < 10; ++i)
{
scanf("%d",&a[i]);
}
max=a[0];
for (i = 0; i < 10; ++i)
{
if (a[i]>max)
{
max=a[i];
}
}
printf("max number is %d\n",max);
return 0;
}
5.二维数组的定义
前面介绍的数组只有一个下标,称为一维数组,其数组元素也称为单下标变量。
在实际问题中很多量是二维或多维的,C语言允许构造多维数组。
二维数组定义的一般形式:类型说明符 数组名[常量表达式1][常量表达式2]
其中常量表达式1表示第一维下标的长度,常量表达式2表示第二维下标的度;
例:int a[3][4];//该数组的小标变量一共3*4个
a[0][0],a[0][1],a[0][2],a[0][3]
a[1][0],a[1][1],a[1][2],a[1][3]
a[2][0],a[2][1],a[2][2],a[2][3]
6.二维数组元素的引用
二维数组元素的表达形式为:
数组名[下标][下标]
例:a[3][4]
7.二维数组的初始化
二维数组的可按分段赋值,也可以连续赋值
例如对数组a[5][3]
(1)分段赋值
a[5][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15}};
(2)连续赋值
a[5][3]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
两种赋值结果完全相同
二维数组赋值特别说明:
(1)可以只对部分元素赋值,未赋值元素自动取0值。
例:int a[3][3]={{1},{2},{3}};
是对每行的第一列元素进行赋值,未赋值取零,结果如下
1 0 0
2 0 0
3 0 0
int a[3][3]={{0,1},{0,0,2},{3}};
0 1 0
0 0 2
3 0 0
(2)如果对全部元素进行赋值,则第一维的长度可以不给出
例:int a[3][3]={1,2,3,4,5,6,7,8,9};
可以写为: int a[][3]={1,2,3,4,5,6,7,8,9};
二维数组的初始化:
王 张 李 赵 周
Math 80 61 59 85 76
C 75 65 63 87 77
Chinese 92 71 70 90 85
一个二维数组a[5][3]存放五个人三科成绩,再设一个一维数组v[3]存放所求得各学科平均成绩。
int main(int argc, char const *argv[])
{
int i,j,s=0,average;
int v[3],a[5][3];
printf("请输入成绩\n");
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 5; ++j)
{
scanf("%d",&a[j][i]);
s = s+a[j][i];
}
v[i]=s/5;
s = 0;
}
average = (v[0]+v[1]+v[2])/3;
printf("各科平均成绩 Math:%d,C:%d,Chinese:%d.\n",v[0],v[1],v[2]);
printf("总分的平均成绩为%d\n",average);
return 0;
}