【练习51】矩阵转置

0. 题目:

矩阵的转置

1. 分析:

练习使用 for 循环嵌套,多维数组的表达。

2. 程序:

#include <stdio.h>

int main()
{
int inMatrix[10][10], outMatrix[10][10], rows, cols, i, j;
printf("输入矩阵的行与列(逗号分隔): ");
scanf("%d,%d", &rows, &cols); // 存储矩阵的元素
printf("\n输入矩阵元素:\n");
for(i=0; i<rows; ++i)
for(j=0; j<cols; ++j)
{
printf("输入元素 inMatrix%d%d: ",i+1, j+1);
scanf("%d", &inMatrix[i][j]);
} // 显示矩阵 inMatrix[][] */
printf("\n输入矩阵是: \n");
for(i=0; i<rows; ++i)
{
for(j=0; j<cols; ++j)
printf("%d\t", inMatrix[i][j]);
printf("\n");
} // 转换
for(i=0; i<rows; ++i)
for(j=0; j<cols; ++j)
outMatrix[j][i] = inMatrix[i][j]; // 显示转换后的矩阵 outMatrix
printf("\n转换后矩阵是:\n");
for(i=0; i<cols; ++i)
{
for(j=0; j<rows; ++j)
printf("%d ",outMatrix[i][j]);
printf("\n");
} return 0;
}

3. 输入输出:

输入矩阵的行与列(逗号分隔):2,3

输入矩阵元素:
输入元素 inMatrix11: 2
输入元素 inMatrix12: 3
输入元素 inMatrix13: 4
输入元素 inMatrix21: 5
输入元素 inMatrix22: 6
输入元素 inMatrix23: 4 输入矩阵是:
2 3 4
5 6 7 转换后矩阵是:
2 5
3 6
4 7

【练习52】使用指针访问数组元素

0. 题目:

使用指针访问数组元素

1. 分析:

指针提供一种以符号形式使用地址的方法。在C语言中,数组的名称代表数组的首地址。

2. 程序:

#include <stdio.h>

int main()
{
int data[5], i; for(i = 0; i < 5; ++i)
{
printf("输入第 %d 个元素: ", i+1);
scanf("%d", data + i);
} printf("你输入的是: \n");
for(i = 0; i < 5; ++i)
printf("%d\n", *(data + i)); return 0;
}

3. 输入输出:

输入元素: 1
3
5
7
9
你输入的是:
1
3
5
7
9

4. 解析:

指针加上一个数时,不是把指针当做一个整数计算结果,而是指针在内存中移动。例如,*(data + i) 是指从数组 data 的首地址向后移动 i个元素的地址中的值,也即 data[i]。


【练习53】使用引用循环替换数值

0. 题目:

对 a、b、c 三个变量,通过引用按顺序循环替换他们的值。

1. 分析:

指针是内存地址。通过传递指向指针的引用来实现指针的交换。

2. 程序:

#include<stdio.h>

void cyclicSwap(int *a,int *b,int *c);

int main()
{
int a, b, c; printf("输入 a, b 和 c 的值(逗号分隔): ");
scanf("%d %d %d",&a,&b,&c); printf("交换前:\n");
printf("a = %d \nb = %d \nc = %d\n",a,b,c); cyclicSwap(&a, &b, &c); printf("交换后:\n");
printf("a = %d \nb = %d \nc = %d",a, b, c); return 0;
} void cyclicSwap(int *a,int *b,int *c)
{
int temp; // 交换
temp = *b;
*b = *a;
*a = *c;
*c = temp;
}

3. 输入输出:

输入 a, b 和 c 的值(逗号分隔): 1,3,5
交换前:
a = 1
b = 3
c = 5
交换后:
a = 5
b = 1
c = 3

【练习54】判断最大值

0. 题目:

计算数组元素平均值

1. 分析:

简单地说,指针就是地址。用 * 来获取指针指向的数据。

​ C语言规定:数组名=数组首元素指针,所以直接可以用数组名的指针 *buf 来访问第一个元素,也可以使用 *(buf+n) 来访问第n个元素。

2. 程序:

