苏州大学c语言作业


知识点

  1. 实参和其对应的形参各占用独立的存储单元
  2. c语言允许函数值类型缺省定义,此时函数值隐含的类型是int
  3. C语言文件存取方式:顺序存取,随机存取均可
  4. C语言能识别处理的文件为文本文件和二进制文件
  5. 系统的标准输入文件为键盘
  6. typedef不能增加新类型。其用于为已存在的数据类型创建一个新的名称(别名)。它本身并不创建新的数据类型,而是为现有的类型提供一个更容易理解或更简洁的名称。
  7. 单引号只能引用一个字符常量,双引号可以引用多个,算字符串。整数可以被类型转化为字符型。
  8. 宏定义的时候要考虑后面有没有分号,带入的时候是整体带入。
  9. 在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]
基于matlab建模FOC观测器采用龙贝格观测器+PLL进行无传感器控制(Simulink仿真实现)内容概要:本文档主要介绍基于Matlab/Simulink平台实现的多种科研仿真项目,涵盖电机控制、无人机路径规划、电力系统优化、信号处理、图像处理、故障诊断等多个领域。重点内容之一是“基于Matlab建模FOC观测器,采用龙贝格观测器+PLL进行无传感器控制”的Simulink仿真实现,该方法通过状态观测器估算电机转子位置与速度,结合锁相环(PLL)实现精确控制,适用于永磁同步电机等无位置传感器驱动场景。文档还列举了大量相关科研案例与算法实现,如卡尔曼滤波、粒子群优化、深度学习、多智能体协同等,展示了Matlab在工程仿真与算法验证中的广泛应用。; 适合人群:具备一定Matlab编程基础,从事自动化、电气工程、控制科学、机器人、电力电子等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①学习并掌握FOC矢量控制中无传感器控制的核心原理与实现方法;②理解龙贝格观测器与PLL在状态估计中的作用与仿真建模技巧;③借鉴文中丰富的Matlab/Simulink案例,开展科研复现、算法优化或课程设计;④应用于电机驱动系统、无人机控制、智能电网等实际工程仿真项目。; 阅读建议:建议结合Simulink模型与代码进行实践操作,重点关注观测器设计、参数整定与仿真验证流程。对于复杂算法部分,可先从基础案例入手,逐步深入原理分析与模型改进。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值