
假设有10个数据需要输入,你可以:
-设一个循环输入这10个数据:int a[10],i; for ( i=0;i<10;i++ ) scanf("%d",&a[i]);
-在写程序时写入数值初值:int a[10]={ 1,2,3,4,5,6,7,8,9,10 };
-将数据保存在文件中,程序读出:这个程序稍微复杂,这里就不写了,如有兴趣可追问
-在程序中赋值:int a[10],i; for ( i=0;i<10;i++ ) a[i]=i;
这种行为最好不要用组合电路写,而且start还是高电平有效,任何一点噪音都会容易使低电平变成高电平,如果一定是用组合电路建议默认值用高电平,低电平start有效。其次因为总是会start,所以先要查data的变化情况,如果data是稳定的应该不会出现上面的情况;最后是按键防抖动问题。
#include <stdioh>
void fun(int s[], int p1, int p2, int n);
int main()
{
void fun(int s[], int p1, int p2, int n);
int a[3], i, max, min;
for (i = 0; i < 3; i++)
scanf("%d", &a[i]);
fun(a, &max, &min, 3);
printf("max=%d,min=%d\n", max, min);
}
void fun(int s[], int p1, int p2, int n)
{
int i;
p1 = s[0], p2 = s[0];
for (i = 1; i < n; i++)
{
if (p1 < s[i])
p1 = s[i];
if (p2 > s[i])
p2 = s[i];
}
}
第一,你手残或眼残,scanf里面,输入项是地址,应该是&a而不是a
第二,依旧你眼残或手残,那两个if里面,自己看去看看应该是=还是==。你丫敲的是=,赋值!
赋值表达式返回值是赋进去的值,而if判断的是逻辑真假。只要不是0都认为是真
第三,终于不是眼残手残了,是逻辑思维神经发育程度低下。
明显是不是1也不是2才说不是1或2,你逻辑结构怎么做的?
if(a==1)
说是1
if9a==2)
说是2;
else
//这个else是对哪个if的否定?代表的是什么含义?
说不是1或2;
if(a==1)
说是1
else
if(a==2)
说是2
else
说不是1或2
这样的的结构才对
或者
ifa==1)
……
if(a==2)
……
if(a<1||a>2)
……
还有,你说进入2次循环?你哪只眼看到代码里有循环的?
程序本身没有问题,是包导入的问题,就是说你的类库里面没有Scanner这个类,所以导的时候会报不能解析的错。还有关于lz的“类不是自己定义的吗?”这个问题,的确有许多类是自己定义的,但是有许多常用的类或比较底层的类java类库里已经定义好了,直接用就可以,就比如说你导用的这个Scanner类,用于控制台数据的输入,就不用自己在写了。其实java的几个版本的更新也貌似多是更新类库。具体解决办法按照6楼的方法试一试,看可以不可以。
getdata调用,传入变量a的地址
p保存主程序中变量a地址
p->s即as,p->t即at,在getdata中用scanf输入并存放到变量a的结构中
然后输出a结果中的两个变量的值(getdata函数中输入的)
如果不用getdata调用可以替换成:scanf("%s %d",as,&at);
multiplication()函数的最后一句last = i - 1;应改为arr[0] = i - 1;
因为last是临时变量,改动它没有意义,赋值到arr[0]上才能真正保存结果
不过虽然你的程序实现了一个大数与一个整数n相乘
但是最后两个大数a[]和b[]相乘的实现逻辑是有问题的
根据竖式乘法的过程,a[]和b[]相乘的流程应为:
a[]b[1]+a[]b[2]10+a[]b[3]100+
而你的实现是:a[]b[1]b[2]b[3],显然是不对的
因此改动如下:新定义shiftBits()函数实现a[]10^k,即将数组[]右移k位
新定义add()函数实现a[]和b[]相加~最终的代码为:
运行结果为:
可见成功输出了两个大数相乘的结果~
附修改后的源码:
#include <stdioh>
#include <stringh>
#define MAXSIZE 100
void preserve(int arr[], long long num) { // 大数转为数组
int i = 1;
do {
arr[i++] = num % 10;
num /= 10;
} while (num > 0);
arr[0] = i - 1;
}
void processCarry(int arr[]) { // 进位处理
int i;
for (i = 1; i <= arr[0] || arr[i] != 0; i++) {
arr[i + 1] += arr[i] / 10;
arr[i] %= 10;
}
arr[0] = i - 1; // 可能进位,更新位数
}
void shiftBits(int arr[], int res[], int k) { // arr[]依次右移k位
int i;
for (i = 1; i <= arr[0]; i++)
res[i + k] = arr[i];
res[0] = arr[0] + k;
}
void add(int a[], int b[]) { // 两个大数相加,结果保存在a[]中
int i;
a[0] = a[0] > b[0] a[0] : b[0];
for (i = 1; i <= a[0]; i++)
a[i] += b[i];
processCarry(a);
}
void multiplication(int a[], int b[]) { // 两个大数相乘,结果保存在a[]中
int i, j;
int tmp[MAXSIZE] = {0}, res[MAXSIZE] = {0}; // tmp为每位乘积结果,res为加和结果
for (i = 1; i <= b[0]; i++) { // b[i]逐位与a[]相乘
memset(tmp, 0, MAXSIZE);
shiftBits(a, tmp, i - 1); // 先将a[]右移i-1位到tmp[]
for (j = 1; j <= tmp[0]; j++) // 再逐位乘以b[i]
tmp[j] = b[i];
add(res, tmp);
}
for (i = 0; i <= res[0]; i++) // 最后将res[]复制到a[]
a[i] = res[i];
}
int main() {
long long i, a, b;
int m[MAXSIZE] = {0}, n[MAXSIZE] = {0};
printf("请输入两个大数: ");
scanf("%lld %lld", &a, &b);
preserve(m, a);
preserve(n, b);
multiplication(m, n);
for (i = m[0]; i >= 1; i--)
printf("%d", m[i]);
return 0;
}
以上就是关于c语言程序中输入的问题全部的内容,包括:c语言程序中输入的问题、Verilog程序中碰到的问题、求教大佬帮忙看一下我写的C语言程序中问题在哪里等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)