数组的习题

课后练习题

  1. 询问输出结果
#include <stdio.h>
int main()
{
	int a[2][3] = { {1,3,5},{2,4,6} };
	printf("第二行、第二个元素的值是:%d\n", a[1][1]);
	return 0;
}

思路:数组指明2行3列,第二行即第二个大括号的值,第二个元素则是a[1] [1],结果为4

画个表格

a[] [0]a[] [1]a[] [2]
a[0] []135
a[1] []246
  1. 询问输出结果
#include <stdio.h>
int main()
{
int a[2][3]={{1,3,5},{2}};
  printf("第二行、第二个元素的值是:%d\n",a[1][1]);
return 0;
}
  1. 询问输出结果
#include <stdio.h>
int main()
{
  int a[2][3]={{},{1,3} };
  printf("第二行、第二个元素的值是:%d\n",a[1][1]);
return 0;
}
  1. 询问输出结果
#include <stdio.h>
int main()
{
  int a[2][3]={1,3,5,2};
  printf("第二行、第二个元素的值是:%d\n",a[1][1]);
return 0;
}

5.输入一个长字符串再输入一个短的,判断短的在长的中出现了几次,如"aaaacaaa",“aa”,输出3次

函数版:

#define _CRT_SECURE_NO_WARNINGS 1
#define False 0
#define True 1
#include <stdio.h>
#include <string.h>
int isStr(char temp[], char strShort[])
{
    char* pt = temp;
    char* ps = strShort;
    while (*pt)
    {
        if (*pt++ != *ps++)
        {
            return False;
        }
    }
    return True;
}
int main() {
    char strLong[50], strShort[50], temp[50];
    int i, j, myBool, count = 0;
    printf("请输入长字符串\n");
    gets(strLong);
    printf("请输入短字符串\n");
    gets(strShort);
    int len = strlen(strShort);
    for (i = 0; strLong[i]; i)
    {
        for (j = 0; j < len; j++)
        {
            temp[j] = strLong[i];
            i++;
        }
        temp[j] = '\0';//切记处理完字符串,最后一定要加结束标签,否则非常不安全!
        myBool = isStr(temp, strShort);
        if (myBool)
        {
            count++;
        }
    }
    printf("相同的字符串有 %d 组\n", count);
    return 0;
}

优化后(引入暴力匹配算法概念):

#define _CRT_SECURE_NO_WARNINGS 1
#define False 0
#define True 1
#include <stdio.h>
#include <string.h>

int main() {
    char strLong[50], strShort[50], temp[50];
    int i, j, myBool, count = 0;
    int lenLong, lenShort;

    printf("请输入长字符串\n");
    gets(strLong);
    printf("请输入短字符串\n");
    gets(strShort);

    lenLong = strlen(strLong);
    lenShort = strlen(strShort);

    // 遍历长字符串,每次检查一个长度为 lenShort 的子串
    for (i = 0; i <= lenLong - lenShort; i++) {
        // 复制当前子串到 temp
        for (j = 0; j < lenShort; j++) {
            temp[j] = strLong[i + j];
        }
        temp[lenShort] = '\0';  // 确保 temp 有结束标签

        myBool = True;

        // 比较子串和短字符串
        for (j = 0; j < lenShort; j++) {
            if (temp[j] != strShort[j]) {
                myBool = False;
                break;
            }
        }

        if (myBool) {
            count++;
        }
    }

    printf("相同的字符串有 %d 组\n", count);
    return 0;
}

来自梁通

1.输入十个人的分数,计算他们的平均值,并且把不及格的人单独打印出来,包括他们的序号。

#define _CRT_SECURE_NO_WARNINGS 1;
#include <stdio.h>
int main()
{
	int a[10], i;
	float avg=0;
    printf("请输入十个学生的成绩\n");
	for (i = 0; i < 10; i++)
	{
		scanf("%d", &a[i]);
		avg += a[i];
	}
	avg = avg / 10;
	printf("这十个人的平均分为%.2f\n", avg);
	for (i = 0; i < 10; i++)
	{
		if (a[i] < 60)
		{
			printf("不及格的序号为%d\t分数为%d\n", i+1, a[i]);

		}
	}
	return 0;
}

