知识点
- 实参和其对应的形参各占用独立的存储单元
- c语言允许函数值类型缺省定义,此时函数值隐含的类型是int
- C语言文件存取方式:顺序存取,随机存取均可
- C语言能识别处理的文件为文本文件和二进制文件
- 系统的标准输入文件为键盘
- typedef不能增加新类型。其用于为已存在的数据类型创建一个新的名称(别名)。它本身并不创建新的数据类型,而是为现有的类型提供一个更容易理解或更简洁的名称。
- 单引号只能引用一个字符常量,双引号可以引用多个,算字符串。整数可以被类型转化为字符型。
- 宏定义的时候要考虑后面有没有分号,带入的时候是整体带入。
- 在C/C++语言中,变量做实参时,它和对应形参之间的数据传递方式是单向值传送
一、选择填空
1.结构体引用

引用有两种方式,要么用点,要么用箭头。
D
2.函数返回值

没有return语句,它的返回值是未定义的。这意味着函数可能会返回任意的值,包括垃圾值。
B
3.函数调用

整型数据和字符型数据可以通用,整型变量和浮点型变量的赋值相互兼容。
D
4.逗号操作符

返回值是逗号表达式,虽然这里写的像坐标点
最终只会返回最后一个表达式的值
B
5.函数体内外的参数

输出结果为21
在函数体内部操作a不影响外面的a
6.函数调用(传入参数)