#include <stdio.h>
#include <stdlib.h> int main()
{
int i, num;
float *data; printf("输入元素个数(1 ~ 100): ");
scanf("%d", &num); // 为 'num' 元素分配内存
data = (float*) calloc(num, sizeof(float)); if(data == NULL)
{
printf("Error!!! 内存没有分配。");
exit(0);
} printf("\n"); // 用户输入
for(i = 0; i < num; ++i)
{
printf("输入数字 %d: ", i + 1);
scanf("%f", data + i);
} // 循环找出最大值
for(i = 1; i < num; ++i)
{
// 如果需要找出最小值可以将 < 改为 >
if(*data < *(data + i))
*data = *(data + i);
} printf("最大元素 = %.2f", *data); return 0;
}

3. 输入输出:

输入元素个数(1 ~ 100): 5

输入数字 1: 12
输入数字 2: 32
输入数字 3: 6
输入数字 4: 56
输入数字 5: 21
最大元素 = 56.00

4. 解析:

1、*data 等价于 data[0],*data+i 等价于 data[i]。因此 *data = *(data + i) 等价于 data[0] = data[i],执行后 data[0] 的值发生了改变。

2、calloc() 函数用来动态地分配内存空间。calloc(num, size) 在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0。也就是分配了 num*size 个字节长度的内存空间,并且每个字节的值都是0。


【练习55】删除字符串中的特殊字符

0. 题目:

删除字符串中的除字母外的字符。

1. 分析:

字符串的读取(fgets)和输出(puts)。

2. 程序:

#include<stdio.h>

int main()
{
char line[150];
int i, j; printf("输入一个字符串: ");
fgets(line, (sizeof line / sizeof line[0]), stdin); //从指定的流中读取数据,每次读取一行 for(i = 0; line[i] != '\0'; ++i)
{
while (!( (line[i]>='a' && line[i]<='z') || (line[i]>='A' && line[i]<='Z') || line[i] == '\0') )
{
for(j = i; line[j] != '\0'; ++j)
{
line[j] = line[j+1];
}
line[j] = '\0';
}
}
printf("输出: ");
puts(line); // 输出一个字符串
return 0;
}

3. 输入输出:

输入一个字符串: run4#$str123
输出: runstr

4. 解析:

1、fgets(char *str, int n, FILE *stream)函数:从指定的流中读取数据,每次读取一行,并存储在str所指向的字符串内。

2、puts(char *p)函数:将字符串输出到终端,其参数是一个指向字符串的指针p 或其地址函数。puts()函数只能输出一个字符串,字符串中可以包括转义字符。


【练习56】连接字符串

0. 题目:

连接两个字符串。

1. 分析:

使用 strcat() 连接两个字符串。

2. 程序:

#include <stdio.h>
int main()
{
char s1[100], s2[100], i, j; printf("输入第一个字符串: ");
scanf("%s", s1); printf("输入第二个字符串: ");
scanf("%s", s2); // 计算字符串 s1 长度
for(i = 0; s1[i] != '\0'; ++i); for(j = 0; s2[j] != '\0'; ++j, ++i)
{
s1[i] = s2[j];
} s1[i] = '\0';
printf("连接后: %s", s1); return 0;
}

3. 输入输出:

输入第一个字符串: Hello
输入第二个字符串: World!
连接后: HelloWorld!

4. 解析:

strcat(char *dest, const char *src) 函数:把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。注意:src 和 dest 所指内存区域不能重叠,且dest必须有足够的空间来容纳 src 字符串。


【练习57】计算字符串长度

0. 题目:

计算字符串长度。

1. 分析:

使用 strlen() 计算字符串长度。

2. 程序:

#include <stdio.h>
#include <string.h> int main()
{
char str[1000];
int len, i; printf("输入字符串: ");
scanf("%s", str); //使用 strlen() 获得字符串长度
len = strlen(str);
printf(" 1、字符串长度: %d", len); //使用 for 循环获得字符串长度
for(i = 0; str[i] != '\0'; ++i); //注意该循环没有循环体语句 printf("\n 2、字符串长度: %d", i); return 0;
}

3. 输入输出:

输入字符串: goodluck
1、字符串长度: 8
2、字符串长度: 8

4. 解析:

