电商专业学习嵌入式软件开发第六十三天

  • 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;
 }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容