【练习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. 【笔记】《Redis设计与实现》chapter18 发布与订阅

    chapter18 发布与订阅 客户端订阅频道. 客户端向频道发送消息, 消息被传递至各个订阅者. 匹配模式 客户端订阅模式. 客户端向频道发送消息, 消息被传递给正在订阅匹配模式的订阅者. 另一个模 ...

  2. Spring Boot超简单的测试类demo

    1 概述 Spring Boot结合Junit的简单测试类demo,流程是先引入依赖,接着编写测试类测试运行即可. 2 依赖 <dependency> <groupId>org ...

  3. JAVAEE_Servlet_02_Servlet接口实现类HttpServlet

    Servlet接口实现类 * Servlet接口: Servlet接口是来自于Servlet规范下的一个接口,存在于HTTP服务器(Tomcat)所提供的jar包中.Servlet-api.jar. ...

  4. 页面元素定位 - XPath

    1. XPath 简介 2. 选取节点 2.1 选取节点表达式 2.2 XPath 运算符 2.3 XPath 常用函数 2.4 亲属关系匹配 2.5 *综合示例 1. XPath 简介 什么是 XP ...

  5. Docker笔记(一) 基础知识

    官方文档地址:https://www.docker.com/get-started 中文参考手册:https://docker_practice.gitee.io/zh-cn 笔记原作者:陈艳男 B站 ...

  6. hdu2371 矩阵乘法(求序列位置改变m次后的序列)

    题意:       给你一个字符串,然后让你执行m次操作,每次操作把当前的字符串映射到他给你的位置序列的位置,比如给的是 3 1 2,第一步就是把原来的3的位置的字母变到1的位置,1的变到2的位置,2 ...

  7. C#-获取CPUID

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  8. 前端小白的学习之路html与css的较量【一】

    html和css的较量 web结构的组成 html标签规则 快速生成一个html html的基本结构 标签的关系 标签 标题标签 段落 图片 超链接 a 属性 a标签里面的值 字符实体 新增的标签 1 ...

  9. base标签的作用

    base标签可以自定义当前页面的相对路径,不受浏览器当前地址栏的影响,以base标签定义的地址为准 (只对相对路径起作用) <head> <meta charset="UT ...

  10. Lombok Requires Annotation Processing Annotation processing seems to be disabled for the project "HelloWorld". For  plugin to function correctly, please enable it under "Settings > Build > Compiler >

    更多精彩详见微信公众号  在网上查找说是插件的问题,但是我安装类插件父级项目没有开启注解处理Annotation Processor,子项目都有开启,如图,顶级项目是demo,下面的都是子项目,把第一 ...