strlen()函数:来求字符串的长度(包含多少个字符)。从字符串的开头位置依次向后计数,直到遇见\0,然后返回计时器的值(长度不包含'\0')。


【练习58】查找字符在字符串中出现的次数

0. 题目:

查找字符在字符串中的起始位置(索引值从 0 开始)。

1. 分析:

使用 for 循环。

2. 程序:

#include <stdio.h>

int main()
{
char str[1000], ch;
int i, frequency = 0; printf("输入字符串: ");
fgets(str, (sizeof(str)/sizeof(str[0])), stdin); printf("输入要查找的字符: ");
scanf("%c",&ch); for(i = 0; str[i] != '\0'; ++i)
{
if(ch == str[i])
++frequency;
} printf("字符 %c 在字符串中出现的次数为 %d", ch, frequency); return 0;
}

3. 输入输出:

输入字符串: goodluck
输入要查找的字符: o
字符 o 在字符串中出现的次数为 2

【练习59】字符串中各种字符计算

0. 题目:

计算字符串中的元音、辅音、数字、空白符。

1. 分析:

使用 if...else if...else...条件分支结构。

2. 程序:

#include <stdio.h>

int main()
{
char line[100];
int i, vowels, consonants, digits, spaces; vowels = consonants = digits = spaces = 0; printf("输入一个字符串: ");
scanf("%[^\n]", line); for(i=0; line[i]!='\0'; ++i)
{
if(line[i]=='a' || line[i]=='e' || line[i]=='i' ||
line[i]=='o' || line[i]=='u' || line[i]=='A' ||
line[i]=='E' || line[i]=='I' || line[i]=='O' ||
line[i]=='U')
{
++vowels;
}
else if((line[i]>='a'&& line[i]<='z') || (line[i]>='A'&& line[i]<='Z'))
{
++consonants;
}
else if(line[i]>='0' && line[i]<='9')
{
++digits;
}
else if (line[i]==' ')
{
++spaces;
}
} printf("元音: %d",vowels);
printf("\n辅音: %d",consonants);
printf("\n数字: %d",digits);
printf("\n空白符: %d", spaces); return 0;
}

3. 输入输出:

输入一个字符串: Simulated annealing algorithm with joint operator.
元音: 18
辅音: 26
数字: 0
空白符: 5

4. 解析:

注意本程序结构中判断元音字符的 if... 与判断辅音字符的 else if... 的次序不能调换。


【练习60】字符串复制

0. 题目:

将一个变量的字符串复制到另外一个变量中。

1. 分析:

使用 strcpy() 复制字符串。

2. 程序:

#include <stdio.h>
#include <string.h> int main()
{
int i;
char inputStr[80], copyStr1[80], copyStr2[80]; printf("输入字符串: ");
scanf("%s",inputStr);
printf("输入的字符串是:%s\n", inputStr); // memset(dest, '\0', sizeof(dest));
strcpy(copyStr1, inputStr);
printf("1、复制的字符串:%s\n", copyStr1); for(i = 0; inputStr[i] != '\0'; ++i)
{
copyStr2[i] = inputStr[i];
}
copyStr2[i] = '\0';
printf("2、复制的字符串: %s", copyStr2); return(0);
}

3. 输入输出:

输入字符串: Neural Network
输入的字符串是:Neural
1、复制的字符串:Neural
2、复制的字符串:Neural

4. 解析:

strcpy(char* dest, char* src) 函数:把 src 所指向的字符串复制到 dest。注意的是如果目标数组 dest 不够大,而源字符串 src 的长度又太长,可能会造成缓冲溢出的情况。


版权说明:

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