考点:

数组,for循环,if语句

思路:

  1. 要输入多个数值,则肯定用到数组,利用循环,把数组内的值全都赋值。
  2. 计算平均值,先给avg变量在循环中依次叠加,跳出循环后,avg/10,算出平均值
  3. 输出平均成绩后,进入新的循环,和上次的循环一样,同样是循环在数组中的基本应用
  4. 设立if语句,分数小于60的人都打印出来

实际答题中遇到的问题:

  1. int对应%d , float对应 %f
  2. 数组在for循环中应用的时候,注意scanf函数输入的时候,用的是a[i],并不是a[10]
  3. 初始化变量注意赋值

真题链接

编程题2. (2016&2024)

输出以下的杨辉三角形(要求输出10行)。

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

#include<stdio.h>
int main( )
{
   int i,j,a[10][10];
   for(i=0;i<10;i++)
   {
   	  a[i][0]=1;
      a[i][i]=1;
   }
   
    for(i=2;i<10;i++)
     for(j=1;j<i;j++)
       a[i][j]=a[i-1][j-1]+a[i-1][j];
   
    for(i=0;i<10;i++)
   {
	 for(j=0;j<=i;j++)
   	  printf("%-5d",a[i][j]);
	  printf("\n");
   }
   return 0;
}

考点:二维数组、循环嵌套、算法

解题思路:

step 0.

完成main()的框架;初始化int

step 1.

**目的:**打印“杨辉三角形”两边的所有1

如图,第一个for循环所实现的效果

1
11
11
11
11
11
11
11
11
11

技术归纳:

for循环嵌套二维数组,分两步打印;

第一步打印最左边的数字,即二维数组,固定“列”,“行”逐步增加,进行循环打印;

第二步打印最右边的数字,即二维数组,行与列,同步增加,实现兑成效果,进行循环打印。

for(i=0;i<10;i++)
{
a[i][0]=1;
a[i][i]=1;
}

step 2.

目的:计算“杨辉三角形”中间的数(列式子)

结果如图

1
11
121
1331
14641
15101051
1615201561
172135362171
18285670562881
193684126126843691

技术归纳:

第一步列数学公式:

每个需要"被计算"的数字,要与上一行的对角线数字进行相加运算,则得式子(前提定义行为i,列为j)

a[i][j]=a[i-1][j-1]+a[i-1][j]

第二步两个循环的实现:

for1

先从第一个需要被此公式运算的数初始化,即 i=2 ;循环8次结束循环,则循环次数为 i<10,i ++以进入下一步循环

for2

进行公式的循环计算,还是从第一个需要被公式运算的数初始化,即 j=1 ;j<i 结束循环;j++进入下一步循环

算法总结:

第一步 得到数学公式,以进行运算

第二步 循环找到每个需要被计算数字的“位置”

第三部 循环实现公式的应用

for(i=2;i<10;i++)
	for(j=1;j<i;j++)
       	a[i][j]=a[i-1][j-1]+a[i-1][j];

step3

**目的:**按格式输出完整的杨辉三角形(上面的代码只是在构建模型,而不是真正输出,这一步的代码让整个程序有意义)

结果如"表2",不过多展示

技术归纳:

打印“%-5d”,目的是为了 输出一个整数,宽度为5,左对齐。通过这种方式可以将数字的元素以每行i+1个每个占据5个字符宽度的格式打印出来。

打印"\n",目的是换行。

for1,完整进行格式化输出,所以从0开始,到9结束,自加

for2,进行输出思路与第二个for循环嵌套的内层一样逐一打印

 for(i=0;i<10;i++)
   {
	 for(j=0;j<=i;j++)
   	  printf("%-5d",a[i][j]);
	  printf("\n");
   }

