C语言编程 菜鸟练习100题(41-50)

【练习41】字符串翻转

0. 题目:
字符串翻转
1. 分析:
学习递归思想和方法。
2. 程序:
方法一:

#include <stdio.h>
void reverseSentence();
 
int main()
{
    printf("输入一个字符串(非中文): ");
    reverseSentence();
 
    return 0;
}
 
void reverseSentence()
{
    char c;
    scanf("%c", &c);
 
    if( c != '\n')
    {
        reverseSentence();
        printf("%c",c);
    }
}

【 解析】 这个程序非常简单巧妙:通过递归方法,不断读入当前的字符,直到字符串结束(读到回车符),然后逐次输出最近读入的字符,实现输出翻转的字符串。

方法二 :

#include <stdio.h>
#include <string.h>
int main()
{
    char cInput[40];
    printf("请输入字符串:");
    scanf("%[^\n]s",cInput);
    int j=strlen(cInput);
    printf("strlen = %d\n",j);
    
    do{
        printf("%c",cInput[j-1]);
        j--;
    } while(j);
    
    return 0;
}

【 解析】 这个程序更容易理解。注意 scanf()会在遇到的第一个空白字符空格(blank)、制表符(tab)或者换行符(newline)处停止读取,使用 scanf("%[^\n]s",cInput) 可以设置只有在读入回车符时才终止读取。
3. 输入输出:

输入一个字符串(非中文): Hello world!
!dlrow olleH


【练习42】计算数组元素的平均值

0. 题目:
计算数组元素平均值
1. 分析:
使用 for 循环。
2. 程序:

#include <stdio.h>
 
int main() {
   int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
   int sum, loop;
   float avg;
 
   sum = avg = 0;
   
   for(loop = 0; loop < 10; loop++) {
      sum +=  array[loop];
   }
   
   avg = (float)sum / loop;
   
   printf("平均值为 %.2f", avg);   
   
   return 0;
}

3. 输入输出:

平均值为 4.50

【练习43】输出数组

0. 题目:
输出数组
1. 分析:
使用 for 循环输出数组。
2. 程序:

#include <stdio.h>
 
int main() {
   int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
   int loop;
 
   for(loop = 0; loop < 10; loop++)
   {
		printf("%d ", array[loop]);
   }
      
   return 0;
}

3. 输入输出:

1 2 3 4 5 6 7 8 9 0

【练习44】计算数组元素之和

0. 题目:
计算数组元素之和
1. 分析:
使用 for 循环。
2. 程序:

#include <stdio.h>
 
int main() {
   int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
   int sum=0, loop; 
   
   for(loop = 9; loop >= 0; loop--)
	{
      sum = sum + array[loop];      
	}
 
   printf("数组元素的和为:%d", sum);   
 
   return 0;
}

3. 输入输出:

数组元素的和为:45


【练习45】查找数组元素中的最大值

0. 题目:
查找数组元素中的最大值
1. 分析:
使用 for 循环。
2. 程序:

方法一:

#include <stdio.h>
 
int main() {
	int array[10] = {3,2,1,4,7,6,5,8,0,9}; 
	int loop, largest;
 
	largest = array[0];
	for(loop=1; loop<10; loop++) 
	{
	    if( largest < array[loop] ) 
			largest = array[loop];
	}
   
   printf("数组的最大值为 %d", largest);   
   
   return 0;
}

方法二:

#include <stdio.h>
 
int main() {
	int array[] = {3,2,1,4,7,6,5,8,0,9}; 
	int loop, largest;
 
	for(loop=0; loop<10; loop++)
		largest=(array[loop] > largest)? array[loop] : largest;
   
	printf("数组的最大值为 %d", largest);   
   
	return 0;
}

3. 输入输出:

数组的最大值为 9

4. 解析:

条件运算符?: 是三元运算符,语法为:条件表达式?表达式1:表达式2。该操作首先求出条件表达式的值(bool类型),true 执行表达式1,flase 执行表达式2。


【练习46】查找数组元素中的最小值

0. 题目:
查找数组元素中的最小值
1. 分析:
使用 for 循环。
2. 程序:

#include <stdio.h>
 
int main() {
	int loop, nLen, nSmallest;
	int array[] = {3,2,1,4,7,6,5,8,0,9}; 
 
 	nLen = sizeof(array)/sizeof(array[0]);
	nSmallest = array[0];
   
   	for(loop = 1; loop < nLen; loop++)
	{
		if(nSmallest > array[loop]) 
			nSmallest = array[loop];
	}
	
	printf("数组的最小值为 %d", nSmallest);   
   
	return 0;
}

3. 输入输出:

数组的最小值为 0

4. 解析:

使用关键字 sizeof 获取数组长度:用 sizeof 可以获得数据类型或变量在内存中所占的字节数,也可以获得整个数组在内存中所占的字节数。因为数组中元素的类型相同,在内存中所占的字节数也相同,所以数组总的字节数除以一个元素所占的字节数就是数组的长度。数组 array 是 int 型,每个元素占 4 字节,长度为 10 的数组在内存中所占的字节数就是 40。


【练习47】数组拆分

0. 题目:
将一个数组拆分为两个数组,一个为奇数数组,一个为偶数数组。
1. 分析:
使用 if...else...条件分支结构。
2. 程序:

#include <stdio.h>
 