C语言编程 菜鸟练习100题(51-60)的更多相关文章

  1. C语言编程 菜鸟练习100题(21-30)

    [练习21]计算自然数的和 0. 题目: 计算自然数的和 1. 分析: 练习使用 for 循环结构.for 循环允许一个执行指定次数的循环控制结构. 2. 程序: #include <stdio ...

  2. C语言编程 菜鸟练习100题(31-40)

    [练习31]判断质数 0. 题目: 判断质数 1. 分析: 质数(prime number),指大于 1的.且除 1 和本身以外没有其他因数的自然数. 2. 程序: #include <stdi ...

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

    [练习41]字符串翻转 0. 题目: 字符串翻转 1. 分析: 学习递归思想和方法. 2. 程序: 方法一: #include <stdio.h> void reverseSentence ...

  4. C语言编程 菜鸟练习100题(11-20)

    [练习11]计算 int, float, double 和 char 字节大小 0. 题目: 计算 int, float, double 和 char 字节大小 1. 分析: 使用 sizeof 操作 ...

  5. C语言编程 菜鸟练习100题(01-10)

    [练习1]输出 "Hello, World!" 0. 题目: 输出 "Hello, World!" 1. 分析: 使用 printf() 输出 "He ...

  6. C语言编程学习打造——做题游戏

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  7. 数据结构+算法面试100题~~~摘自CSDN

    数据结构+算法面试100题~~~摘自CSDN,作者July 1.把二元查找树转变成排序的双向链表(树) 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调 ...

  8. Go面试题精编100题

    Golang精编100题 选择题 1.   [初级]下面属于关键字的是()A. funcB. defC. structD. class 参考答案:AC 2.   [初级]定义一个包内全局字符串变量,下 ...

  9. 华为C语言编程规范

    DKBA华为技术有限公司内部技术规范DKBA 2826-2011.5C语言编程规范2011年5月9日发布 2011年5月9日实施华为技术有限公司Huawei Technologies Co., Ltd ...

随机推荐

  1. try - with - resource

    本文详细介绍了自 JDK 7 引入的 try-with-resources 语句的原理和用法,以及介绍了 JDK 9 对 try-with-resources 的改进,使得用户可以更加方便.简洁的使用 ...

  2. Day13_70_join()

    join() 方法 * 合并线程 join()线程合并方法出现在哪,就会和哪个线程合并 (此处是thread和主线程合并), * 合并之后变成了单线程,主线程需要等thread线程执行完毕后再执行,两 ...

  3. .Net之Docker部署详细流程

    开篇语 自己从头开始走一遍docker部署.net的流程,作为一种学习总结,以及后续会写一些在该基础之上的文章. 本次示例环境:vs2019.net5.docker.postman 创建项目 本次事例 ...

  4. 深度解析Django REST Framework 批量操作

    我们都知道Django rest framework这个库,默认只支持批量查看,不支持批量更新(局部或整体)和批量删除. 下面我们来讨论这个问题,看看如何实现批量更新和删除操作. DRF基本情况 我们 ...

  5. Ubuntu20.04安装MongoDB

    本教程描述了如何在Ubuntu20.04上安装MongoDB4.4 安装MongoDB Ubuntu 20.04默认存储库中不提供最新版本的MongoDB,因此需要在系统中添加官方的MongoDB存储 ...

  6. .NET 中的 Worker Service 入门介绍

    翻译自 Steve Gordon 2020年3月30日的文章 <WHAT ARE .NET WORKER SERVICES?> [1] 随着 .NET Core 3.0 的发布,ASP.N ...

  7. 软件篇-03-基于ORB_SLAM2手写SLAM稠密地图构建实现

    本文使用的方法不是从内部修改ORBSLAM2源码以获取稠密点云,而是先从ZED2 sdk获取以摄像头坐标系为描述的三维点云/作为点云地图的一个子集,然后融合IMU与ORB_SLAM2进行实时定位,通过 ...

  8. php、jsp、asp和aspx的区别

    目录 PHP JSP ASP ASP.NET PHP PHP是一种跨平台的服务器端的嵌入式脚本语言.它大量地借用C.Java 和 Perl 语言的语法,并耦合PHP自己的特性,使WEB开发者能够快速地 ...

  9. [CTF]培根密码

    [CTF]培根密码 ---------------------  作者:adversity`  来源:CSDN  原文:https://blog.csdn.net/qq_40836553/articl ...

  10. 【python】Leetcode每日一题-丑数2

    [python]Leetcode每日一题-丑数2 [题目描述] 给你一个整数 n ,请你找出并返回第 n 个 丑数 . 丑数 就是只包含质因数 2.3 和/或 5 的正整数. 示例1: 输入:n = ...