算法总结:

本步骤需要“输出”且“格式化”

所以要利用格式化输出和二维数组与循环嵌套来实现,整体思路就是完整格式化打印

最后的总结:

算法:

这道题涉及到了算法。杨辉三角形的生成和打印可以通过特定的算法来实现。

在这个例子中,算法主要体现在计算每个位置上的数值以及按照特定格式打印这些数值的过程。

具体来说,计算每个位置上的数值可能涉及到根据行和列的索引来确定数值的规则。例如,在常见的杨辉三角形中,每个位置上的数值可能是上一行同一列和前一列数值的和。

打印的过程则涉及到按照特定的格式组织和输出这些数值,以形成杨辉三角形的形状。

这种算法的设计和实现需要考虑到数值的计算逻辑以及打印的格式要求。通过合理的循环结构和条件判断,可以实现对杨辉三角形的生成和打印。

所以,这道题确实涉及到了算法的概念,并且通过编程来实现这个算法,以解决生成和打印杨辉三角形的问题。

知识点:

  1. 数组:杨辉三角形通常是用一个二维数组来表示的,每个元素代表三角形中的一个数值。
  2. 循环结构:如前面所提到的,通常使用循环结构(如 for 循环)来遍历数组的行和列,计算和打印每个位置上的数值。
  3. 数学规律:杨辉三角形中的数值遵循一定的数学规律,例如每行的第一个和最后一个元素都是 1,其他元素是上一行同一列和前一列元素的和。
  4. 格式化输出:为了按照杨辉三角形的格式进行打印,可能需要使用特定的格式化输出方法,如控制每个数字的宽度、对齐方式等。
  5. 递归:在某些实现中,可能会使用递归的方式来计算杨辉三角形的数值,通过递归来生成每一行的数值。
  6. 边界条件处理:在计算和打印过程中,需要处理好边界情况,例如行数超出数组范围、列数超出行的范围等。

这些知识点的综合运用,使得我们能够用编程的方式解决杨辉三角形的问题,并实现其生成和打印。

29程序填空题(2021)

29.下面程序的功能是:用户从键盘任意输入一个数字表示月份值,程序输出该月份对应的英文表示,若输入的数字不在 1-12之间,则输出“illegal month”。例如:从键盘输入5,程序输出 May。请在空格处补充程序。

#include<stdio.h>
int main()
{
	______;
    char monthName[][20]={"","January","February","March","April","May","June","July","August","September","October","November","December"}; 
    printf("请输入一个月份数字:");
    scanf("%d",&n); 
    if( _______ )
   		printf("%s\n", ______ ); 
    else
    	printf("lllegal month"); 
return 0;
}

分析:

本题目是旧专升本考题的体型,为程序填空题。

整体思路就是把元素放到数组中,使用条件语句判断其输出结果,还考到了使用条件语句判断是否为规定范围的数字。

33.程序设计题(2021)

33.编写程序,输入10个实数x1、x2、……、x10,按照下列公式计算并输出s的值。

s=(x1-x0)2+(x2-x0)2+(x3-x0)2+……(x10-x0)2,其中x0是x1、x2、x3、……x10的平均值。

#include <stdio.h>
int main()
{
    float s=0,x[10],x0;
    int k;
    printf("请输入10个实数:");
    for(k=0;k<10;k++)
    { 
        scanf("%f",&x[k]); 
        x0+=x[k];
    }
    x0/=10;
    for(k=0;k<10;k++)
    	s+=(x[k]- x0)*(x[k]- x0);
    printf("s=%f\n",s);
    
    return 0;
}

34.程序设计题(2021)

34.编写程序,从键盘输入一个字符串,判断其是不是回文。若是则输出”Yes”,否则输出”No”。(回文是指字符串正向、反向的拼写都一样。例“abcba”、“bbbb”是回文,“abc”、“bag”不是回文)。