int main() {
	int array[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
	int even[10], odd[10];
	int loop, e, d;
   
	e = d = 0;
   	for(loop = 0; loop < 10; loop++)
	{
		if(array[loop]%2 == 0)
		{
			even[e] = array[loop];
			e++;
		}
		else
		{
			odd[d] = array[loop];
			d++;
		}
	}
      
	printf(" 原始数组 --> ");
	for(loop = 0; loop < 10; loop++)
		printf(" %d", array[loop]);
       
	printf("\n 偶数 --> ");
	for(loop = 0; loop < e; loop++)
		printf(" %d", even[loop]);   
 
	printf("\n 奇数 --> ");
	for(loop = 0; loop < d; loop++)
		printf(" %d", odd[loop]);   
   
	return 0;
}

3. 输入输出:

原始数组 --> 0 1 2 3 4 5 6 7 8 9
偶数 --> 0 2 4 6 8
奇数 --> 1 3 5 7 9


【练习48】数组拷贝

0. 题目:
将一个数组复制给另外一个数组
1. 分析:
数组复制属于值传递,复制的数组具有新的地址,复制后原数组与新数组的变化互不影响。

2. 程序:

#include <stdio.h>
 
int main() {
	int original[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
	int copied[10];
	int loop;
   
	for(loop = 0; loop < 10; loop++)
	{
    	copied[loop] = original[loop];
	}
	printf("原数组 -> 拷贝数组 \n");
   
	for(loop = 0; loop < 10; loop++)
	{
		printf("%2d\t%2d\n", original[loop], copied[loop]);
	}
	
 	return 0;
}

3. 输入输出:

原数组 -> 拷贝数组
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
0 0


【练习49】计算标准偏差

0. 题目:
计算数组元素之和
1. 分析:
标准差(Standard Deviation)也称为标准偏差,反映一个数据集的离散程度。
2. 程序:

#include <stdio.h>
#include <math.h>
 
float calSD(float data[],int nLen);
 
int main()
{
	int i,nLen;
    float data[100];
    
    printf("请输入数组长度: ");
    scanf("%d", &nLen);
    for(i=0; i < nLen; ++i)
    {
        printf("输入第 %d 个元素: ", i+1);
        scanf("%f", &data[i]);    	
	}

    printf("\n标准偏差 = %.6f", calSD(data,nLen));
 
    return 0;
}
 
float calSD(float data[],int nLen)
{
	int i;
    float sum, mean, standardDeviation; 
 
	sum = 0.0;
    for(i=0; i<nLen; ++i)
        sum += data[i];
	mean = sum/nLen;
 
	standardDeviation = 0.0;
    for(i=0; i<nLen; ++i)
        standardDeviation += pow(data[i] - mean, 2);
 	standardDeviation /= nLen;
 	
    return sqrt(standardDeviation);
}

3. 输入输出:

请输入数组长度: 10
输入第 1 个元素: 1
输入第 2 个元素: 2
输入第 3 个元素: 3
输入第 4 个元素: 4
输入第 5 个元素: 5
输入第 6 个元素: 6
输入第 7 个元素: 7
输入第 8 个元素: 8
输入第 9 个元素: 9
输入第 10 个元素: 10
标准偏差 = 2.872281


【练习50】两个矩阵相加

0. 题目:
使用多维数组将两个矩阵相加。
1. 分析:
练习使用 for 循环嵌套,多维数组的表达。
2. 程序:

#include <stdio.h>
 
int main()
{
    int rows, cols, a[100][100], b[100][100], sum[100][100], i, j;
 
    printf("输入行数 ( 1 ~ 100): ");
    scanf("%d", &rows);
    printf("输入列数 ( 1 ~ 100): ");
    scanf("%d", &cols);
 
    printf("\n输入第一个数组的元素:\n"); 
    for(i=0; i<rows; ++i)
        for(j=0; j<cols; ++j)
        {
            printf("输入元素 a%d%d: ",i+1,j+1);
            scanf("%d",&a[i][j]);
        }
 
    printf("输入第二个数组的元素:\n");
    for(i=0; i<rows; ++i)
        for(j=0; j<cols; ++j)
        {
            printf("输入元素 b%d%d: ",i+1, j+1);
            scanf("%d", &b[i][j]);
        }
 
    // 相加 
    for(i=0;i<rows;++i)
        for(j=0;j<cols;++j)
            sum[i][j] = a[i][j] + b[i][j];
 
    // 显示结果
    printf("\n二个数组相加结果: \n\n");
 
    for(i=0;i<rows;++i)
    {
        for(j=0;j<cols;++j)
            printf("%d\t",sum[i][j]);
        printf("\n\n");
    }        
    
    return 0;
}

3. 输入输出:

输入行数 ( 1 ~ 100): 2
输入列数 ( 1 ~ 100): 3

输入第一个数组的元素:
输入元素 a11: 2
输入元素 a12: 3
输入元素 a13: 4
输入元素 a21: 5
输入元素 a22: 2
输入元素 a23: 3
输入第二个数组的元素:
输入元素 b11: -4
输入元素 b12: 5
输入元素 b13: 3
输入元素 b21: 5
输入元素 b22: 6
输入元素 b23: 3

二个数组相加结果:

-2 8 7

10 8 6


版权说明:
题目和例程 源于 菜鸟教程,作者重新编写了程序、注释和算例,并增加了难点分析。

上一篇:面试系列-高并发之synchronized


下一篇:如果使用的库不支持异步,可以使用多进程并将其转化为异步对象