视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
C语言编程练习之数组
2025-09-26 22:00:51 责编:小OO
文档
1.输出整数各位数字

本题要求编写程序,对输入的一个整数,从高位开始逐位分割并输出它的各位数字。

输入格式:

输入在一行中给出一个长整型范围内的非负整数。

输出格式:

从高位开始逐位输出该整数的各位数字,每个数字后面有一个空格。

输入样例:

123456

输出样例:

1 2 3 4 5 6 

    (1)编程思路。

将一个非负整数number各位上的数字依次分离出来,其操作步骤为:

1)分离出number的个位数,即number%10。

2)将number除以10,作为新的number,即新的number丢掉了个位数。

3)如果number等于0,分离完毕,结束。否则,转第1)步,继续显示。

例如,number=1234,number%10=4, number=1234/10=123,得到数字4;

                      number%10=3, number=123/10=12,得到数字3;

number%10=2, number=12/10=1,得到数字2;

number%10=1, number=1/10=0,得到数字1;结束。

    将分离的各位数字依次存储到数组a中,然后逆序输出数组a中保存的各元素值即可。

    (2)源程序。

#include

int main()

{

   long long n;

   scanf("%lld",&n);

   int a[20]={0},cnt=0;

   while (n!=0)

   {

       a[cnt++]=n%10;

       n=n/10;

   }

   if (cnt==0)

       printf("0 \\n");

   else

   {

for (int i=cnt-1;i>=0;i--)

          printf("%d ",a[i]);

       printf("\\n");

   }

   return 0;

}

2.冒泡法排序

将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素。然后用同样的方法对前N−1个元素进行第二遍扫描。依此类推,最后只需处理两个元素,就完成了对N个数的排序。