#include <stdio.h>
#include <string.h>
int main()
{
    char str[20],*p,*q;
    int n;
    printf("请输入一个字符串:");
    gets(str);
    n=strlen(str);
    p=str;q=str+n-1; //p指向字符串首部,q指向字符串尾部。
    while(p<q)     //首指针与尾指针不重合
    {
       if(*p==*q) 
       { 
           p++;q--;
       }  //对称字符相同,同时移动指针
       else break;
    }
        if(p>=q)  //首指针与尾指针重合,所有对称字符都比较完成。
    printf("Yes\n");
    else  //出现不相同字符
        printf("No\n");
	
    return 0;
}

1.程序填空题(2019)

1.已知函数Fun1的部分代码如下所示,其功能是将整数数组x中的元素按相反顺序存放,请在空格处补充程序。例如:x={1,2,3,4},则经过Fun1函数后为x={4,3,2,1}

void Fun1(int *x,int n)
{
    int *p,*i, ______ ;
    int temp;
	______
    i=x;
	______
    p=x+middle;
    for(;i<=p;i++,j--)
    {
        temp=*i;
        *i=*j;
        ______            ;
     }
    
     return;
}

19.程序填空题(2020)

19.已知函数Fun19的部分代码如下所示,其功能是将s所指字符串的正序和反序进行连接,形成一个新串放在t所指的数组中,请在空格处补充程序。例如:s为“ABCD”时,则t为“ABCDDCBA”。

void Fun19(char *s, char *t)
{
    int i,d;
    d=strlen(s);
    for(i=0;i<d;i++)
        _______                    
    for(i=0;i<d;i++)
    	t[d+i]=s[d-1-i];
        ________          
}

完整代码:

#include <stdio.h>
#include <string.h>
void Fun19(char *s, char *t)
{
  int i,d;
  d=strlen(s);
  for(i=0;i<d;i++)
    t[i]=s[i];    //填空              
  for(i=0;i<d;i++)
    t[d+i]=s[d-1-i];
    t[d+i]='\0';  //填空        
}
int main()
{
   char str1[10],str2[20],*p,*t;
   p=str1;t=str2;
   printf("请输入一个字符串:");  
   gets(str1);
   Fun19(p,t);
   puts(t);
   return 0;
}

20.程序填空题(2020)

20.已知函数Fun20的部分代码如下所示,其功能是:将所有大于1小于整数m的非素数存入x所指数组中,非素数的个数通过n返回,例如,当m=17时,非素数的个数为9个,且x数组的值应为:4,6,8,9,10,12,14,15,16,请在空格处补充程序。

void Fun20( int m, int *n, int x[])
{
    int i,j,k=0;
    for(i=4;i<m;i++)
    {
    	for(j=2;j<i;j++)
   			if(i%j==0) break;
    if(j<i)
    _________                    
       }
    _________                  
}

完整代码:

#include <stdio.h>
void Fun20( int m, int *n, int x[])
{
  int i,j,k=0;
  for(i=4;i<m;i++)
  {
    for(j=2;j<i;j++)
      if(i%j==0)  break;
    if(j<i)
    {  
        x[k++]=i;*n=*n+1;//填空 
    }      
  }
  return; //填空
}
int main()
{
   int a[20],m,*s,n=0,i;
   s=&n;
   printf("请输入一个大于1的整数:");scanf("%d",&m);
   Fun20(m,s,a);
   printf("非素数个数为:%d\n",n);
   printf("大于1小于%d的非素数为:",m);
   for(i=0;i<n;i++) printf("%-5d",a[i]);
   return 0;
}

来自新希望

  1. 利用二维数组实现矩阵的转置。