7.引用
以下代码输出结果:
#include<iostream>
using namespace std;
int main(){
int x=50,&y=x;
x=100;
cout<<y<<endl;
}
在这段代码中,y 是一个指向 x 的引用。因此,无论你改变 x 的值,y 的值都会随之改变,因为它们指向同一个内存位置。所以,当你将 x 的值改变为 100 后,y 的值也会变为 100。
故输出结果为100.
8.
二、编程
1.进制转化
编写程序,输入整数m,n,将m转成n(2<=n<16)进制整数并输出。若有英文字母,则一律输出大写字母形式。
【注意】输入和输出各占一行;运行效果应如下所示(第1行为输入,数据间用半角空格分隔,第2行为输出),格式错误算结果错误。
30 16
1E
#include"stdio.h"
int main(){
int i,m,n,t=1,res,flag=0;
int a[10];
scanf("%d%d",&m,&n);
while(t>0){
res=m%n;
t=m/n;
m=t;
a[flag]=res;
flag++;
}
for(i=flag-1;i>=0;i--){
//用字母表示时用字符型输出,可以通过ASCIL码值来输出
if(a[i]>=10){
printf("%c",'A'+a[i]-10);
}else{
printf("%d",a[i]);
}
}
}
2.去除重复数据
编写一个程序,输入10个含重复数据整数,去掉重复的数据并按原顺序输出。
【注意】输入和输出各占一行;运行效果应如下所示(第1行为输入,数据间用半角空格分隔,第2行为输出),格式错误算结果错误。
1 6 5 6 7 6 7 7 4 3
1 6 5 7 4 3
my code:
#include"stdio.h"
int main(){
int n=10,flag=0;
int size=10;
int a[size];
int i,j,t;
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n-1;i++){
//flag=0;
j=i+1;
while(j<n){
//在这里出了问题,因为在进行操作时,不是每一次j都要递增。如果对数组长度进行缩小处理,就没有必要递增,因为n减小了。
if(a[i]==a[j]){
for(t=j;t<n-1;t++){
a[t]=a[t+1];
}
n--;
j=j;
}else{
j++;
}
}
}
//数组元素的删除逻辑:把其中要删除的元素之后的部分全部向前移动,然后缩短数组长度。
for(i=0;i<n;i++){
printf("%d ",a[i]);
}
}
#include <stdio.h>
int main() {
int input[10];
int unique[10];
int size = 0;
// 输入10个整数
printf("请输入10个整数(可能包含重复数据):\n");
for (int i = 0; i < 10; i++) {
scanf("%d", &input[i]);
// 检查是否为重复数据
int isDuplicate = 0;
for (int j = 0; j < size; j++) {
//此处是与unique数组里面的数字逐一进行比较,如果是一样的,结束比较,该数字不能被放入unique数组里,不一样就放进去
if (input[i] == unique[j]) {
isDuplicate = 1;
break;
}
}
// 如果不是重复数据,添加到unique数组中
if (!isDuplicate) {
//注意这里是非isDuplicate不等于0,即isDuplicate==0
unique[size] = input[i]; //开始的时候unique里面没有给值,所以第一个输入的数一定会放入unique里面
size++;
}
}
// 输出去重后的结果
printf("去重后的结果为:\n");
for (int i = 0; i < size; i++) {
printf("%d ", unique[i]);
}
printf("\n");
return 0;
}
3. 字符串转化
编写程序,输入一个长度小于1000的字符串s1,再输入一个待查找的字符串s2和一个替换的字符串s3,将原始字符串中所有出现的待查找字符串s2替换成s3,输出查找到的次数及替换后的字符串s1。要求必须要用字符数组处理字符串。
运行效果应如下所示,格式错误算结果错误。
测试1:(第1、2、3行为输入,第4、5行为输出)
hello,Jack!. hello Mary!
hello
#include <stdio.h>
#include <string.h>
// 函数:replaceString
// 功能:在字符串str中查找并替换所有的find字符串为replace字符串,同时统计替换次数
void replaceString(char *str, const char *find, const char *replace, int *count) {
int findLen = strlen(find); // 获取待查找字符串的长度
int replaceLen = strlen(replace); // 获取替换字符串的长度
int strLen = strlen(str); // 获取原始字符串的长度
char result[1000] = ""; // 存储替换后的结果字符串
int index = 0; // 结果字符串的索引
*count = 0; // 初始化替换次数为0
for (int i = 0; i < strLen; i++) {
if (strncmp(&str[i], find, findLen) == 0) {
// 检测是否匹配待查找字符串,&str[i]表示从i开始返回的子字符串
strcat(result, replace); // 执行替换操作
index += replaceLen;
i += findLen - 1; // 更新索引位置
(*count)++; // 替换次数加一
} else {
result[index] = str[i]; // 将当前字符复制到结果字符串中
index++;
}
}
strcpy(str, result); // 将替换后的结果复制回原始字符串
}
int main() {
char s1[1000];
char s2[100];
char s3[100];
int count = 0;
printf("请输入一个长度小于1000的字符串s1:");
scanf("%s", s1);
printf("请输入待查找的字符串s2:");
scanf("%s", s2);
printf("请输入替换的字符串s3:");
scanf("%s", s3);
replaceString(s1, s2, s3, &count); // 调用替换函数
printf("查找到的次数:%d\n", count);
printf("替换后的字符串s1:%s\n", s1);
return 0;
}
另:全部在主函数里完成
#include"stdio.h"
#include"string.h"
int main(){
char str[1000];
char find[1000];//wait to searc
char replace[1000];//replace
char result[1000]="";
gets(str);
gets(find);
gets(replace);
int findLen = strlen(find);
int replaceLen = strlen(replace);
int strLen = strlen(str);
int i,index=0,count=0;
for(i=0;i<strLen;i++){
if(strncmp(&str[i],find,findLen)==0){
strcat(result,replace);
index=index+replaceLen;
i=i+findLen-1;
count++;
}else{
result[index]=str[i];
index++;
}
}
strcpy(str, result);
printf("%d\n",count);
printf("%s",result);
}
4.数据排列
有一个非负整数数组。现要把数组中的元素重新排列组合成一个最大的数。每个数不可拆分。
例如, 数组元素有3,30,34,5,9, 重新组合后的最大值为9534330。
编写程序,输入一个正整数n(2<=n<=10),再输入n个非负整数,计算并输出拼接后的最大数。
运行效果应如下所示,格式错误算结果错误。
测试1:(第1、2行为输入,第3行为输出)
5
3 30 34 5 9
9534330
错误代码:
以下只完成了每输入一个数就和前面一个链接,然后比较最大值,但实际上把数据变成字符串,顺序不一定是输入的顺序。
#include"stdio.h"
#include"string.h"
#include <stdlib.h>
int main(){
int x,n;
scanf("%d",&n);
int i,cnt=0;
int x0,num1,num2;
char str1[100];
char str2[100];
scanf("%d",&x0);
for(i=0;i<n-1;i++){
scanf("%d",&x);
sprintf(str1,"%d%d",x0,x);
sprintf(str2,"%d%d",x,x0);
num1 = atoi(str1);
num2 = atoi(str2);
if(num1>=num2){
x0=num1;
}else{
x0=num2;
}
}
if(num1>=num2){
printf("%d",num1);
}else{
printf("%d",num2);
}
}
5. 回文字符串(中文输出)
输入一个长度小于100的全中文字符串,判断它是否是回文,若是则输出“Yes”,否则输出“No”。
所谓回文即正序和逆序内容相同的字符串。
运行效果应如下所示,格式错误算结果错误。
测试1:(第一行为输入,第2行为输出)
上海自来水来自海上
Yes
测试2:(第一行为输入,第2行为输出)
上海自来水
No
//不知道为什么过不了测试
#include"stdio.h"
#include"string.h"
#include <wchar.h>
#include <locale.h>
int main(){
//setlocale(LC_ALL, "zh_CN.UTF-8");
setlocale(LC_ALL, ""); // 设置本地化环境为用户的默认环境
wchar_t str[100];
wchar_t opp[100] = L"";
fgetws(str,100,stdin);
str[wcslen(str) - 1] = L'\0';
int i,j=0,flag=1;
i=wcslen(str)-1;
while(i>=0){
opp[j]=str[i];
i--;
j++;
}
opp[j] = L'\0';
int k=0;
while(k<wcslen(str)){
if(opp[k]!=str[k]){
flag=0;
break;
}
k++;
}
if(flag==1){
printf("Yes");
}else{
printf("No");
}
}
6.矩阵按行和排序
输入一个矩阵,以它每一行的和的大小升序排列
#include <stdio.h>
int main(){
int row,col,sum;
scanf("%d%d",&row,&col);
int i,j,k,temp;
int a[row][col];
int S[row];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
scanf("%d", &a[i][j]);
}
}
//计算每一行的和
for(i=0;i<row;i++){
sum=0;
for(j=0;j<col;j++){
sum=sum+a[i][j];
}
S[i]=sum;
}
//冒泡排序,并交换行数
for(i=0;i<row;i++){
for(j=i+1;j<row;j++){
if(S[i]>S[j]){
temp=S[i];
S[i]=S[j];
S[j]=temp;
for(k=0;k<col;k++){
//在行一定的情况下,依次遍历列,然后交换
temp=a[i][k]

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