本题要求对任意给定的K(输入格式:

输入在第1行中给出N和K(1≤K输出格式:

在一行中输出冒泡排序法扫描完第K遍后的中间结果数列,数字间以空格分隔,但末尾不得有多余空格。

输入样例:

6 2

2 3 5 1 6 4

输出样例:

2 1 3 4 5 6

    (1)编程思路。

前k趟冒泡排序描述为:

for (i=0;i{

    // 对序列a[0]~a[n-1-i]从头到尾对前后相邻两数进行比较,逆序则交换

for (j=0;j if (a[j]>a[j+1])

        {  t=a[j]; a[j]=a[j+1]; a[j+1]=t;  }

}

    (2)源程序。

#include

int main()

{

   int a[100];

   int n,k;

   scanf("%d%d",&n,&k);

   int i,j,t;

for (i=0;i      scanf("%d",&a[i]);

for (i=0;i for (j=0;j if (a[j]>a[j+1])

        {

           t=a[j]; a[j]=a[j+1]; a[j+1]=t;

        }

   printf("%d",a[0]);

for (i=1;i      printf(" %d",a[i]);

   printf("\\n");

   return 0;

}

3.评委打分

班级里要搞智力竞赛啦!同学们都踊跃参加。进入最后决赛的是10个同学,随着一道道题目的出示,有时是1号选手得分,有时是5号选手得分,每次答对者得10分,最后结果如何呢?

输入格式:

第一行有十个整数,表示十位同学的初始分。第二行一个整数n,表示有n道题竞赛。 接下去有n行,每行有一个数字x,x表示本次可以加分的选手序号(每次答对者得10分)。

输出格式:

10个同学最终的得分值,每两位同学之间有一个空格。

输入样例:

10 0 0 0 10 10 0 0 0 10

3

1

10

1

输出样例:

30 0 0 0 10 10 0 0 0 20

    (1)编程思路。

   定义数组int a[11];,其中a[1]~a[10]分别保存序号为1~10的选手的得分。每次输入本次可以加分的选手序号x后,数组元素a[x]加10分即可。

    (2)源程序。

#include

int main()

{

   int a[11];

   int i;

for (i=1;i<=10;i++)

      scanf("%d",&a[i]);

   int n,k;

   scanf("%d",&n);

for (i=1;i<=n;i++)

   {

      scanf("%d",&k);

      a[k]+=10;

   }

   printf("%d",a[1]);

for (i=2;i<=10;i++)

      printf(" %d",a[i]);

   printf("\\n");

   return 0;

}

4.组合数的和

给定 N 个非 0 的个位数字,用其中任意 2 个数字都可以组合成 1 个 2 位的数字。要求所有可能组合出来的 2 位数字的和。例如给定 2、5、8,则可以组合出:25、28、52、58、82、85,它们的和为330。

输入格式:

输入在一行中先给出 N(1 < N < 10),随后给出 N 个不同的非 0 个位数字。数字间以空格分隔。

输出格式:

输出所有可能组合出来的2位数字的和。

输入样例:

3 2 8 5

输出样例:

330

    (1)编程思路1。

定义数组int a[10];保存输入的N个非0的个位数字,用二重循环组成两位数并求和。

for (i=0;i for (j=0;j      {

          if(i==j) continue;  // 个位数字和十位数字不能取同一个数字

          s=s+10*a[i]+a[j];

}

    (2)源程序1。

#include

int main()

{

   int n;

   scanf("%d",&n);

   int a[10];

   int i,j;

for (i=0;i      scanf("%d",&a[i]);

   int sum=0;

for (i=0;i for (j=0;j     {

        if (j==i) continue;

        sum+=a[i]*10+a[j];

     }

   printf("%d\\n",sum);

   return 0;

}

    (3)编程思路2。

用二重循环

for (i=0;i for (j=i+1;j        {   }

    可以在n个数字中任取两个不同的数字a[i]和a[j],这两个数字可以构成两位数10*a[i]+a[j]或10*a[j]+a[i]。

    (4)源程序2。

#include

int main()

{

   int n;

   scanf("%d",&n);

   int a[10];

   int i,j;

for (i=0;i      scanf("%d",&a[i]);

   int sum=0;

for (i=0;i for (j=i+1;j     {

        sum+=11*(a[i]+a[j]);

     }

   printf("%d\\n",sum);

   return 0;

}

5.数字加密

输入一个四位数,将其加密后输出。方法是将该数每一位上的数字加9,然后除以10取余,做为该位上的新数字,最后将千位和十位上的数字互换,百位和个位上的数字互换,组成加密后的新四位数。例如输入1257,经过加9取余后得到新数字0146,再经过两次换位后得到4601。

输入格式:

输入在一行中给出一个四位的整数x,即要求被加密的数。

输出格式:

在一行中按照格式“The encrypted number is V”输出加密后得到的新数V。

输入样例:

1257

输出样例:

The encrypted number is 4601

    (1)编程思路。

    直接按加密方法进行顺序处理即可。

    (2)源程序。

#include

int main()

{

   int x,a,b,c,d,v;

   scanf("%d",&x);

   a=((x/1000)+9)%10;

   b=((x%1000/100)+9)%10;

   c=((x%100/10)+9)%10;

   d=((x%10)+9)%10;

   v=1000*c+100*d+10*a+b;

   printf("The encrypted number is %04d\\n",v);

   return 0;

}

6.找不同 

这是一个签到题,非常简单。一群网友在网上在玩游戏,看谁是最与众不同的,每一个人都单独写一个数字,然后依次上交,谁的数据没有和其他人重复,谁就赢了,如果有很多人都与众不同,那么第一个做到的才是真正的与众不同。

输入格式:

输入是一个测试用例,首先给出网友个数N,之后依次给出N个正整数,给出的正整数和N都不超过10的5次方。

输出格式:

对每一组输入,输出与众不同的那个数,如果没有,输出None。

输入样例1:

在这里给出一组输入。例如:

8 1 2 3 4 4 5 3 1

输出样例1:

在这里给出相应的输出。例如:

2

输入样例2:

在这里给出一组输入。例如:

8 1 2 3 4 4 3 2 1

输出样例2:

在这里给出相应的输出。例如:

None

    (1)编程思路。

定义数组int num[100000];保存输入的N个正整数。

对数组num中的每个元素num[i] 看在数组中是否存在与它相同的数。算法描述为:

for (i=0;i{

     for (j=0;j       {

           if (j==i) continue;

           if (num[i]==num[j]) break;   // 若有相同,a[i]不唯一,退出循环

       }

       if (j==n) break;    // a[i]与其他元素均不同,是唯一的,退出循环

}

    (2)源程序。

    #include

int num[100000];

int main()

{

   int n;

   scanf("%d",&n);

   int i,j;

for (i=0;i      scanf("%d",&num[i]);

for (i=0;i   {

for (j=0;j       {

           if (j==i) continue;

           if (num[i]==num[j]) break;

       }

       if (j==n) break;

   }

if (i   else  printf("None\\n");

   return 0;

}

7.判断上三角矩阵

上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。

本题要求编写程序,判断一个给定的方阵是否上三角矩阵。

输入格式:

输入第一行给出一个正整数T,为待测矩阵的个数。接下来给出T个矩阵的信息:每个矩阵信息的第一行给出一个不超过10的正整数n。随后n行,每行给出n个整数,其间以空格分隔。

输出格式:

每个矩阵的判断结果占一行。如果输入的矩阵是上三角矩阵,输出“YES”,否则输出“NO”。

输入样例:

2

3

1 2 3

0 4 5

0 0 6

2

1 0

-8 2

输出样例:

YES

NO

    (1)编程思路。

用二重循环   

for (i=1; i for (j=0;j           {  }

    对方阵的主对角线以下的各元素进行处理,若a[i][j]不等于0,则给定的方阵不是上三角矩阵,置标记flag=0(设flag的初始值为1),并退出循环。

    循环退出后,若flag==1,输出Yes;否则输出No。

    (2)源程序。

#include

int main()

{

   int t;

   scanf("%d",&t);

   while (t--)

   {

       int a[10][10];

       int n,i,j;

       scanf("%d",&n);

for (i=0;i for (j=0;j           scanf("%d",&a[i][j]);

       int flag=1;

for (i=1;flag && i for (j=0;j           if (a[i][j]!=0)

           {

              flag=0; break;

           }

       if (flag==1) printf("YES\\n");

       else printf("NO\\n");

   }

   return 0;

}

8.求矩阵各行元素之和

本题要求编写程序,求一个给定的m×n矩阵各行元素之和。

输入格式:

输入第一行给出两个正整数m和n(1≤m,n≤6)。随后m行,每行给出n个整数,其间以空格分隔。

输出格式:

每行输出对应矩阵行元素之和。

输入样例:

3 2

6 3

1 -8

3 12

输出样例:

9

-7

15

    (1)编程思路。

  用如下的二重循环对m×n矩阵进行处理。

for (i=0;i    {

        int sum=0;

for (j=0;j           sum+=a[i][j];

        printf("%d\\n",sum);

    }

    (2)源程序。

#include

int main()

{

    int a[6][6];

    int m,n,i,j;

    scanf("%d%d",&m,&n);

for (i=0;i for (j=0;j        scanf("%d",&a[i][j]);

for (i=0;i    {

        int sum=0;

for (j=0;j           sum+=a[i][j];

        printf("%d\\n",sum);

    }

   return 0;

}

9.方阵循环右移

本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0、1、⋯、n−1列变换为第n−m、n−m+1、⋯、n−1、0、1、⋯、n−m−1列。

输入格式:

输入第一行给出两个正整数m和n(1≤n≤6)。接下来一共n行,每行n个整数,表示一个n阶的方阵。

输出格式:

按照输入格式输出移动后的方阵:即输出n行,每行n个整数,每个整数后输出一个空格。

输入样例:

2 3

1 2 3

4 5 6

7 8 9

输出样例:

2 3 1 

5 6 4 

8 9 7

    (1)编程思路。

    将方阵中每行的n个元素循环向右移m个位置,可以写成三个一重循环,以第i行为例进行描述,第i行的元素为a[i][0]~a[i][n-1]。

    1)先将最右边的m个元素暂存到一维数组t中,循环为

       for (k=0, j=n-m;j<=n-1;j++)

           t[k++]=a[i][j];

    2)将前面的n-m个元素a[n-m-1]~a[0]依次右移m个位置,循环为

for (j=n-m-1;j>=0;j--)    

            a[i][j+m]=a[i][j];

    3)将暂存的最右边的m个元素顺序放在第行的左端,循环为

for (j=0;j            a[i][j]=t[j];

    (2)源程序。

#include

int main()

{

    int a[6][6],t[6];

    int m,n,i,j;

    scanf("%d%d",&m,&n);

for (i=0;i for (j=0;j        scanf("%d",&a[i][j]);

    m=m%n;

for (i=0;i    {

        int k=0;

for (j=n-m;j<=n-1;j++)

           t[k++]=a[i][j];

for (j=n-m-1;j>=0;j--)

            a[i][j+m]=a[i][j];

for (j=0;j            a[i][j]=t[j];

for (j=0;j           printf("%d ",a[i][j]);

        printf("\\n");

    }

   return 0;

}

10.求二维数组中的最大值和最小值

编写程序,输入一个3×3的二维整数数组,输出其中最大值、最小值。

输入格式:

输入9个整型数到二维数组a[3][3],数据之间用一个空格分隔。

输出格式:

输出数组a的最大值和最小值

输入样例:

在这里给出一组输入。例如:

1 2 3 4 5 6 7 8 9

输出样例:

在这里给出相应的输出。例如:

max=9 min=1

    (1)编程思路。

    初始化二维数组中各元素的最大值和最小值均为a[0][0],用二重循环对二维数组的每个元素a[i][j]进行判断,若a[i][j]>max,则max=a[i][j];若a[i][j]    (2)源程序。

#include

int main()

{

    int a[3][3];

    int i,j;

for (i=0;i<3;i++)

for (j=0;j<3;j++)

        scanf("%d",&a[i][j]);

    int max=a[0][0];

    int min=a[0][0];

for (i=0;i<3;i++)

for (j=0;j<3;j++)

      {

if (max if (min>a[i][j]) min=a[i][j];

      }

    printf("max=%d min=%d\\n",max,min);

    return 0;

}

11.统计大写辅音字母

英文辅音字母是除A、E、I、O、U以外的字母。本题要求编写程序,统计给定字符串中大写辅音字母的个数。

输入格式:

输入在一行中给出一个不超过80个字符、并以回车结束的字符串。

输出格式:

输出在一行中给出字符串中大写辅音字母的个数。

输入样例:

HELLO World!

输出样例:

4

    (1)编程思路。

同样用循环for (int i=0;s[i]!='\\0';i++)对输入字符串中的各字符s[i]进行判断,若s[i]为答谢字母(s[i]>='A' && s[i]<='Z')且不为A、E、I、O、U这5个字母,则计数。

    (2)源程序。

#include

#include

int main()

{

    char s[81];

    gets(s);

    int cnt=0;

    for (int i=0;s[i]!='\\0';i++)

if (s[i]>='B' && s[i]<='Z')

          if (s[i]!='E' && s[i]!='I' && s[i]!='O' && s[i]!='U')

             cnt++;

    printf("%d\\n",cnt);

    return 0;

}

12.字符串字母大小写转换

本题要求编写程序,对一个以“#”结束的字符串,将其小写字母全部转换成大写字母,把大写字母全部转换成小写字母,其他字符不变输出。

输入格式:

输入为一个以“#”结束的字符串(不超过30个字符)。

输出格式:

在一行中输出大小写转换后的结果字符串。

输入样例:

Hello World! 123#

输出样例:

hELLO wORLD! 123

    (1)编程思路。

    大写字母加32转换为对应的小写字母,小写字母减32转换为对应的大写字母。

    (2)源程序。

#include

#include

int main()

{

    char s[30],ch;

    int cnt=0;

    while ((ch=getchar())!='#')

    {

if (ch>='A' && ch<='Z') ch=ch+32;

else if (ch>='a' && ch<='z') ch-=32;

        s[cnt++]=ch;

    }

    s[cnt]='\\0';

    printf("%s\\n",s);

    return 0;

}

13.二进制数据转换成十进制数

输入1个无符号二进制数串,编写程序将其转换成对应的十进制数,并输出。

输入格式:

输入1个二进制数串(至少1位且不超过16位)。

输出格式:

输出转换后的十进制数。

输入样例:

0110110001100

输出样例:

3468

    (1)编程思路。

    将二进制数按权值展开后求和即可。

二进制数An-1An-2…A1A0 按权值展开为:

An-1×2n-1 + An-2×2n-2 +…+A1×21+A0×20

按秦九韶算法的思想,该权值展开多项式求和可以用循环完成,具体方法为:

S=0;

for (i=n-1;i>=0;i++)

      S=S*2+a[i];

    (2)源程序。

#include

int main()

{

    char s[17];

    scanf("%s",s);

    int num=0;

    for (int i=0;s[i]!='\\0';i++)

        num=num*2+s[i]-'0';

    printf("%d\\n",num);

    return 0;

}

14.字符串排序

本题要求编写程序,读入5个字符串,按由小到大的顺序输出。

输入格式:

输入为由空格分隔的5个非空字符串,每个字符串不包括空格、制表符、换行符等空白字符,长度小于80。

输出格式:

按照以下格式输出排序后的结果:

After sorted:

每行一个字符串

输入样例:

red yellow blue green white

输出样例:

After sorted:

blue

green

red

white

yellow

    (1)编程思路。

    采用冒泡排序对字符串进行排序。注意字符串比较采用函数strcmp,字符串赋值采用函数strcpy即可。

    (2)源程序。

#include

#include

int main()

{

    char s[5][80],t[80];

    int i,j;

for (i=0;i<5;i++)

        scanf("%s",s[i]);

for (i=0;i<5-1;i++)

for (j=0;j<5-1-i;j++)

if (strcmp(s[j],s[j+1])>0)

        {

           strcpy(t,s[j]);

           strcpy(s[j],s[j+1]);

           strcpy(s[j+1],t);

        }

    printf("After sorted:\\n");

for (i=0;i<5;i++)

       printf("%s\\n",s[i]);

    return 0;

}

15.找最长的字符串

本题要求编写程序,针对输入的N个字符串,输出其中最长的字符串。

输入格式:

输入第一行给出正整数N;随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,制表符。

输出格式:

在一行中用以下格式输出最长的字符串:

The longest is: 最长的字符串

如果字符串的长度相同,则输出先输入的字符串。

输入样例:

5

li

wang

zhang

jin

xiang

输出样例:

The longest is: zhang

(1)编程思路。

定义两个字符串数组str[81]和maxStr[81],一个用于输入字符串,一个保存最长的字符串。定义整型变量maxlen保存最长字符串的长度。

初始时,设置输入的第1个字符串为最长字符串,置maxlen=strlen(str),strcpy(maxStr,str)。

依次输入剩下的n-1个字符串(for (i=1;i(2)源程序。

#include

#include

int main()

{

   int n;

   scanf("%d",&n);

   char str[81],maxStr[81];

   int maxlen,i;

   scanf("%s",str);

   maxlen=strlen(str);

   strcpy(maxStr,str);

for (i=1;i   {

       scanf("%s",str);

if (strlen(str)>maxlen)

       {

          maxlen=strlen(str);

          strcpy(maxStr,str);

       }

   }

   printf("The longest is: %s",maxStr);

   return 0;

}

16.统计字符出现次数

本题要求编写程序,统计并输出某给定字符在给定字符串中出现的次数。

输入格式:

输入第一行给出一个以回车结束的字符串(少于80个字符);第二行输入一个字符。

输出格式:

在一行中输出给定字符在给定字符串中出现的次数。

输入样例:

programming is More fun!

m

输出样例:

2

    (1)编程思路。

用循环for (int i=0;s[i]!='\\0';i++)对输入字符串中的各字符s[i]进行判断,若s[i]==ch,则计数。处理过程如下:

   int cnt=0;

    for (int i=0;s[i]!='\\0';i++)

       if (s[i]==ch)

           cnt++;

    (2)源程序。

#include

#include

int main()

{

    char s[80],ch;

    gets(s);

    ch=getchar();

    int cnt=0;

    for (int i=0;s[i]!='\\0';i++)

       if (s[i]==ch)

           cnt++;

    printf("%d\\n",cnt);

    return 0;

}

17.念数字

输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:

0: ling

1: yi

2: er

3: san

4: si

5: wu

6: liu

7: qi

8: ba

9: jiu

输入格式:

输入在一行中给出一个整数,如:1234。

提示:整数包括负数、零和正数。

输出格式:

在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如 yi er san si。

输入样例:

-600

输出样例:

fu liu ling ling

    (1)编程思路。

定义二维数组char str[10][5]={"ling保存0~9这9个数字的拼音。

将一个非负整数number各位上的数字依次分离出来,其操作步骤为:

1)分离出number的个位数,即number%10。

2)将number除以10,作为新的number,即新的number丢掉了个位数。

3)如果number等于0,分离完毕,结束。否则,转第1)步,继续显示。

例如,number=1234,number%10=4, number=1234/10=123,得到数字4;

                      number%10=3, number=123/10=12,得到数字3;

number%10=2, number=12/10=1,得到数字2;

number%10=1, number=1/10=0,得到数字1;结束。

将分离的各位数字依次存储到数组a中,然后逆序输出数组a中保存的各元素值对应的拼音str[a[i]]即可。

    (2)源程序。

#include

int main()

{

   char str[10][5]={"ling

   int n;

   scanf("%d",&n);

if (n<0)

   {

       printf("fu ");

       n=-n;

   }

   int a[11],cnt=0;

   while (n!=0)

   {

       a[cnt++]=n%10;

       n=n/10;

   }

   if (cnt==0)

       printf("%s\\n",str[0]);

   else

   {

for (int i=cnt-1;i>0;i--)

          printf("%s ",str[a[i]]);

       printf("%s\\n",str[a[0]]);

   }

   return 0;

}下载本文

显示全文
专题