#define _CRT_SECURE_NO_WARNINGS 1  
#include <stdio.h>
int main()
{
	int a[3][3];
	int i, j , c = 1;
	printf("1-9的3x3的矩阵如下\n");
	for ( i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			a[i][j] = c++;
			printf("%d ", a[i][j]);
		}
		printf("\n");
	}
	printf("矩阵转置如下\n");
	int b[3][3];
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			b[i][j] = a[j][i];
			printf("%d ", b[i][j]);
		}
		printf("\n");
	}
	return 0;
}


  1. 1/1!+1/2!+```+1/20!

  2. 判断数组中的最大数

#define _CRT_SECURE_NO_WARNINGS 1  
#include <stdio.h>
int main()
{
	int a[10] = { 3,2,1,4,5,6,7,8,9,0 };
	int max = 0, min = 0;
	for (int i = 0; i < 10; i++)
	{
		if (max < a[i])
		{
			max = a[i];
		}
		else
		{
			min = a[i];
		}
	}
	printf("max = %d\n", max);
	/*for (int j = 0; j < 10; j++)
	{
		if (min > a[j])
		{
			min = a[j];
		}
	}*/
	printf("min = %d\n", min);

	return 0;
}


  1. 冒泡排序

    #define _CRT_SECURE_NO_WARNINGS 1  
    #include<stdio.h>
    int main()
    {
        int a[5] = { 1,2,3,4,5 };
        int i, j, t = 0;
        for (i = 0; i < 4; i++)
        {
            for (j = 0; j < 4-i-1; j++)
            {
                if (a[j] < a[j + 1])
                {
                    t = a[j];
                    a[j] = a[j+1];
                    a[j+1] = t;
                }
            }
        }
        for (i = 0; i < 5; i++)
        {
            printf("%-3d", a[i]);
        }
        return 0;
    }
    
  2. 由用户输入一个字符串(只能包含数字和字母),将字符串中的数字提取出来,如输入:agh1234jh5b67,输出1234567

#define _CRT_SECURE_NO_WARNINGS 1  
//if 第一个if判断    数字和字母   第二个if判断,只接收数字,
// str1 str2
//通过循环来遍历数组,然后依次赋值
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
	int j, k = 0;
	char str1[100],str2[100];
	printf("请输入字符串(只能包含数字和字母)\n");
	scanf("%s", str1);
	int len = strlen(str1);
	for (j = 0; j < len; j++)
	{
		if (str1[j] >= '0' && str1[j] <= '9' || str1[j] >= 'A' && str1[j] <= 'Z' || str1[j] >= 'a' && str1[j] <= 'z')
		{
			if (str1[j] >= '0' && str1[j] <= '9') 
			{
				str2[k] = str1[j];
				k++;
			}
		}
		else
		{
			printf("请重新输入\n"); 
			exit(0);
		}
	}
	str2[k] = '\0';
	printf("%s\n",str2);
	
	return 0;
}

  1. 输入处理

    • 程序首先提示用户输入一个字符串,该字符串应只包含数字和字母。
    • 使用 scanf 函数读取用户输入的字符串,并存储在 str1 中。
  2. 遍历字符串

    • 使用一个 for 循环遍历 str1 中的每个字符。
    • 在循环内部,首先检查当前字符是否是数字、大写字母或小写字母。这是通过一系列的条件判断来实现的。
  3. 数字提取

    • 如果当前字符是数字(在第一个 if 语句内部再次检查),则将该数字字符添加到 str2 中。
    • 使用变量 k 来跟踪 str2 中的当前位置,以便正确放置数字字符。
  4. 输入验证

    • 如果在遍历过程中遇到非数字或非字母字符,程序将打印错误消息并退出循环。
  5. 字符串结束符

    • 在循环结束后,向 str2 的末尾添加字符串结束符 '\0'
  6. 输出结果

    • 打印提取出的数字字符串 str2
  7. #include <stdio.h>
    #include <string.h>
    void main()
    { 
    	char ch[]="abc",x[3][4];
    	int i; 
    	for(i=0;i<3;i++) 
    		strcpy(x[i], ch);
    	for(i=0;i<3;i++)
    		printf("%s\n",&x[i][i]); 
    
    }
    

    输出结果"abcbcc"

7.以下程序输出结果:

#include <stdio.h>
#include <string.h>
int main() {
	char a[7] = "a0\0a0\0";
	int i, j;
	i = sizeof(a);
	j = strlen(a);
	printf("%d %d\n", i, j);
	return 0;
}

sizeof()的计算是所有的字符内存字节数,包括系统添加的\0,就算字符串中有已经存在的\0,系统还是会自动添一个\0

strlen()的计算是看见\0就中断的,并且不包括\0;

**输出结果:**7 2

  1. 下面程序运行结果:
#include <stdio.h>
int main() {
	char ch[7] = { "65ab21" };
	int i, s = 0;
	for (i = 0; ch[i] >= '0' && ch[i] <= '9'; i += 2)
		s = 10 * s + ch[i] - '0';
	printf("%d\n", s);
	
	return 0;
}

分析: i可以去到0,2,4,6,但是此时i+=2;执行完第一次循环后,数组下标来到了2,取到的字符是’a’,循环条件不成立,所以这个循环体只循环一次,即最后的结果为6。

  1. 在键盘上输入55566 7777abc后,y的值是多少?
#define _CRT_SECURE_NO_WARNINGS 1  
#include <stdio.h>
int main() {
	int j;
	float y;
	char name[50];
	scanf("%2d%f%s", &j, &y, name);  //注意格式化输入符,最大宽度为2,超出截断
	printf("\n%f\n", y);
	printf("\n%s", name);

	return 0;
}

输出结果为: 566.000000

**分析:**本程序注意有格式化输入要求,最大的整形宽度为2,超出则截断,所以j只会接受到55,而空格会截断浮点数的输入,则y的值为566,而name数组的宽度足够长,全部接收剩下的,则name储存的值为7777abc。

  1. 已知5个学生的4门课成绩,要求求出每个学生的平均成绩,然后对平均成绩从高到低将各学生排序。

    #define _CRT_SECURE_NO_WARNINGS 1  
    #include <stdio.h>
    int main() {
    	int s[5][4] = {90,93,93,94,87,89,93,94,99,92,94,95,87,86,83,90,87,86,83,99 };
    	int i, j, avg[5], sum = 0;
    	for (i = 0; i < 5; i++)
    	{
    		for (j = 0; j < 4; j++)
    		{
    			sum += s[i][j];
    		}
    		avg[i] = sum / 4;
    		sum = 0;
    	}
    	for (i = 0; i < 5; i++)
    	{
    		printf("%d ", avg[i]);
    	}
    	printf("\n");
    	//冒泡排序从高到低排序
    	for (i = 0; i < 4; i++)
    	{
    		for (j = 0; j < 4-i; j++)
    		{
    			if (avg[j] < avg[j + 1]) 
    			{
    				int temp = avg[j];
    				avg[j] = avg[j + 1];
    				avg[j + 1] = temp;
    			}
    		}
    	}
    	for (i = 0; i < 5; i++)
    	{
    		printf("%d ", avg[i]);
    	}
    		
    	return 0;
    }
    
  2. 将一个数组中的值按逆序重新存放。例如,原来顺序为 8,6,5,4,1。要求改为 1,4,5,6,8。

#include <stdio.h>
int main() {
	int i, j, arr[5];
	for (i = 0; i < 5; i++)
	{
		scanf("%d", &arr[i]);
	}
	for (i = 0; i < 5; i++)
		for (j = 0; j < 5 - i - 1; j++)
		{
			int temp = arr[j];
			arr[j] = arr[j + 1];
			arr[j + 1] = temp;
		}
	for (i = 0; i < 5; i++)
		printf("%d ", arr[i]);

	return 0;
}

**分析:**本题考查了一个无条件的冒泡排序,牢记冒泡排序的核心代码即可

核心代码:

for(i=0;i<N;i++)
    for(j=0;j<N-i-1;j++)
    {
        if(/*ture*/) //从高到低arr[j]<arr[j+1],从低到高arr[j]>arr[j+1]
        {
            int temp=arr[j];
            arr[j]=arr[j+1];
            arr[j+1]=temp;
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值